로즈마리

글 작성자: daily_zi

 

Spring Cloud Message Broker

스프링 클라우드 메시지는 마이크로서비스를 카프카 및 RabbitMQ 와 같은 경량 메시지 브로커에 연결한다.

 

마이크로서비스 ISSUE

예를들어, 마이크로서비스를 구성했을 때, Production 환경에서 실행 중인 마이크로서비스 중 A의 backend 서비스가 5개 있다고 가정하면, Config 서버에서 Configuration 정보를 긴급하게 변경해야하는 경우가 생긴다.

##microservice-a.properties

##application.message=Message not changed
application.message=Message changed!
@RestController
public class MessageController {
  @Autowired
  private ApplicationConfiguration configuration; //ApplicationConfiguration의 구성된 메시지 값을 읽음
  @RequestMapping("/message")
  public Map<String, String>welcome() {
      Map<String, String> map = new HashMap<String, String>();
      map.put("message", configuration.getMessage()); //application.message값을 읽어옴.
      return map;
  }
}

마이크로서비스 backend 서비스 중 A가 변경된 이 Configuration 정보를 적용하려면 curl -X POST http://localhost:8080/refresh 로 요청을 호출해야 한다.

curl -X POST http://localhost:8080/refresh
{"message": "Message changed"}

하지만, Configuration 변경은 URL이 실행된 마이크로서비스 A의 1개 서비스에만 반영된다. 다른 4개의 서비스는 새로 고침 요청이 실행될 때까지 변경 사항을 받지 못한다.

마이크로서비스에 여러개의 서비스가 있는 경우, 각 Config 서버에 정보를 변경 시마다 이 작업을 수행해야 하므로 각 인스턴스에 대해 새로 고침 URL을 실행하는 것이 번거로워진다.

 

SOLUTION

해결책은 스프링 클라우드 메시지 버스를 사용하여 RabbitMQ와 같은 메시지 브로커를 통해 Configuration 변경 정보를 여러 서비스(혹은 인스턴스)에 전달하는 것이다. 

위 그림은 마이크로서비스 A의 서비스들이 스프링 클라우드 버스를 사용해 메시지 브로커에 연결되는 방법을 보여준다.

각 마이크로서비스의 서비스(Apps)는 애플리케이션 부팅 시 스프링 클라우드 버스(RabbitMQ)에 등록할 것이다.

마이크로서비스 서비스 중 하나에서 새로 고침이 호출되면, 스프링 클라우드 버스는 모든 마이크로서비스의 App에 변경 이벤트를 전달한다.

마이크로서비스 App은 변경 이벤트 수신 시 구성 서버에 업데이트된 구성을 요청한다.