Spring Cloud Finchley 버전의 Consul 다중 인스턴스 등록 문제 해결

consul 소개
consul은 다음과 같은 특성을 가지고 있습니다.
  • 서비스 발견:consul은 http 방식을 통해 서비스를 등록하고 서비스와 서비스 간에 서로 감응한다.
  • 서비스 건강 모니터링
  • key/value 저장소
  • 멀티 데이터 센터
  • consul은mac 윈도우즈linux 등 기계에서 실행할 수 있습니다.
    Spring Cloud가 Etcd에 대한 지원이 부화기에서 나오지 않았기 때문에 현재로서는 대부분의 사용자들이 Eureka와 Consul을 사용하고 있다. 이전에 Eureka 2.0이 오픈되지 않았다는 소식과 일부 박안구의 제목당 매체로 인해 Eureka의 사용자가 줄어들었기 때문에 Spring Cloud를 선택한 사용자 그룹 중 많은 사용자들이 Consul을 선택하여 서비스 등록과 발견을 할 것이라고 믿는다.
    본 논문은 Spring Cloud의 최신 Finchley 버전 + Consul 1.2를 사용할 때 살펴보겠습니다.x시 가장 심각한 구덩이: 다중 실례 등록 문제.
    문제 해독
    문제: 이 문제는 개발 단계에서 반드시 발견할 수 있는 것은 아니지만 온라인에 여러 개의 실례를 배치할 때Consul에서 하나의 실례만 발견할 수 있습니다.
    원인: 이 문제의 주요 원인은 Spring Cloud Consul이 등록할 때 인스턴스 이름(Instance Id)이 "서비스 이름-포트 번호"( : {spring.application.name}-{server.port} )의 값을 사용했기 때문이다. 이 인스턴스 이름이 포트 번호를 바꾸지 않으면 인스턴스 이름이 모두 같다는 것을 볼 수 있다.Spring Cloud Consul에 익숙한 독자라면 오래된 버전도 이 규칙인데 왜 이런 문제가 없냐고 물어볼 수도 있다.주로 Consul이 실례의 유일성에 대한 판단 기준도 바뀌었기 때문에 구버전의 Consul에서 실례의 이름은 같지만 서비스 주소가 다르면 여전히 다른 실례라고 생각할 수 있다.Consul 1.2에서x에서 서비스 실례명은 집단의 유일한 표지가 되었기 때문에 상술한 문제를 초래했다.
    해결 방법
    기왕 원인을 알게 된 이상 우리가 그것을 해결하려면 목표를 세울 수 있다.다음은 두 가지 구체적인 해결 방법을 소개한다.
    메서드1: 속성 구성을 통해 새 규칙 지정
    다음은 예를 들어 spring.cloud.consul.discovery.instance-id 파라미터를 통해 실례 명명 규칙을 직접 설정합니다.이곳은 비교적 난폭하게 무작위 수를 통해 실례명을 조직한다.물론 이런 조직 방식은 좋지 않다. 무작위 수가 여전히 충돌할 가능성이 있기 때문에 당신은 더욱 책임감 있는 규칙으로 조직 실례명을 진행할 수 있다.
    spring.cloud.consul.discovery.instance-id=${spring.application.name}-${random.int[10000,99999]}
    메서드 2: ConsulServiceRegistry 확장을 통해 인스턴스 이름 재설정
    속성을 설정하는 방식을 통해 실례명을 정의하는 능력에 한계가 있기 때문에 우리는 더욱 유연한 방식으로 정의할 수 있기를 바란다.이때 우리는 다시 쓰기ConsulServiceRegistry register 방법을 통해 수정할 수 있다.예를 들어 아래의 실현:
    
    public class MyConsulServiceRegistry extends ConsulServiceRegistry {
    
      public MyConsulServiceRegistry(ConsulClient client, ConsulDiscoveryProperties properties, TtlScheduler ttlScheduler, HeartbeatProperties heartbeatProperties) {
        super(client, properties, ttlScheduler, heartbeatProperties);
      }
    
      @Override
      public void register(ConsulRegistration reg) {
        reg.getService().setId(reg.getService().getName() + “-” + reg.getService().getAddress() + “-” + reg.getService().getPort());
        super.register(reg);
      }
    }
    위에서'서비스명'-'ip주소'-'포트번호'를 연결하는 방식으로 절대적인 유일한 실례명을 구축하여 모든 서비스 실례가consul에 정확하게 등록될 수 있도록 하였다.
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기