SpringCloud简介

Spring Cloud是Spring旗下的项目之一
Spring Cloud并不是一个组件 而是许多组件的集合
其将当下非常流行的一些技术整合到了一起 实现了多个分布式开发中的重要功能
协调了分布式环境中各个系统 并且为各类服务提供模板性的配置

其主要涉及的组件包括:

  • Eureka:注册中心
  • Zuul或Spring Cloud Gateway:服务网关
  • Ribbon:负载均衡
  • Feign:服务调用
  • Hystrix或Resilience4j:熔断器

除此之外 还有一些很有用的组件 比如Spring Cloud ConfigSpring Cloud Bus

【在本篇中 将介绍Spring Cloud Bus消息总线】

Spring Cloud Bus消息总线

若修改Spring Cloud Config的配置 不重启服务的话 则无法读取到最新修改后的配置项
Spring Cloud Bus可以在不重启系统的情况下实现及时同步更新配置项

Spring Cloud Bus是用轻量的消息代理将分布式的节点连接起来 可以用于广播配置文件的更改或者服务的监控管理
也就是消息总线可以为微服务做监控 也可以实现应用程序之间的相互通信

Spring Cloud Bus可选的消息代理有RabbitMQ和Kafka

使用步骤

Spring Cloud Bus底层是基于RabbitMQ实现的 默认使用本地的消息队列服务 因此需要提前安装RabbitMQ 然后启动本地的RabbitMQ服务

安装教程请参看我的另一篇博客:手把手演示Windows环境下安装RabbitMQ

1、首先在[配置中心工程]进行配置:

在配置中心工程的pom文件中添加相关的依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>

然后进行相关配置:

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        # 指定git仓库的地址
        git:
          uri: https://gitee.com/zhangsan/spring-cloud-config.git
          username: zhangsan
          password: 123456789
  # RabbitMQ配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
management:
  endpoints:
    web:
      exposure:
        # 暴露触发消息总线的地址
        # 访问该地址即可立即刷新配置文件
        include: bus-refresh
2、[服务提供工程]也需要进行相应配置

(服务提供工程 也就是将配置文件托管到git的工程)

同样 需要添加相关的依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件也要进行修改:

spring:
  cloud:
    config:
      name: user
      profile: dev
      label: master
      discovery:
        enabled: true
        service-id: config-server
  # RabbitMQ配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

在控制器类上添加@RefreshScope注解以使当有最新的配置项时 刷新配置:

@RestController
@RequestMapping("/user")
// 当有最新的配置项时 刷新配置
@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${test.name}")
    private String name;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id)
    {
        System.out.println("name : "+name);
        return userService.queryById(id);
    }
}

测试:
当修改了git上的配置文件之后 发送一个Post请求给localhost:12000/actuator/bus-refresh
(12000端口为我的配置中心项目的端口 bus-refresh为设置的路径名称 可以在配置文件中修改)
在这里插入图片描述
此时 在项目中显示的是配置文件中最新的数据了

测试成功


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