Как обновить экземпляры службы, используя облачную шину Spring, данными, которые не контролируются сервером конфигурации Spring? - PullRequest
2 голосов
/ 27 апреля 2019

Я пытаюсь использовать 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

Это yml-файлы для одного из моих Miscroservices и его файла свойств соответственно

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 для обновления этих внешних данных.

1 Ответ

1 голос
/ 28 апреля 2019

После нескольких часов расследования я обнаружил, что есть какой-то рекомендуемый способ. Облачная шина может отправлять событие обновления, а Spring boot может прослушивать это событие; это то, на чем я строю свое решение, я использовал этот фрагмент

@Configuration
public class ReloadLookupEvent implements ApplicationListener<RefreshScopeRefreshedEvent> {
    @Autowired
    private CacheService cacheService;

    @Override
    public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
        cacheService.refreshLookUp();          // The target load 
    }

}

Я мог бы обновить все другие конфигурации по требованию, возможно, это обходной путь, но применимый и приемлемый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...