在上篇中介绍了SpringCloud Config的使用,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的分布式配置中心(SpringCloud Config)的配置刷新和消息总线(RabbitMQ和Kafka)使用教程。html
在上一篇中咱们介绍了springcloud配置中心的本地使用和Git使用的用法,可是当从新修改配置文件提交后,客户端获取的仍然是修改前的信息,须要客户端重启才能够获取最新的信息。所以咱们须要客户端可以动态进行更新,幸亏springcloud官方已经给出方案,因此咱们只须要使用就好了。git
开发环境github
注:不必定非要用上述的版本,能够根据状况进行相应的调整。须要注意的是SpringBoot2.x之后,jdk的版本必须是1.8以上!web
确认了开发环境以后,咱们再来添加相关的pom依赖。spring
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
服务端以及注册中心这块配置和代码和以前springcloud-config配置基本同样便可。注册中心新项目的的名称为springcloud-config-bus-eureka
,服务端新项目的的名称为springcloud-config-bus-server
。bootstrap
注册中心pom
配置、application.properties
配置和代码以下:浏览器
pom:springboot
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.properties:app
spring.application.name=springcloud-config-bus-eureka server.port=8006 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
代码:分布式
@SpringBootApplication @EnableEurekaServer public class ConfigBusEurekaApplication { public static void main(String[] args) { SpringApplication.run(ConfigBusEurekaApplication.class, args); System.out.println("config bus 注册中心服务启动..."); } }
服务端pom
配置、application.properties
配置和代码以下:
pom:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
application.properties:
spring.application.name=springcloud-config-server server.port=9005 eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/ spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/ spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo spring.cloud.config.server.git.username = spring.cloud.config.server.git.password =
代码:
@EnableDiscoveryClient @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); System.out.println("配置中心服务端启动成功!"); } }
客户端这边在以前springcloud-config-client项目中进行改造,新项目的的名称为springcloud-config-bus-client
,在pom文件中新增以下配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
spring-boot-starter-actuator
表示对该程序进行监控,能够经过http接口获得该程序的各类信息,详细的使用能够查看个人这个项目springboot-actuator,能够在注释中查询各类接口的使用。
而后再到配置文件application.properties
中添加以下配置:
management.endpoints.web.exposure.include=refresh
该配置表示暴露刷新的地址为refresh。
注:若是是SpringBoot1.x的版本,那么配置改为management.security.enabled=false
便可。
最后在客户端的Controller增长一个@RefreshScope
注解,该注解表示在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
@RestController @RefreshScope public class ClientController { @Value("${word}") private String word; @RequestMapping("/hello") public String index(@RequestParam String name) { return name+","+this.word; } }
完成上述的代码开发后,咱们来进行测试Spring-Config是否能够进行配置实时更新。
首先依次启动springcloud-config-bus-eureka
、springcloud-config-bus-server
和springcloud-config-bus-client
这三个项目。其中9005是服务端springcloud-config-bus-server
的端口,9006是第一个客户端springcloud-config-bus-client
的端口。
启动成功以后,在浏览器输入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello world!!
能够正常获得服务端configtest-pro.properties
的配置信息。
而后在把configtest-pro.properties
的配置更改成:
word=hello
而后咱们再浏览器输入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello world!!
能够发现配置并无实时的刷新,查阅官方文档得知,须要客户端经过POST方法触发各自的/refresh,因此这里咱们就用Postman工具模拟post请求刷新,而后再查看信息。
使用POST请求以下地址:
http://localhost:9006/actuator/refresh
返回:
[ "word" ]
说明完成了word配置的刷新,咱们再浏览器输入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello
发现已经成功实现配置刷新了!
示例图:
上述的示例中,咱们客户端发现每次获取最新配置都须要手动进行刷新,若是少的的话还可使用,可是多的话就比较繁琐了,虽然咱们可使用相似Github的WebHook的工具。
WebHook是当某个事件发生时,经过发送http post请求的方式来通知信息接收方。
可是当客户端愈来愈多的时候WebHook已经很差使用了,每次新增客户端都须要更改WebHook会显得很麻烦,springcloud官方给出了很是好的解决方案,Spring Cloud Bus
。
Spring cloud bus经过轻量消息代理链接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其余的消息指令。Spring bus的一个核心思想是经过分布式的启动器对spring boot应用进行扩展,也能够用来创建一个多个应用之间的通讯频道。目前惟一实现的方式是用AMQP消息代理做为通道,一样特性的设置(有些取决于通道的设置)在更多通道的文档中。
为何使用Spring Cloud Bus
就能够解决这个问题了呢?
咱们不必定非要透彻的理解其原理才能够知道,咱们只须要知道它的实现步骤,就能够知道了为何能够解决了。
步骤以下:
这里我也简单的画了下使用Spring Cloud Bus
以前和以后的流程图,方便进行理解。
不使用Spring Cloud Bus
获取配置信息流程图:
使用Spring Cloud Bus
获取配置信息流程图:
和上述的环境同样便可。
RabbitMQ 的安装教程能够看我以前写的这篇文章:RabbitMQ的环境安装及配置。
Kafka 的安装教程能够看我以前写的这篇文章:kafka安装使用教程。
Spring Cloud Bus 主要的使用的MQ主要使用的是,RabbitMQ和Kafka。至于使用的话就能够根据状况来进行选择,主要使用的是哪一个MQ就用哪个就好了。这里咱们就用RabbitMQ做为示例来进行讲解,Kafka的使用也差很少,也无在意配置更改而已。
首先在springcloud-config-bus-server
服务端的pom文件添加以下配置:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> </dependencies>
注: spring-boot-starter-actuator
这个是必须的,否则是没法在服务端进行配置刷新请求的。若是是使用的kafka的话,只需将spring-cloud-starter-bus-amqp
改为spring-cloud-starter-bus-kafka
便可。
而后再到配置文件中添加以下配置:
配置信息:
spring.application.name=springcloud-config-bus-server server.port=9005 eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/ spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/ spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo spring.cloud.config.server.git.username = spring.cloud.config.server.git.password = management.endpoints.web.exposure.include= bus-refresh spring.cloud.bus.enabled = true spring.cloud.bus.trace.enabled = true spring.rabbitmq.host:127.0.0.1 spring.rabbitmq.port:5672 spring.rabbitmq.username:guest spring.rabbitmq.password:guest
配置说明:
springcloud-config-bus-client
增长的的配置同样,名称不同是为了作区分。注:若是是kafka的话,添加kafka的配置信息spring.kafka.bootstrap-servers
,填写kafka的地址和端口便可。
服务端代码和以前同样便可,在程序主类中,额外添加@EnableConfigServer
注解,该注解表示启用config配置中心功能。代码以下:
@EnableDiscoveryClient @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); System.out.println("配置中心服务端启动成功!"); } }
完成上述代码以后,咱们的配置中心服务端已经构建完成了。
注册中心和以前保持一致就能够了。
客户端这边的变更基本不大,增长一个rabbitmq的jar包和相应的配置文件便可。
在springcloud-config-bus-clinet
的pom文件添加以下配置:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> </dependencies>
bootstrap.properties
文件的配置信息和以前的基本同样,完整的配置以下:
配置信息:
spring.cloud.config.name=configtest spring.cloud.config.profile=pro spring.cloud.config.label=master spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.serviceId=springcloud-config-bus-server eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/
配置说明:
注:上面这些与spring-cloud相关的属性必须配置在bootstrap.properties中,config部份内容才能被正确加载。由于bootstrap.properties的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties。须要注意的是eureka.client.serviceUrl.defaultZone
要配置在bootstrap.properties,否则客户端是没法获取配置中心参数的,会启动失败!
application.properties
配置文件新增的配置基本和服务端的同样,完整的配置以下:
spring.application.name=springcloud-config-bus-client server.port=9006 management.endpoints.web.exposure.include=refresh spring.cloud.config.failFast=true spring.cloud.bus.trace.enabled = true spring.rabbitmq.host:127.0.0.1 spring.rabbitmq.port:5672 spring.rabbitmq.username:guest spring.rabbitmq.password:guest
配置说明:
程序主类代码,和以前的基本一致。代码以下:
主程序代码示例:
@EnableDiscoveryClient @SpringBootApplication public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); System.out.println("配置中心客户端启动成功!"); } }
控制层代码:
@RestController @RefreshScope public class ClientController { @Value("${word}") private String word; @RequestMapping("/hello") public String index(@RequestParam String name) { return name+","+this.word; } }
完成上述的项目开发以后,咱们把上面的项目复制一下,项目名称为springcloud-config-bus-client2
,而后把它的端口改成9007便可。
到此,客户端的项目也就构建完成了。
完成如上的工程开发以后,咱们来进行测试。
咱们首先启动RabbitMQ服务,而后再依次启动springcloud-config-bus-eureka
、springcloud-config-bus-server
、springcloud-config-bus-client
和springcloud-config-bus-client2
这四个项目。其中9005是服务端springcloud-config-bus-server
的端口,9006是第一个客户端springcloud-config-bus-client
的端口,9007是是第二个客户端springcloud-config-bus-client2
的端口。
启动成功以后,在浏览器输入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello
在浏览器输入:
http://localhost:9007//hello?name=xuwujing
界面返回:
xuwujing,hello
能够正常获得服务端configtest-pro.properties
的配置信息。
而后在把configtest-pro.properties
的配置更改成:
word=hello!!
而后在使用Postman工具进行发起POST请求,只不过此次的地址是服务端的地址和端口。
使用POST请求以下地址:
http://localhost:9005/actuator/bus-refresh
而后咱们再浏览器输入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello!!
浏览器输入:
http://localhost:9007//hello?name=pancm
界面返回:
xuwujing,hello!!
示例图:
完成上述全局刷新测试以后,有时咱们只想刷新部分微服务的配置,那么即可以使用/actuator/bus-refresh/{destination}
端点的 destination
参数来定位要刷新的应用程序。
咱们继续更改configtest-pro.properties
的配置为:
word=hello!!!
而后依旧使用Postman工具发送post请求,地址为:
http://localhost:9005/actuator/bus-refresh/springcloud-config-bus-client2
而后咱们再浏览器输入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello!!
浏览器输入:
http://localhost:9007//hello?name=pancm
界面返回:
xuwujing,hello!!!
发现只有springcloud-config-bus-client2
客户端的配置更新,另外一个springcloud-config-bus-client
没有进行刷新,达到了咱们的目的。
示例图:
上述示例完成以后,咱们把SpringCloud Config Refresh
的测试在进行一遍,发现依旧能够实现,所以咱们发现只要开启Spring Cloud Bus
后,不论是对服务端仍是客户端,执行/actuator/bus-refresh
都是能够更新配置的。
若是咱们想进行跟踪总线事件的话,只须要在刷新配置以后,在地址后面添加/trace
或/actuator/httptrace
便可。
基于SpringBoot2.x、SpringCloud的Finchley版本开发的地址:https://github.com/xuwujing/springcloud-study
若是感受项目不错,但愿能给个star,谢谢!
原创不易,若是感受不错,但愿留言推荐!您的支持是我写做的最大动力! 版权声明: 做者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 我的博客出处:http://www.panchengming.com