Chapter2 消息总线 ConfigClient配置自动刷新

Chapter2 消息总线ConfigClient配置自动刷新

Spring Cloud Bus:

Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ、Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化或者其他的管理指令。使用Spring Cloud Bus后的架构如图所示。

Chapter2 消息总线 ConfigClient配置自动刷新_第1张图片

准备工作:

         需要安装rabbitMQ,安装rabbitMQ的详情请参考:https://blog.csdn.net/qq_35098526/article/details/80009424这篇文章主要讲Windows下的安装过程。

环境搭建

Chapter2 消息总线 ConfigClient配置自动刷新_第2张图片

创建三个模块:

eureka-server  eureka服务注册中心

config-server   配置中心服务端

config-client    配置中心客户端

1.     eureka-server 模块pom文件配置如下,这里跟第一章节一样 ,不多说。

xml version="1.0" encoding="UTF-8"?>
<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.0modelVersion>

  
<groupId>com.harrygroupId>
  
<artifactId>eureka-serverartifactId>
  
<version>0.0.1-SNAPSHOTversion>
  
<packaging>jarpackaging>

  
<name>eureka-servername>
  
<description>EUREKA 服务注册中心description>

  
<parent>
     
<groupId>org.springframework.bootgroupId>
     
<artifactId>spring-boot-starter-parentartifactId>
     
<version>2.0.1.RELEASEversion>
     
<relativePath/>
  
parent>

  
<properties>
     
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
     
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
     
<java.version>1.8java.version>
     
<spring-cloud.version>Finchley.M9spring-cloud.version>
  
properties
>

  
<dependencies>
     
<dependency>
        
<groupId>org.springframework.cloudgroupId>
        
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
     
dependency
>

     
<dependency>
        
<groupId>org.springframework.bootgroupId>
        
<artifactId>spring-boot-starter-testartifactId>
        
<scope>testscope>
     
dependency
>
  
dependencies
>

  
<dependencyManagement>
     
<dependencies>
        
<dependency>
           
<groupId>org.springframework.cloudgroupId>
           
<artifactId>spring-cloud-dependenciesartifactId>
           
<version>${spring-cloud.version}version>
           
<type>pomtype>
           
<scope>importscope>
        
dependency
>
     
dependencies
>
  
dependencyManagement
>

  
<build>
     
<plugins>
        
<plugin>
           
<groupId>org.springframework.bootgroupId>
           
<artifactId>spring-boot-maven-pluginartifactId>
        
plugin
>
 
    plugins
>
  
build
>

  
<repositories>
     
<repository>
        
<id>spring-milestonesid>
        
<name>Spring Milestonesname>
        
<url>https://repo.spring.io/milestoneurl>
        
<snapshots>
           
<enabled>falseenabled>
        
snapshots
>
     
repository
>
  
repositories
>


project>

2. config-server   配置中心服务端pom配置,这里引入了spring-cloud-starter-bus-amqp。

xml version="1.0" encoding="UTF-8"?>
<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.0modelVersion>

   <groupId>com.harrygroupId>
   <artifactId>config-serverartifactId>
   <version>0.0.1-SNAPSHOTversion>
   <packaging>jarpackaging>

   <name>config-servername>
   <description>Demo project for Spring Bootdescription>

   <parent>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-parentartifactId>
      <version>2.0.1.RELEASEversion>
      <relativePath/> 
   parent>

   <properties>
      <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
      <java.version>1.8java.version>
      <spring-cloud.version>Finchley.M9spring-cloud.version>
   properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
      dependency>

      <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-config-serverartifactId>
      dependency>
      <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-bus-amqpartifactId>
      dependency>

      <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-testartifactId>
         <scope>testscope>
      dependency>
   dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-dependenciesartifactId>
            <version>${spring-cloud.version}version>
            <type>pomtype>
            <scope>importscope>
         dependency>
      dependencies>
   dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
         plugin>
      plugins>
   build>

   <repositories>
      <repository>
         <id>spring-milestonesid>
         <name>Spring Milestonesname>
         <url>https://repo.spring.io/milestoneurl>
         <snapshots>
            <enabled>falseenabled>
         snapshots>
      repository>
   repositories>


project>

application.yml 配置

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8889/eureka/
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/honghh/spring-cloud-config # 配置git仓库地址
          searchPaths: config-doc # 配置仓库路径
#          username: # 访问git仓库的用户名
#          password: # 访问git仓库的用户密码
#      label: #配置仓库的分支

server:
  port: 8989

在application.yml可以看到引入了git仓库地址,如果仓库是私有的,需要输入访问的账号和密码,这个地址是我自己测试用的,是公开的,可以不输入账号密码。searchPaths:config-doc# 配置仓库路径如果仓库路径是根目录则不需要写这个,如果是多级目录,可以写成A/B/C格式。

2.     config-client  配置中心客户端这里需要注意pom文件中引入了spring-cloud-starter-bus-amqp,spring-boot-starter-actuator,spring-retry

