Spring Cloud Bus 消息总线 RabbitMQ

Spring Cloud Bus将分布式系统中各节点通过轻量级消息代理连接起来。 从而实现例如广播状态改变(例如配置改变)或其他的管理指令。 目前唯一的实现是使用AMQP代理作为传输对象。

Spring Cloud Bus又被称为消息总线,负责管理和传播所有分布式系统中的消息,通过集成MQ实现广播机制,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景。及利用消息总线,可以实现当配置中心的refresh命令触发后,通过广播发送到每一个配置使用端。 

Spring已经在Config包中完成了大部分的工作,我们只需要在之前的配置中心的基础上,做如下修改:

1.给config-server和config-client增加依赖:

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2.给config-server和config-client配置文件中增加MQ

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=lg
spring.rabbitmq.password=lg

3.依次启动RabbitMQ 、 Eureka 、config-server 、config-client1、config-client2

4.在github上修改配置文件,刷新config-client查看配置,此时未更新

然后执行 curl -X POST http://localhost:8011/bus/refresh 后,再次查看config-client配置,此时已经更新 

5.登录RabbitMQ 管理页面,可查看到connecting,queue等信息。

 

有时候可能需要部分刷新,即只刷新指定的config-client,spring同样支持,只需要在调用/bus/refresh接口时传递destination参数即可,如:

/bus/refresh?destination=config-client:8031 或 /bus/refresh?destination=config-client:**

 

自定义消息并通过消息总线发送

在之前几个项目的基础上,我们做如下修改:

1.config-server类增加Sender类

@Component
public class Sender {

    private static AtomicInteger count = new AtomicInteger(1);

    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send() {
        String msg = "msg" + count.getAndIncrement() + " " + new Date();
        System.out.println("Sender : " + msg);
        this.rabbitTemplate.convertAndSend("hello", msg);
    }
}

 

2.config-server类增加定时任务,给主类加注解@EnableScheduling,每3秒发一次消息:

@Component
public class ScheduledTasks {

    @Autowired
    private Sender sender;

    @Scheduled(initiaDelay=5000, fixedRate = 3000)
    public void reportCurrentTime() {
        sender.send();
    }

}

 

3.分别给config-client1和config-client2增加接受类Receiver

@Component
@RabbitListener(queues = "hello")
public class Receiver {

    @RabbitHandler
    public void process(String msg) {
        System.out.println("Receiver : " + msg);
    }

}

 

4.依次启动 eureka config-server config-client

5.观察控制台输出如下:

config-server:

Sender : msg1 Sun Aug 06 21:56:03 CST 2017
Sender : msg2 Sun Aug 06 21:56:06 CST 2017
Sender : msg3 Sun Aug 06 21:56:09 CST 2017
Sender : msg4 Sun Aug 06 21:56:12 CST 2017
Sender : msg5 Sun Aug 06 21:56:15 CST 2017
Sender : msg6 Sun Aug 06 21:56:18 CST 2017
Sender : msg7 Sun Aug 06 21:56:21 CST 2017
Sender : msg8 Sun Aug 06 21:56:24 CST 2017
Sender : msg9 Sun Aug 06 21:56:27 CST 2017

config-client1:

Receiver : msg2 Sun Aug 06 21:56:06 CST 2017
Receiver : msg4 Sun Aug 06 21:56:12 CST 2017
Receiver : msg6 Sun Aug 06 21:56:18 CST 2017
Receiver : msg8 Sun Aug 06 21:56:24 CST 2017

config-client2:

Receiver : msg1 Sun Aug 06 21:56:03 CST 2017
Receiver : msg3 Sun Aug 06 21:56:09 CST 2017
Receiver : msg5 Sun Aug 06 21:56:15 CST 2017
Receiver : msg7 Sun Aug 06 21:56:21 CST 2017
Receiver : msg9 Sun Aug 06 21:56:27 CST 2017

可见client从单个queue中依次取消息

 

 

参考:http://projects.spring.io/spring-cloud/spring-cloud.html 

 

end

posted @ 2017-08-05 22:25  dahuandahuan  阅读(1667)  评论(0编辑  收藏  举报