配置 Spring Cloud Bus 的消息代理示例

2023-04-18 15:13:52 浏览数 (2)

接下来,我们以一个简单的示例来演示如何使用Spring Cloud Bus的消息代理。假设我们有两个服务,分别是service1service2,它们都引入了Spring Cloud Bus的依赖并配置了RabbitMQ作为消息代理。我们希望当service1的配置发生变化时,能够将这个变化通知给service2

首先,在service1中添加一个/refresh接口,用于手动刷新配置:

代码语言:javascript复制
@RestController
public class ConfigController {
    
    @Autowired
    private ConfigurableApplicationContext context;
    
    @PostMapping("/refresh")
    public void refresh() {
        context.refresh();
    }
}

这里我们使用ConfigurableApplicationContext来手动刷新配置。

然后,在service2application.yml文件中添加如下配置:

代码语言:javascript复制
spring:
  cloud:
    bus:
      enabled: true
      refresh:
        enabled: true
    refresh:
      enabled: true

这里我们启用了Spring Cloud Bus的刷新功能,并使用/actuator/bus-refresh接口来触发配置的刷新。接下来,在service1application.yml文件中添加如下配置:

代码语言:javascript复制
server:
  port: 8081
spring:
  application:
    name: service1

这里我们设置了service1的名称和端口号。然后在service2application.yml文件中添加如下配置:

代码语言:javascript复制
server:
  port: 8082
spring:
  application:
    name: service2

这里我们设置了service2的名称和端口号。接下来在service1中修改配置,例如将端口号改为8080

代码语言:javascript复制
server:
  port: 8080
spring:
  application:
    name: service1

然后,我们使用Postman或其他工具向service1/refresh接口发送POST请求,手动刷新配置。此时,Spring Cloud Bus将会向所有订阅了bus-refresh主题的服务广播刷新事件,包括service2。因此,service2中的配置也会被更新为最新的值。

代码语言:javascript复制
@RestController
public class ConfigController {
    
    @Value("${server.port}")
    private String port;
    
    @GetMapping("/port")
    public String getPort() {
        return "Service2 port is "   port;
    }
}

我们在service2中添加一个/port接口,用于查看端口号是否已经更新。然后,我们向service2/port接口发送GET请求,可以看到输出的端口号已经更新为8080

0 人点赞