这里主要演示一下bus做为消息总线,配合config刷新config server的功能。之前弄过的手动刷新config server,是单机的环境,对于config server为一个集群的情况,显然挨个去刷新太蠢了…配合bus,config可以做到批量刷新。
注意,需要有rabbitMQ或者kafka的环境。rabbitMQ依赖于erlang的环境。
1,引入bus依赖
对于rabbitMQ和kafka,bus有不同的依赖。引入消息队列,可以让bus通过MQ去发送消息给config server集群,从而达到批量刷新的目的。
<dependencies>
<!-- spring boot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--bus,amqp是对RabbitMQ做适配的。kafka是另外一个配置kafka,如下-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--bus,对kafka的适配-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-bus-kafka</artifactId>-->
<!-- </dependency>-->
</dependencies>
2,部分配置
这里的配置是相比普通的注册到eureka的config server或者client多出来的配置,其他的配置和它们是一样的。
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
注意1,这个配置是config server和config client都要加上去的。
注意2,如果使用的是kafka,不仅依赖要变,配置也要变。
注意3,如果同时引入了rabbitMQ和kafka,在启动的时候会报binder相关的异常,这是因为有2个mq不知道该用哪个。在client的配置里指定默认mq即可。
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
cloud:
stream:
#同时引入了rabbit和kafka,需要在配置文件中指定默认的binder,否则会在启动时报错,有两个可用的binder,找不到默认使用的binder
default-binder: rabbit
配置到这里基本就结束了,bus对于项目基本没有侵入性,引入就可以使用。
3,启动rabbitMQ
cd到rabbit的bin目录,并在命令行里输入,启动rabbitMQ,可以看到管理页面
net start RabbitMQ
4,查看config server暴露出来的端点并调用bus批量刷新端点
http://localhost:xxx/actuator
可以看到里面会有一个bus-refresh。以post形式去调用这个端点,就可以做到批量刷新config server的目的。
localhost:xxx/actuator/bus-refresh
不过之前碰到的单节点config无法刷新的问题,依然会导致这里刷新失败(端点可以调用,返回为空。但是刷新没有效果)。很郁闷。