如何使用 Spring Cloud Bus 使用不受配置服务器控制的数据刷新应用程序实例?
Posted
技术标签:
【中文标题】如何使用 Spring Cloud Bus 使用不受配置服务器控制的数据刷新应用程序实例?【英文标题】:How to refresh app instances using Spring cloud bus with data which isn't controlled by config server? 【发布时间】:2019-09-16 21:27:08 【问题描述】:我正在尝试在我的微服务应用程序中将 Spring Cloud Bus 与 Kafka 一起使用,我确实可以使用它,但只有由 Spring Cloud 配置服务器控制的数据才会被刷新!
我在我的配置服务器上使用 jdbc 后端,为了模拟我的需要,我在属性表旁边的一项服务中更改属性文件中的一些值,然后调用 /monintor 又是端点(这里提到第 4.3 节https://www.baeldung.com/spring-cloud-bus);结果,只有来自属性表的数据被更改。
这是我的配置服务器的 yml 文件
spring:
cloud:
config:
server:
jdbc:
sql: SELECT KEY,VALUE from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?
order: 1
stream:
kafka:
binder:
brokers: localhost:9092
datasource:
url: jdbc:mysql://localhost:3306/sweprofile?zeroDateTimeBehavior=convertToNull
username: 123
password: 123ertbnm
hikari:
maximum-pool-size: 10
connection-timeout: 5000
profiles:
active:
- jdbc
application:
name: configServer
这些分别是我的一个 Miscroservices 及其属性文件的 yml 文件
spring:
datasource:
username: 123
password: 123ertbnm
url: jdbc:mysql://localhost:3306/sweprofile?zeroDateTimeBehavior=convertToNull
jpa:
properties:
hibernate:
format_sql: true
ddl-auto: none
application:
name: auth-service
cloud:
config:
discovery:
enabled: true
service-id: configServer
bus:
refresh:
enabled: true
profiles:
active: jdbc
management:
endpoints:
web:
exposure:
include: ["health","info","refresh", "bus-refresh"]
# This line is dummy data for testing purpose
ali.man = " Ola 12333"
这是来自休息控制器的快照
@RestController
@RequestMapping("/user")
@RefreshScope
public class AuthController
private UserAuthService userAuthService;
@Value("$name")
private String name; // changed normally
// Calling the key value mentioned in properties file after changing
@Value("$ali.man")
private String k; // -> not changed
public AuthController(UserAuthService userAuthService)
this.userAuthService = userAuthService;
@GetMapping("authTest")
public String getAuth()
return name + k;
我错过了什么?为什么属性文件中的值没有改变?希望我可以使用 Spring Cloud Bus 和 Kafka 来刷新这些外部数据。
【问题讨论】:
我不明白。 name 和 ali.man 分别来自哪里? 这个 ali.man 只是属性文件中的硬编码配置来测试更改,name 是在属性表中配置的,我发现什么时候更改了它和属性表,刷新后只有该表中的数据发生了变化。 【参考方案1】:经过几个小时的调查,我发现有一些推荐的方法。云总线可以发送 Refresh Event,Spring boot 有 RefreshEvent Listener 到该事件;这就是我构建解决方案的基础。
所以当总线发送事件时;所有实例都将对加载的内存配置执行相同的逻辑(刷新数据)。
我用这个sn-p来应用这个
@Configuration
public class ReloadLookupEvent implements ApplicationListener<RefreshScopeRefreshedEvent>
@Autowired
private CacheService cacheService;
@Override
public void onApplicationEvent(RefreshScopeRefreshedEvent event)
cacheService.refreshLookUp();
我可以按需刷新所有其他配置,也许这是一种解决方法,但可以接受。
【讨论】:
以上是关于如何使用 Spring Cloud Bus 使用不受配置服务器控制的数据刷新应用程序实例?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Config + Spring Cloud Bus + RabbitMQ - 不使用本地 Git 存储库自动刷新客户端
Spring Cloud Bus,如何在 /bus/refresh?destination= 中指定多个目的地?
使用 Spring Cloud Bus Kafka 的多个实例