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
  cloud:
    config:
      label: master  #分支名称
      name: config  #配置文件名称
      profile: dev  #读取后缀名称   上述三个综合http://localhost:3344/master/config-dev.yml
      uri: http://localhost:3344  #配置中心的地址

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

management:
  endpoints:
    web:
      exposure:
        include: "*"
④ 创建主启动类
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3366 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain3366.class, args);
    }
}
⑤ Controller:ConfigController
@RestController
public class ConfigController {
    @Value("${server.port}")
    private String serverPort;

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

    @GetMapping("/configInfo")
    public String configInfo() {
        return "serverPort: " + serverPort + "  configInfo:  " + configInfo;
    }
}

(2) 设计思想

  • 1、利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置在这里插入图片描述

  • 2、利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置在这里插入图片描述

图二的架构显然更加合适,图一不适合的原因如下

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它不应该承担配置刷新的职责
  • 打破了微服务各个节点的对等性
  • 有一定的局限性。例如:微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就回增加更多的的修改

(3) 给3344配置中心服务端添加消息总线支持

① 添加配置到 pom.xml
<!--添加消息总线RabbitNQ支持-->
<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>
② 添加配置到 application.yml
#rabbitmq相关配置
# 15672: RabbitMQ的后台管理
# 5672:  RabbitMQ的通信
rabbitmq:
  host: localhost
  port: 5672
  username: guest
  password: guest

##rabbitmq相关配置,暴露bus刷新配置的端点<--------------------------
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

(4) 给3355配置中心服务端添加消息总线支持

① 添加配置到 pom.xml
<!--添加消息总线RabbitNQ支持-->
<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>
② 添加配置到 bootstarp.yml

在这里插入图片描述

rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

(5) 给3366配置中心服务端添加消息总线支持

① 添加配置到 pom.xml
<!--添加消息总线RabbitNQ支持-->
<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>
② 添加配置到 bootstarp.yml

在这里插入图片描述

 rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

(6) 测试

运维工程师

  • 修改Gitee上的配置文件增加版本号在这里插入图片描述

  • 发送POST请求:curl -X POST "http://localhost:3344/actuator/bus-refresh"(一次发送处处生效)在这里插入图片描述

配置中心

  • http://localhost:3344/config-dev.yml在这里插入图片描述

客户端

  • http://localhost:3355/config-dev.yml在这里插入图片描述

  • http://localhost:3366/config-dev.yml在这里插入图片描述

  • 获取配置信息。发现都已经刷新了


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

不想全部通知,只想定点通知

(1) 简单一句话

  • 指定具体某一实例生效而不是全部
  • 公式:http://lcoalhost:配置中心的端口号/actuator/bus-refresh/{destination}
  • /bus-refresh 请求不再发送到具体的服务实例上,而是发给 config server 。并 通过 destination 参数类指定需要发送更新配置的服务或者实例

(2) 案例

假如我们只想刷新运行在3355端口上的config-client为例

  • 只通知3355
  • 不通知3366
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

(3) 测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4) 通知总结All

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值