xml version="1.0" encoding="UTF-8"?>
<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.0modelVersion>

   <groupId>com.harrygroupId>
   <artifactId>config-clientartifactId>
   <version>0.0.1-SNAPSHOTversion>
   <packaging>jarpackaging>

   <name>config-clientname>
   <description>Demo project for Spring Bootdescription>

   <parent>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-parentartifactId>
      <version>2.0.1.RELEASEversion>
      <relativePath/> 
   parent>

   <properties>
      <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
      <java.version>1.8java.version>
      <spring-cloud.version>Finchley.M9spring-cloud.version>
   properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
      dependency>
      <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-configartifactId>
      dependency>
      <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-bus-amqpartifactId>
      dependency>

      <dependency>
         <groupId>org.springframework.retrygroupId>
         <artifactId>spring-retryartifactId>
      dependency>


      <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-actuatorartifactId>
      dependency>

      <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-webartifactId>
      dependency>
      <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-testartifactId>
         <scope>testscope>
      dependency>
   dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-dependenciesartifactId>
            <version>${spring-cloud.version}version>
            <type>pomtype>
            <scope>importscope>
         dependency>
      dependencies>
   dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
         plugin>
      plugins>
   build>

   <repositories>
      <repository>
         <id>spring-milestonesid>
         <name>Spring Milestonesname>
         <url>https://repo.spring.io/milestoneurl>
         <snapshots>
            <enabled>falseenabled>
         snapshots>
      repository>
   repositories>


project>

 

bootstrap.yml 配置

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8889/eureka/

server:
  port: 8881

spring:
  application:
    name: config-client
  cloud:
    config:
      label: master
      profile: dev
      discovery:
        enabled: true
        service-id: config-server
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

#management:
#  security:
#    enabled: false  #spring boot1.5.x 版本配置

management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

这里写入rabbitMQ的配置和management的配置,我们可以看到有一段注释的代码,解析看下面注意有坑①。

启动项目

依次启动eureka-server、confg-cserver,启动两个config-client,端口为:8881

1.访问http://localhost:8881/hi浏览器显示:

Chapter2 消息总线 ConfigClient配置自动刷新_第3张图片

2这时我们去代码仓库将config-client-dev.properties下的foo的值改为“foo version 4”,即改变配置文件foo的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8881/bus/refresh,你会发现config-client会重新读取配置文件。可以看到控制台打印日志如图。注意有坑 ①

   Chapter2 消息总线 ConfigClient配置自动刷新_第4张图片

3.     再次请求http://localhost:8881/hi

Chapter2 消息总线 ConfigClient配置自动刷新_第5张图片

到这里操作就已经完成。接下来我们讲一下遇到的问题

注意有坑

①  上面提到请求 http://localhost:8881/bus/refresh但是你在运行的时候遇到报404的错误

Chapter2 消息总线 ConfigClient配置自动刷新_第6张图片

图5.1

Chapter2 消息总线 ConfigClient配置自动刷新_第7张图片

图5.2

首先,你要确认是post请求,如图5.1是get请求,是会报404的错误的

但是图5.2中用的是post请求为什么还会报错

这里就是我所说的坑看项目中的pom文件我用的是spring boot 2.0.1.RELEASE版本,查资料看到一篇文章 https://ask.csdn.net/questions/684123

详情如下:

SpringBoot2.0Config客户端自动刷新时没有/bus/refresh端点

Spring Cloud ConfigClient的配置自动刷新

目前的博客和视频都是Spring Boot1.5.x的,安装rabbitmq,导入依赖,配置yml,添加@RefreshScope,启动Config client时日志都会打印出/bus/refresh这个端口,但是到spring boot2.0就不再打印这个端口,也无法访问。即使yml配置暴露actuator的所有端口,也就只有/actuator/refresh这个端口(这个端口是只更新一个的)。

请问Spring boot 2.0如何实现Config Client自动刷新配置

Spring boot 2.0的改动较大,/bus/refresh全部整合到actuador里面了,所以之前1.xmanagement.security.enabled全部失效,不适用于2.0

适用于2.0的配置是这样的:

 

 management:

  endpoints:

    web:

      exposure:

        include: bus-refresh

另外注解

 

 @RefreshScope

需要在配置的页面加上,就是说附带@Value的页面加上此注解

 

请求刷新的页面由原来1.5.xlocalhost:8888/bus/refresh

变成:http://localhost:8888/actuator/bus-refresh

 

注意:config-serverconfig-client的配置都得加上

 

 management:

  endpoints:

    web:

      exposure:

        include: bus-refresh

所以这就是上面为什么这样改的原因,执行刷新的的请求为:

 http://localhost:8881/actuator/bus-refresh

 

下载地址:

代码我已同步到码云git :https://gitee.com/honghh/spring-cloud-config

 

 



你可能感兴趣的:(spring,cloud)