一:简介
- Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,
也可以用于监控。本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置文件的更改。Spring Cloud Bus可选
的消息代理组件包括RabbitMQ,AMQP和Kafka等。 - 为什么需要使用Spring Cloud Bus去刷新配置?
比如,我们现在有几十个微服务,而每个微服务又是多实例,当更改配置时,就需要重启多个微服务实例,
会非常麻烦。Spring Cloud Bus的一个功能就是让这个过程变得简单,当远程Git仓库的配置更改后,只需要向
其中的一个微服务实例发送一个Post请求,通过消息组件通知其它微服务实例重新拉去配置文件即可。 - 整体刷新配置的架构图
- 架构图的简单分析
⑴Eureka-Server服务
这个服务主要是用来服务的注册和发现的,它是一个注册中心,我们会将Config Server,Config Client这些服务都注册进 去。
⑵ Config Server服务
这个是一个分布式配置中心Config Server,通过它我们可以从远处Git仓库读取我们需要的配置文件,所以,Config Client
服务可以通过连接它来获取自己需要的配置信息。
⑶ Config Client服务
这个服务是Config客户端,它需要从Config服务端获取自己的配置文件信息。
⑷ 消息总线
可以理解为一个消息代理,它可以将分布式的节点都连接起来,也可以完成各个应用程序节点间的相互通信,
这里我们主要用来广播配置文件的更改,并且消息总线的可选消息代理组件包括RabbitMQ,AMQP和Kafka等,这
里我们选中的是RabbitMQ组件。
⑸/bus/refresh
这个是用来刷新配置的请求,当远程仓库的配置文件修改后,我们不需要重新启动各个子节点,只需向某一个
子节点发送一个Post请求即可,消息总线会自动通知其它各个节点进行配置文件的刷新。
二:实战例子
- 搭建RabbitMQ服务,具体过程需要自行百度,网上教程很多 ,效果如下:
注意:RabbitMQ默认网页端口15672,AMQP默认端口5672(我们链接时用这个) - 主工程parent
pom.xml配置文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.kgf</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>parent</name> <!--继承一个父模块,然后再引入相应的依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <!--relativePath是可选的,maven会首先搜索这个地址,在搜索本地远程repositories之前 --> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java-version>1.8</java-version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <!--下面的方式通过import可以实现多继承的问题 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <modules> <module>springcloud-config-server</module> <module>springcloud-config-client</module> <module>springcloud-eureka-server</module> </modules> </project>
- 创建服务注册和发现中心springcloud-eureka-server服务
⑴创建启动类SpringCloudEurekaServerApplication.java
⑵创建配置文件application.yml文件
⑶在pom.xml文件中添加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.kgf</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>springcloud-eureka-server</artifactId> <dependencies> <!-- 引入eureka-server依赖 --> <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-web</artifactId> </dependency> </dependencies> <build> <plugins> <!--能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 创建分布式配置中心springcloud-config-server服务,用来为springcloud-config-client提供配置文件信息
⑴创建服务启动类SpringCloudConfigServer.java
⑵创建配置文件application.yml文件(当然这里我们只需要启动一个服务实例即可,这里我们选中的是8888)
--- server: port: 8888 spring: cloud: config: server: git: uri: https://github.com/kangf897570/SpringcloudConfig search-paths: - respo1 username: kangf897570 password: Kangf@897570 label: master application: name: config-server profiles: dev eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ --- server: port: 9999 spring: cloud: config: server: git: uri: https://github.com/kangf897570/SpringcloudConfig search-paths: - respo2 username: kangf897570 password: Kangf@897570 label: master application: name: config-server profiles: test eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
⑶在pom.xml中添加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.kgf</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>springcloud-config-server</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- 引入eureka依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 创建分布式配置中心客户端springcloud-config-client服务
⑴创建启动类SpringCloudConfigClientApplication.java
⑵创建配置文件bootstrap.yml
--- server: port: 8762 spring: application: name: config-client profiles: dev cloud: config: name: config-client-dev #表示要获取的配置文件名称 fail-fast: true discovery: enabled: true service-id: config-server #服务名称,表示从这个服务获取配置信息 --- server: port: 8763 spring: application: name: config-client profiles: test cloud: config: name: config-client-dev fail-fast: true discovery: enabled: true service-id: config-server
⑶在pom.xml中添加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.kgf</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>springcloud-config-client</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 引入eureka依赖 --> <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-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
- 查看从GitHub上要获取的配置信息
- 测试,按顺序启动springcloud-eureka-server,springcloud-config-server(启动一个8888端口实例即可),
springcloud-config-client服务(两个实例8762和8763),当然MQ要启动。
效果如下:
首先分别访问8762和8763服务:
那么下面我们修改一下GitHub上的配置文件信息:
再次请求8762,8763页面发现和上面一下,数据并没有变化。
下面我们使用springcloud bus消息总线访问一下8762服务,刷新一下配置信息(使用Postman发送post请求)。
路径:http://localhost:8762/actuator/bus-refresh
下面再次刷新8762,8763页面,效果如下: