多服务支持

截至到目前,我们用的都是http方式,那么问题来了,直接用http不就完了吗?concrete有什么用?

我们本节来回答这个问题。

同样的服务,我们新建一个amqp broker发布的应用。

在demo-boot里增加依赖

        <!-- 使用 amqp broker 发布concrete服务-->
        <dependency>
            <groupId>org.coodex</groupId>
            <artifactId>concrete-spring-boot-amqp</artifactId>
        </dependency>
        <!-- 调用amqp发布的concrete服务 -->
        <dependency>
            <groupId>org.coodex</groupId>
            <artifactId>concrete-amqp-client</artifactId>
            <scope>test</scope>
        </dependency>

DemoBootStarter里增加如下代码

// 启用concrete amqp
@EnableConcreteAMQP(
        servicePackages = "org.coodex.concrete.demo.**.api"
)

Note

同前面的@EnableConcreteJAXRS一样,@EnableConcreteAMQP是快捷发布amqp service的注解,属性说明如下:

  • servicePackages: String[], 扫描concreteServices的包,默认使用Configuration命名空间concrete/amqp/当前appSet下的api.packages,如果为空,则使用Configuration命名空间concrete/当前appSet下的api.packages
  • classes: Class<?>[], 额外需要注册的类,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.classes
  • location: String, amqp broker的uri,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.location
  • host: String, amqp broker的host,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.host
  • port: int, amqp broker的port,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.port
  • virtualHost: String, amqp broker的virtualHost,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.virtualHost
  • username: String, 登录amqp broker的username,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.username
  • password: String, 登录amqp broker的password,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.password
  • exchangeName: String, 发布到amqp broker的交换机名称,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.exchangeName
  • queueName: String, 发布到amqp broker使用的队列名,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.queueName
  • ttl: long, 消息的ttl,单位为毫秒,默认使用Configuration命名空间concrete/amqp/当前appSet下的amqp.ttl

resources里增加一个Profile concrete.amqp.yml

amqp:
  location: ${env:amqp.url}
  username: ${env:amqp.username}
  password: ${env:amqp.password}
  ttl: 600000

Note

这里注意一下,${env:amqp.url},是一个Profile的PlaceHolder方式,意指这个属性的值等同于env这个Profileamqp.url属性,因为每个人的开发体验环境都不一样,所以env.yml没有传上来,需要进行体验的直接用具体值替代即可

这样就能跑起来了。

我们新建一个client来调用一下

package org.coodex.concrete.demo.client;

import org.coodex.concrete.Client;
import org.coodex.concrete.demo.api.SubjoinExampleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AMQPClientDemo1 {
    private final static Logger log = LoggerFactory.getLogger(AMQPClientDemo1.class);

    public static void main(String[] args) {
        log.info("amqp service invoked: {}",
                Client.getInstance(SubjoinExampleService.class, "amqp").add(11, 12));
    }
}

一个client destination文件client.amqp.yml

location: ${env:amqp.url}
amqp:
  username: ${env:amqp.username}
  password: ${env:amqp.password}
  ttl: 600000
timeout: 10000

显示调用信息,在concrete.yml里增加

amqp:
  logger:
    level:
      server: info #默认不开启,生产环境不建议开启
      client: info #默认DEBUG

客户端的输出,可以看到,我们通过amqp broker成功完成了调用

19:38:07.944 [pool-2-thread-4] INFO org.coodex.concrete.client.amqp.AMQPInvoker - consumerTag: amq.ctag-C7gK24ogDla6weALFzQ1cA, envelope: response.b86e7702bbac4bbcaf3d45e9388df9c4
19:38:07.977 [pool-2-thread-4] INFO org.coodex.concrete.client.amqp.AMQPInvoker - message received: {"content":23,"msgId":"e80a285309fb4144a2fe01116bdf2f5b","ok":true,"subjoin":{"CONCRETE-WARNINGS":"[{\"code\":105001,\"message\":\"11 + 12 太难了 >_< (demoErrorCodes)\"}]"}}
19:38:07.993 [pool-2-thread-4] DEBUG org.coodex.util.ServiceLoaderImpl - no ServiceProvider found for [org.coodex.concrete.client.WarningHandle], using default provider.
19:38:07.994 [main] INFO org.coodex.concrete.demo.client.AMQPClientDemo1 - amqp service invoked: 23

我们看到有一条:no ServiceProvider found for [org.coodex.concrete.client.WarningHandle], using default provider.的信息,提示我们没有WarningHandle还处理Java client收到的警告信息,当你需要处理服务端返回的警告信息时,只需要实现一个org.coodex.concrete.client.WarningHandle放到SPI中即可。

(ɔ) coodex.org 2016 - 2020            修订时间: 2020-03-09 02:56:37

results matching ""

    No results matching ""