接下来,我们以一个简单的示例来演示如何使用Spring Cloud Bus的消息代理。假设我们有两个服务,分别是service1
和service2
,它们都引入了Spring Cloud Bus的依赖并配置了RabbitMQ作为消息代理。我们希望当service1
的配置发生变化时,能够将这个变化通知给service2
。
首先,在service1
中添加一个/refresh
接口,用于手动刷新配置:
@RestController
public class ConfigController {
@Autowired
private ConfigurableApplicationContext context;
@PostMapping("/refresh")
public void refresh() {
context.refresh();
}
}
这里我们使用ConfigurableApplicationContext
来手动刷新配置。
然后,在service2
的application.yml
文件中添加如下配置:
spring:
cloud:
bus:
enabled: true
refresh:
enabled: true
refresh:
enabled: true
这里我们启用了Spring Cloud Bus的刷新功能,并使用/actuator/bus-refresh
接口来触发配置的刷新。接下来,在service1
的application.yml
文件中添加如下配置:
server:
port: 8081
spring:
application:
name: service1
这里我们设置了service1
的名称和端口号。然后在service2
的application.yml
文件中添加如下配置:
server:
port: 8082
spring:
application:
name: service2
这里我们设置了service2
的名称和端口号。接下来在service1
中修改配置,例如将端口号改为8080
:
server:
port: 8080
spring:
application:
name: service1
然后,我们使用Postman或其他工具向service1
的/refresh
接口发送POST请求,手动刷新配置。此时,Spring Cloud Bus将会向所有订阅了bus-refresh
主题的服务广播刷新事件,包括service2
。因此,service2
中的配置也会被更新为最新的值。
@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
。