【八】Spring Cloud Config组件

Spring Cloud Config是⼀个分布式配置管理⽅案,包含了 Server端和 Client端两个部分

Config简介

  • Server 端:提供配置⽂件的存储、以接口的形式将配置⽂件的内容提供出去,通过使用
    @EnableConfigServer注解在 Spring boot 应用中嵌⼊
  1. 命名规则如下:{application}-{profile}.yml 或者 {application}-{profile}.properties其中,
    application为应⽤名称,profile指的是环境(⽤于区分开发环境,测试环境、⽣产环境等)
  • Client 端:通过接口获取配置数据并初始化自己的应用

在这里插入图片描述

构建config-server

在这里插入图片描述

  1. gitee 产品上新建公开仓库新建配置文件m-service-resume-dev.yml
server:
  port: 8080

spring:
  application:
    name: m-service-resume
#注册发现
eureka:
  client:
    service-url:
      defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
        # 每隔多久拉取⼀次服务列表
    registry-fetch-interval-seconds: 30
  instance:
    #显示ip
    prefer-ip-address: true
    # 192.168.28.22:m-service-autodeliver:8090:1.0-SNAPSHOT
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
    #元数据
    metadata-map:
      A: A1
      B: A1
# 租约续约间隔时间,默认30秒
    lease-renewal-interval-in-seconds: 30
# 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
    lease-expiration-duration-in-seconds: 90
my:
  test:
    num: 100
  1. 构建modulem-cloud-config-server
  2. 导入依赖
 <!--eureka client 客户端依赖引⼊-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--config配置中⼼服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
  1. 启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer //开启Config配置
public class McloudConfigServer {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(McloudConfigServer.class,args);
    }
}

  1. 配置文件 application.yml
  • 添加config配置
spring:
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/vipMygz/m-cloud-config-server.git
          username: XXXXXX
          password: XXXXXX
          search-paths:
            - m-cloud-config-server
      label: master
server:
  port: 9006

spring:
  application:
    name: m-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/vipMygz/m-cloud-config-server.git
          username: XXXXXX
          password: XXXXXX
          search-paths:
            - m-cloud-config-server
      label: master

#注册发现
eureka:
  client:
    service-url:
      defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
    # 每隔多久拉取⼀次服务列表
    registry-fetch-interval-seconds: 30
  instance:
    prefer-ip-address: true
    instance-id: ${
    
    spring.cloud.client.ip-address}:${
    
    spring.application.name}:${
    
    server.port}:@project.version@
    # 租约续约间隔时间,默认30秒
    lease-renewal-interval-in-seconds: 30
    # 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
    lease-expiration-duration-in-seconds: 90
  1. 启动config 服务
    在这里插入图片描述

  2. 验证访问配置http://localhost:9006/master/m-service-resume-dev.yml

    在这里插入图片描述

客户端改造

???既然是配置中心我们把客户端的服务注册到Eureka中心,那部分配置放到配置中心。看下效果。

  1. 改造m-service-resume-8080
  2. 引入依赖
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-config-client</artifactId>
</dependency>
  • Config 客户端配置
spring:
  cloud:
     config:
      uri: http://localhost:9006/
      name: m-service-resume
      profile: dev
      label: master
  1. application.yml修改为bootstrap.yml配置⽂件
server:
  port: 8080

spring:
  application:
    name: m-service-resume

  cloud:
     config:
      uri: http://localhost:9006/
      name: m-service-resume
      profile: dev
      label: master

  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 &serverTimezone=UTC
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl  #避免将驼峰命名转换为下划线命名

  1. 启动m-service-resume-8080 ,观察注册中心
    在这里插入图片描述
  2. 观察注册中心
    在这里插入图片描述
    注册成功,但是有点问题,我们的部分配置没有生效。没有显示IP.,发现配置我们是
    在这里插入图片描述
    而config配置服务获取的结果是,按照ABCD首字母排序的。
    在这里插入图片描述
    这不是问题重点,问题应该是,部分配置没有生效
    在这里插入图片描述

Config配置手动刷新

问题

  1. 客户端服务添加contrller 获取my.test.num
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
    
    
    @Value("${my.test.num}")
    private String myTest;


    @GetMapping("/viewconfig")
    public String viewconfig() {
    
    
        return "msg==>" + myTest  + " num=>" + myTest;
    }
}
  • 修改gitee 的配置 num 为200,发现客户端并没有获取到最新的配置
    在这里插入图片描述

配置手动刷新

  1. 添加配置
management:
 endpoints:
 web:
 exposure:
 include: refresh

##### 或者
management:
 endpoints:
 web:
 exposure:
 include: "*"
  1. Client客户端使⽤到配置信息的类上添加@RefreshScope

  2. ⼿动向Client客户端发起POST请求,http://localhost:8080/actuator/refresh,刷新配置信息在这里插入图片描述

  3. 重启服务,访问接口
    在这里图片描述
    注意:动刷新⽅式避免了服务重启(流程:Git改配置—>for循环脚本⼿动刷新每个微服务)

Config配置自动更新

在微服务架构中,我们可以结合消息总线(Bus)实现分布式配置的⾃动更新(Spring CloudConfig+Spring Cloud Bus)实现⼀次通知处处⽣效

Spring Cloud Bus(基于MQ的,支持RabbitMq/Kafka) 是Spring Cloud中的消息总线方案,Spring
Cloud Config + Spring Cloud Bus 结合可以实现配置信息的自动更新。

  1. Config Server服务端添加消息总线支持
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
 </dependency>
  1. ConfigServer添加配置
spring:
 rabbitmq:
  host: 127.0.0.1
  port: 5672
  username: guest
  password: guest
  1. 微服务暴露端口
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

# 暴露端口
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 重启各个服务,更改配置之后,向配置中心服务端发送post请求
http://localhost:9003/actuator/bus-refresh //各个客户端配置即可⾃动刷新
http://localhost:9006/actuator/bus-refresh/m-service-resume:8081  //定向刷新

猜你喜欢

转载自blog.csdn.net/u014535922/article/details/129998666