SpringCloud 服务配置(Config) 和 服务总线(Bus)

Posted 黑桃️

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud 服务配置(Config) 和 服务总线(Bus)相关的知识,希望对你有一定的参考价值。

这里写自定义目录标题


🔺 config分布式配置中心

一、概述

(1) 分布式系统面临的问题–配置问题

(2) 是什么

(3) 能干嘛

  • 集中管理配置文件
  • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
  • 运行期间动态调整配置,不再需要字啊每个服务器的机器上编写配置文件,服务会向配置中心同意拉去配置自己的信息
  • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
  • 将配置信息以REST接口的形式暴露 (post,curl访问刷新均可)

(4) 与 GitHub/Gitee 整合配置

(5) 官网

https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/


二、Config服务端配置与测试

(1) 在Gitee上新建一个名为springcloud-config的新Respository(以Gitee为例)

记得选择公开,私有的话访问不了

手动创建三个yaml配置文件

  • config-dev.yml
config:
  info: "master branch,springcloud-config/config-dev.yml version=1"
  • config-prod.yml
config:
  info: "master branch,springcloud-config/config-prod.yml version=1"
  • config-test.yml
config:
  info: "master branch,springcloud-config/config-test.yml version=1"

(2) 由上一步获得刚新建的 git 地址

git@gitee.com:spade26/springcloud-config.git

(3) 本地硬盘目录上新建 Git 仓库并 clone


(4) 新建模块 cloud-config-center-3344

(5) 配置 pom.xml

<?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">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-center-3344</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>$project.version</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

(6) 配置 application.yml

server:
  port: 3344

eureka:
  client:
    service-url:
      defaultZone: http://www.eureka7001.com:7001/eureka/,http://www.eureka7002.com:7002/eureka/

spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          uri: git@gitee.com:spade26/springcloud-config.git  #仓库的ssh路径
          search-paths:
            - springcloud-config
      label: master

(7) 创建主启动类

@SpringBootApplication
// 开启配置中心ConfigServer
@EnableConfigServer 
public class ConfigCenterMain3344 
    public static void main(String[] args) 
        SpringApplication.run(ConfigCenterMain3344.class, args);
    

(8) windows下修改hosts文件,增加映射

(9) 测试通过config微服务是否可以从Gitee上获取配置内容

启动 7001,7002,3344


成功实现用SpringCloud Config通过Gitee获取配置信息


三、Config客户端配置与测试

(1) 新建模块 cloud-config-client-3355

(2) 配置 pom.xml

<?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">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-center-3355</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>$project.version</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

(3) 配置 bootstrap.yml

① 是什么

② 内容

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    config:
      label: master  #分支名称
      name: config  #配置文件名称
      profile: dev  #读取后缀名称   上述三个综合http://config-3344.com:3344/master/config-dev.yml
      uri: http://config-3344.com:3344  #配置中心的地址

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

(4) 创建主启动类

@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 
    public static void main(String[] args) 
        SpringApplication.run(ConfigClientMain3355.class, args);
    

(5) 测试 3355

启动 7001,7002,3344,3355

(6) 分布式配置的动态刷新问题

  1. Linux运维修改GitHub上的配置文件内容做调整

  2. 刷新3344,发现ConfigServer配置中心立刻响应

  3. 刷新3355,发现ConfigClient客户端没有任何响应

  4. 3355没有变化除非自己重启或者重新加载

  5. 难到每次运维修改配置文件,客户端都需要重启??(非常麻烦)


四、Config客户端只动态刷新

避免每次更新配置都要重启客户端微服务3355

(1) 动态刷新

① 3355 的POM引入actuator监控

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

② 修改YML,暴露监控接口

management:
  endpoints:
    web:
      exposure:
        include: "*"

③ @RefreshScope业务类Controller修改

④ 此时测试修改Gitee–>3344–>3355



⑤ 需要运维人员发送Post请求刷新3355

  • 必须是 POST请求
  • curl -X POST "http://localhost:3355/actuator/refresh"

(2) 想想还有什么问题?

  • 假如有多个微服务客户端3355/3366/3377
  • 每次微服务都要执行一次post请求,手动刷新
  • 可否广播?一次通知,处处生效 — bus消息总线,希望之光
  • 我们想大范围的自动刷新,求方法

🔺 Bus消息总线

五、概述

SpringCloud Bus配合Springcloud Config使用可以实现配置的动态刷新

(1) 是什么

Bus支持两种消息代理:RabbitMQkafka

(2) 能干嘛

(3) 为什么被称为总线

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个公用的消息主题,并让系统中的所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他链接在该主题行的实例都知道的消息。

(4) 基本原理

ConfigClient实例都监听MQ中的同一个topic(默认是SpringcloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到topic中,这样其它监听同一个topic的服务就能得到通知,然后去更新自身的配置。


六、RabbitMQ环境配置

(1) 安装 Erlang

下载地址:http://erlang.org/download/otp_win64_21.3.exe

(2) 下载 RabbitMQ

下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3.exe

(3) 进入RabbitMQ的安装目录下的sbin目录

(4) 输入以下命令启动管理功能

rabbitmq-plugins enable rabbitmq_management


可视化插件:

(5) 访问地址查看是否安装成功

启动服务


七、Springcloud Bus动态刷新定点通知

(1) 演示广播效果增加复杂度,再以3355为模板制作一个3366

① 新建模块 cloud-config-client-3366

② 配置 pom.xml

<?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">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-client-3366</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-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>$project.version</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>

③ 配置 bootstrap.yml

server:
  port: 3366

spring:
  application:
    name: config-client
  SpringCloud集成Config分布式配置中心

SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)

SpringCloud Config 配置中心

springcloud应用配置中心config的安全设置

SpringCloud 服务配置(Config) 和 服务总线(Bus)

SpringCloud 服务配置(Config) 和 服务总线(Bus)