如何使用不受配置服务器控制的数据使用 Spring 云总线刷新应用程序实例?
How to refresh app instances using Spring cloud bus with data which isn't controlled by config server?
我正在尝试在我的微服务应用程序中使用 Spring 云总线和 Kafka,我确实可以使用它,但只有 Spring 云配置服务器控制的数据得到刷新!
我在我的配置服务器上使用 jdbc 后端,为了模拟我的需要,我正在更改我的一项服务的属性文件中的一些值,除了属性 table,再次调用/monintor端点(这里4.3节提到https://www.baeldung.com/spring-cloud-bus);结果,只有来自属性 table 的数据被更改。
这是我的配置服务器的 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 云总线和 Kafka 来刷新这些外部数据。
经过几个小时的调查,我发现有一些推荐的方法。云总线可以发送刷新事件并且 Spring 引导具有该事件的 RefreshEvent 监听器;这是我构建解决方案的基础。
所以当总线发送事件时;所有实例都将在内存配置中加载时执行相同的逻辑(刷新数据)。
我使用这个片段来应用这个
@Configuration
public class ReloadLookupEvent implements ApplicationListener<RefreshScopeRefreshedEvent> {
@Autowired
private CacheService cacheService;
@Override
public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
cacheService.refreshLookUp();
}
}
我可以根据需要刷新所有其他配置,也许这是一种解决方法,但可以接受。
我正在尝试在我的微服务应用程序中使用 Spring 云总线和 Kafka,我确实可以使用它,但只有 Spring 云配置服务器控制的数据得到刷新!
我在我的配置服务器上使用 jdbc 后端,为了模拟我的需要,我正在更改我的一项服务的属性文件中的一些值,除了属性 table,再次调用/monintor端点(这里4.3节提到https://www.baeldung.com/spring-cloud-bus);结果,只有来自属性 table 的数据被更改。
这是我的配置服务器的 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 云总线和 Kafka 来刷新这些外部数据。
经过几个小时的调查,我发现有一些推荐的方法。云总线可以发送刷新事件并且 Spring 引导具有该事件的 RefreshEvent 监听器;这是我构建解决方案的基础。
所以当总线发送事件时;所有实例都将在内存配置中加载时执行相同的逻辑(刷新数据)。
我使用这个片段来应用这个
@Configuration
public class ReloadLookupEvent implements ApplicationListener<RefreshScopeRefreshedEvent> {
@Autowired
private CacheService cacheService;
@Override
public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
cacheService.refreshLookUp();
}
}
我可以根据需要刷新所有其他配置,也许这是一种解决方法,但可以接受。