SpringCloud之消息总线(Spring Cloud Bus)刷新配置

一:简介

  1. Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,
    也可以用于监控。本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置文件的更改。Spring Cloud Bus可选
    的消息代理组件包括RabbitMQ,AMQP和Kafka等。
  2. 为什么需要使用Spring Cloud Bus去刷新配置?
            比如,我们现在有几十个微服务,而每个微服务又是多实例,当更改配置时,就需要重启多个微服务实例,
    会非常麻烦。Spring Cloud Bus的一个功能就是让这个过程变得简单,当远程Git仓库的配置更改后,只需要向
    其中的一个微服务实例发送一个Post请求,通过消息组件通知其它微服务实例重新拉去配置文件即可。
  3.  整体刷新配置的架构图
       
  4. 架构图的简单分析
       ⑴Eureka-Server服务
                这个服务主要是用来服务的注册和发现的,它是一个注册中心,我们会将Config Server,Config Client这些服务都注册进              去。
       ⑵ Config Server服务
                这个是一个分布式配置中心Config Server,通过它我们可以从远处Git仓库读取我们需要的配置文件,所以,Config Client
            服务可以通过连接它来获取自己需要的配置信息。
       ⑶ Config Client服务
                这个服务是Config客户端,它需要从Config服务端获取自己的配置文件信息。
       ⑷ 消息总线
                   可以理解为一个消息代理,它可以将分布式的节点都连接起来,也可以完成各个应用程序节点间的相互通信,
            这里我们主要用来广播配置文件的更改,并且消息总线的可选消息代理组件包括RabbitMQ,AMQP和Kafka等,这
            里我们选中的是RabbitMQ组件。
       ⑸/bus/refresh
                 这个是用来刷新配置的请求,当远程仓库的配置文件修改后,我们不需要重新启动各个子节点,只需向某一个
             子节点发送一个Post请求即可,消息总线会自动通知其它各个节点进行配置文件的刷新。        

二:实战例子

  1. 搭建RabbitMQ服务,具体过程需要自行百度,网上教程很多 ,效果如下:
         
         注意:RabbitMQ默认网页端口15672,AMQP默认端口5672(我们链接时用这个)
  2. 主工程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>

     

  3.  创建服务注册和发现中心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>

     

  4.  创建分布式配置中心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>

     

  5.  创建分布式配置中心客户端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>

     

  6. 查看从GitHub上要获取的配置信息
          
  7. 测试,按顺序启动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页面,效果如下:
         
         
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值