SpringCloud09-Config和Bus

SpringCloud09-Config和Bus

1. Config

  1. 当微服务数量上升到一定高度的时候,运维成本增加,就需要一个配置中心来做同一个的配置管理。
  2. 配置中心分为服务端和客户端。服务端可以直接从GitHub中最新的配置信息;客户端则是注册进注册中心中的实例,从配置中心的服务端拉取配置。
  3. Config官网。https://docs.spring.io/spring-cloud-config/docs/current/reference/html/

2.创建配置中心服务端cloud-config-center-3344

  1. pom.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
  1. yml
server:
  port: 3344

spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          # git 地址
          uri: https://gitee.com/****/springcloud-config
          # 搜索的目录,Git具体的仓库,不配置也可以。
          #search-paths:
          #  - springcloud-config
      # 具体的分支
      label: master

eureka:
  instance:
    hostname: cloud-config-service
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  1. Main
@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
public class CloudConfigCenter3344Main {

    public static void main(String[] args) {
        SpringApplication.run(CloudConfigCenter3344Main.class, args);
    }
}
  1. gitee上创建配置文件。
config:
  info: "master branch,springcloud-config/config-dev.yml version=1"
  1. 访问。http://localhost:3344/master/config-dev.yaml
  2. 官网推荐的访问规则。/{label}/{application}-{profile}.yml。label,分支;application,可以是对应的应用名称;profile,环境,dev/test/prod。

3.创建配置中心客户端cloud-config-client-3355

  1. pom.xml不变。
  2. 要使用bootstrap.yml。
server:
  port: 3355
spring:
  application:
    name: cloud-config-client
  cloud:
    config:
      # 相当与配置 /{label}/{application}-{profile}.yml
      # 这里的name相当与 application
      label: master
      name: config
      profile: dev
	  # 从http://127.0.0.1:3344获取配置信息
      uri: http://127.0.0.1:3344
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
    fetch-registry: true
    register-with-eureka: true
  1. Main
@EnableEurekaClient
@SpringBootApplication
public class CloudConfigClient3355Main {

    public static void main(String[] args) {
        SpringApplication.run(CloudConfigClient3355Main.class, args);
    }
}
  1. controller
@Slf4j
@RefreshScope // 配置更新时,刷新配置信息
@RestController
public class ConfigController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String configInfo() {
        return configInfo;
    }
}
  1. application.yml和bootstrap.yml的说明。
    1. applicaiton.yml是用户级的资源配置项。bootstrap.yml是系统级的,优先级更加高。
    2. bootstrap.yml主要应用于从外部获取配置信息。

4.刷新配置信息

  1. 如果修改gitee上的配置信息,配置中心的服务端会获取到修改的配置信息,而配置中心的客户端不会获取到最新的配置信息,如果想让配置中心的客户端更新配置信息,就需要重启服务。

  2. 使用命令让配置中心的客户端刷新配置信息。

    1. 添加依赖。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    1. 暴露刷新配置信息的接口
    management:
      endpoints:
        web:
          exposure:
            # include: "*"
            # 只是将 actuator的特定端口暴露出去
            # refresh 配置改变后的刷新端口
            include: info,health,beans,env,refresh
    
    1. controller上添加@RefreshScope注解
    @Slf4j
    @RefreshScope // 配置更新时,刷新配置信息
    @RestController
    public class ConfigController {
    
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/config/info")
        public String configInfo() {
            return configInfo;
        }
    }
    
    1. 发送刷新的命令。curl -X POST "http://localhost:3355/actuator/refresh"

5.Bus

  1. Bus主要解决,配置信息修改后需要通过curl命令刷新每个配置中心客户端的配置的问题。
  2. Bus官网。https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/
  3. Bus基本原理。利用消息中间件,让ConfigClient监听MQ中同一个topic(默认是Spring Cloud Bus),当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。

6.RabbitMQ安装和运行

  1. Erlang,RabbitMQ的运行环境。下载地址https://www.erlang.org/downloads, 下载完成后直接下一步,直到安装完成。
  2. RabbitMQ下载地址,https://github.com/rabbitmq/rabbitmq-server/releases
  3. RabbitMQ的安装。进入sbin目录,执行rabbitmq-plugins.bat enable rabbitmq_management命令来安装插件,不安装插件,http://localhost:15672/,RabbitMQ的可视化界面无法访问。
  4. RabbitMQ通过Windows的任务管理直接启动。
  5. RabbitMQ启动后的访问地址。http://localhost:15672/,账号和密码,guest guest。

7.Bus的两种工作方式。

  1. 利用消息总线触发一个客户端/bus/refresh,由这个客户端刷新所有客户端的配置。
  2. 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,有服务端刷新所有客户端的配置。
  3. 推荐使用第二种。第一,第一中方式打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责;第二,第一种方式破坏了微服务各节点的对等性。

8.创建配置中心客户端cloud-config-client-3366-整合Bus

  1. pom.xml
<!-- 消息总线 + RabbitMQ -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!-- 配置中心 客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  1. yml
server:
  port: 3366

spring:
  application:
    name: cloud-config-client
  cloud:
    config:
      label: master
      name: config
      profile: dev
      uri: http://127.0.0.1:3344

  # rabbitmq的配置信息
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

# 暴露配置刷新接口
management:
  endpoints:
    web:
      exposure:
        include: refresh
  1. 其他配置修改

    1. Config服务端同步添加spring-cloud-starter-bus-amqp依赖。
    2. Config服务端yml配置修改,暴露busrefresh接口。
    management:
      endpoints:
        web:
          exposure:
            include: busrefresh
    
  2. 通过Bus刷新配置的命令,curl -X POST "http://localhost:3344/actuator/busrefresh"

  3. 通知指定微服务刷新的命令。curl -X POST "http://localhost:3344/actuator/busrefresh/cloud-config-client:3355, 通过服务的名称+端口号指定刷新的微服务。

  4. Bus客户端启动后,会默认定义RabbitMQ的springCloudBus的topic。

posted @ 2021-10-07 20:01  行稳致远方  阅读(17)  评论(0)    收藏  举报