如何使用 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 的多个实例

spring cloud 使用spring cloud bus自动刷新配置

spring cloud 中消息总线(bus)使用

(十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置