欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

程序员文章站 2022-07-03 19:48:03
...

1.首先是RabbitMQ安装

下载链接:ELang(这个是RabbitMQ运行环境)

RabbitMQ

安装过程一路 next 即可

2.配置RabbitMQ客户端

进入rabbitMQ安装目录的sbin目录 启动cmd 运行以下命令

rabbitmq-plugins enable rabbitmq_management

等待执行完毕, 在 Windows开始菜单 找到rabbitMQ Server中的start

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

点击开启rabbitMQ服务

登录 http://localhost:15672

默认账号密码都是 guest

出现以下界面 说明成功开启

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

2. 流程

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

在这里代码演示的是 创建一个eureka服务注册中心 一个config服务配置中心 和 两个 获取服务配置信息的客户端,通过bus消息总线和rabbitMQ 实现两个客户端实时获取到配置服务中心的配置

3.创建git 仓库

在这里我们用 码云 来存放我们的配置文件

  1. 码云创建私有仓库 my-cloud-config

  2. 本地创建git同名仓库 与远程仓库建立关系

  3. 创建config-dev.yml

    config:
      spring-cloud-config-dev:
        version:
          1
    
  4. 将本地仓库的config-dev.yml推送到码云仓库

    具体的这些Git操作不在赘述

4.创建eureka服务注册中心7001

pom(版本控制都在父项目中,springboot版本 2.2.2.RELEASE springcloud版本 Hoxton.SR1 其他的自行选择)

 <dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!--boot web actuator-->
        <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.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

yml

server:
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #设置与Eureka server 交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://localhost:7001/eureka/ #单机版 指向自己

主启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author Xkuna
 * @date 2020/7/22 15:32.
 */

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class, args) ;
    }
}

5.创建config服务配置中心3344

pom

<dependencies>
        <!--添加消息总线RabbitMQ支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
    	<!--config-server-->
        <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-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml

server:
  port: 3344

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xiaokuna/my-cloud-config.git #gitee上面的git仓库名字
          ####搜索目录
          search-paths:
            - my-cloud-config
          username: username
          password: password
      ####读取分支
      label: master
  #rabbitmq相关配置
  #本地环境不需要配置mq,但是需要启动mq,Springboot会自动连接本地mq,后面客户端也是,如果是线上环境的话,必须要进行配
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

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

主启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @author Xkuna
 * @date 2020/8/12 10:39.
 */
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer//开启config服务配置中心
public class ConfigCenterMain3344 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigCenterMain3344.class, args) ;
    }
}

6.创建config服务配置客户端3355

6.1搭建项目基础

pom

注意服务配置中心的config依赖 和 服务配置客户端的config依赖的区别

  <!--添加消息总线RabbitMQ支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
	<!--config-client-->
        <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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml

注意我们此时创建的yml名为 bootstrap.yml

server:
  port: 3355

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

  #rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
  #本地环境不需要配置mq,但是需要启动mq,Springboot会自动连接本地mq,后面客户端也是,如果是线上环境的话,必须要进行配
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

主启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @author Xkuna
 * @date 2020/8/12 10:59.
 */
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain3355.class, args) ;
    }
}

6.2创建controller

注意需要添加@RefreshScope注解

仅对添加该注解的类中的yml配置生效

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Xkuna
 * @date 2020/8/12 11:05.
 */
@RestController
@RefreshScope
public class ConfigController {
    @Value("${config.spring-cloud-config-dev.version}")
    private Integer version ;

    @GetMapping("/version")
    public Integer getVersion() {
        return this.version ;
    }
}

7.创建config服务配置客户端3366

copy上面的 config服务配置客户端

修改所有 3355 为 3366 (主启动类名, yml配置中的端口)

8.测试

  1. 项目结构

    springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

  1. 启动

    注意启动顺序

    先启动eureka注册中心7001

    再启动config服务配置中心3344

    等3344启动完成后在启动config客户端 3355 3366否则可能会报错

    最后启动 config服务配置客户端 3355 3366

  2. 测试配置是否成功

    首先测试 3344 访问 http://localhost:3344/master/config-dev.yml

    出现以下页面则表示配置成功

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

再测试3355 访问 http://localhost:3355/version 出现以下页面则配置成功

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

再测试3366 访问 http://localhost:3366/version 出现以下页面则配置成功

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

以上我们的config服务配置中心 和 客户端搭建完成了 并且实现了客户端获取配置

但是我们来修改下git仓库中 config-dev.yml的值

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

我们再依次访问

http://localhost:3344/master/config-dev.yml

http://localhost:3355/version

http://localhost:3366/version

发现 只有服务配置中心3344 获取到了我们更新的yml配置

而3355 3366客户端并没有,如果每次更新配置 都要重启客户端是不现实的,所以此时就用到了我们的消息中间件RabbitMQ消息总线Bus

9.服务配置客户端 实现配置实时刷新

配置 我们已经在上面的项目搭建的过程中配置好了

包括 @RefreshScope注解 bootstrap.yml的创建和 bootstrap.yml中的rabbitMQ,management暴露接口的配置

只是 我们少了最后的临门一脚

只需要 给服务配置中心发送 刷新配置 的消息,即可传播给所有“订阅”此服务配置中心的客户端自行刷新获取配置

我们再postman中 发送post请求到 http://localhost:3344/actuator/bus-refresh 即可

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

如此我们再访问 http://localhost:3355/version,http://localhost:3366/version

springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新

发现 配置更新过来了 ????????

还有一个问题

如果我只想给个别的 客户端更新配置,该怎么做?

很简单, 我们可以发送post请求到 :http://localhost:{服务配置中心的端口}/actutor/bus-refresh/{更新配置的服务}

更新配置的服务 = 服务名称:端口号

比如我们单独 更新 3355客户端的配置

就可以发送 post请求到 http://localhost:3344/actuator/bus-refresh/config-client:3355 即可