SpringCloud Eureka 서비스 등록 실현 과정

1.서 비 스 를 Eureka 에 등록 합 니 다.
SpringBoot 애플 리 케 이 션 이 Spring Cloud 환경(Greenwich.SR3 버 전)에 등록 하려 면 절차 가 간단 합 니 다.
pom.xml 에 실행 기 추가:spring-cloud-starter-netflix-eureka-client;
추가 설정:eureka.client.serviceUrl.defaultZone:http://localhost:8100/eureka/;
응용 프로그램 시작 하기;
등록 센터 가 정상 이면 등록 센터 에서 이 앱 을 발견 할 수 있 습 니 다.아래 그림 의 빨 간 상자 와 같 습 니 다.

spring.factories 의 설정 에 따라 Eureka Client AutoConfiguration 의 설정 은 모두 유효 합 니 다.다음 코드 가 되 돌아 오 는 bean 을 포함 합 니 다.

@Bean
public DiscoveryClient discoveryClient(EurekaInstanceConfig config, EurekaClient client) {
  return new EurekaDiscoveryClient(config, client);
}
spring 용기 가 초기 화 될 때 모든 단일 bean 을 예화 합 니 다.Eureka Client AutoConfiguration 의 discovery Client 방법 을 실행 하여 이 bean 인 스 턴 스 를 가 져 옵 니 다.그래서 Eureka Discovery Client 대상 을 만 들 었 습 니 다.
EurekaDiscoveryClient 의 구조 방법 에 주의 하 십시오.두 번 째 입 참 은 com.netflix.discovery.EurekaClient 유형 입 니 다.이 대상 은 EurekaClient AutoConfiguration 류 에서 왔 습 니 다.다음 과 같은 방법 입 니 다.

@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)
@org.springframework.cloud.context.config.annotation.RefreshScope
@Lazy
public EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config, EurekaInstanceConfig instance) {
  manager.getInfo(); // force initialization
  return new CloudEurekaClient(manager, config, this.optionalArgs,this.context);
}
CloudEureka Client 의 부모 클래스 com.netflix.discovery.Discovery Client 는 넷 플 릭 스 가 발표 한 eureka-client 패키지 에서 왔 기 때문에 이렇게 이해 할 수 있 습 니 다.Eureka Discovery Client 류 는 대리 신분 입 니 다.진정한 서비스 등록 발견 은 넷 플 릭 스에 의뢰 한 오픈 소스 패키지 입 니 다.저 희 는 SpringCloud 가 제공 하 는 서비스 등록 발견 기능 을 열심히 사용 할 수 있 습 니 다.Eureka Discovery Client 만 알 면 됩 니 다.진정한 서 비 스 는 eureka-client 로 이 루어 집 니 다.
다음은 com.netflix.discovery.Discovery Client 의 구조 방법 에 주목 해 야 한다.이 안 에는 서비스 등록 의 논리 가 있 기 때문에 전체 구조 방법의 내용 이 너무 많 기 때문에 모두 자세히 볼 필요 가 없고 관건 적 인 코드 만 보면 된다.
Discovery Client 의 구조 방법 중 가장 익숙 한 것 은 아래 그림 의 빨 간 상자 에서 이 로그 가 출력 된 것 입 니 다.
다음 빨간색 상자 와 같은 응용 프로그램 시작 로그 에 이 로그 출력 이 있 습 니 다.

빨 간 상자 에 있 는'us-east-1'은 기본 region 입 니 다.설정 류 Eureka Client ConfigBean 에서 왔 습 니 다.이 안 에는 각종 eureka 와 관련 된 설정 정보 와 기본 설정 이 있 습 니 다.다음 그림 과 같 습 니 다.

DiscoveryClient 의 구조 방법 을 계속 보 세 요.서비스 등록 과 관련 된 initScheduled Tasks 방법 이 여기 서 호출 되 었 습 니 다.다음 그림:

initScheduled Tasks 방법의 내용 은 다음 과 같 습 니 다.중국어 주석 에 주의 하 십시오.

  private void initScheduledTasks() {
    //          
    if (clientConfig.shouldFetchRegistry()) {
      //             
      int registryFetchIntervalSeconds = clientConfig.getRegistryFetchIntervalSeconds();
      int expBackOffBound = clientConfig.getCacheRefreshExecutorExponentialBackOffBound();
      //          
      scheduler.schedule(
          new TimedSupervisorTask(
              "cacheRefresh",
              scheduler,
              cacheRefreshExecutor,
              registryFetchIntervalSeconds,
              TimeUnit.SECONDS,
              expBackOffBound,
              new CacheRefreshThread() //            
          ),
          registryFetchIntervalSeconds, TimeUnit.SECONDS);
    }
    if (clientConfig.shouldRegisterWithEureka()) {
      //         
      int renewalIntervalInSecs = instanceInfo.getLeaseInfo().getRenewalIntervalInSecs();
      int expBackOffBound = clientConfig.getHeartbeatExecutorExponentialBackOffBound();
      //         ,   :Starting heartbeat executor: renew interval is: 30
      logger.info("Starting heartbeat executor: " + "renew interval is: " + renewalIntervalInSecs);
      //     
      scheduler.schedule(
          new TimedSupervisorTask(
              "heartbeat",
              scheduler,
              heartbeatExecutor,
              renewalIntervalInSecs,
              TimeUnit.SECONDS,
              expBackOffBound,
              new HeartbeatThread() //            
          ),
          renewalIntervalInSecs, TimeUnit.SECONDS);

      //  Runable          
      instanceInfoReplicator = new InstanceInfoReplicator(
          this,
          instanceInfo,
          clientConfig.getInstanceInfoReplicationIntervalSeconds(),
          2); // burstSize

      statusChangeListener = new ApplicationInfoManager.StatusChangeListener() {
        @Override
        public String getId() {
          return "statusChangeListener";
        }

        @Override
        public void notify(StatusChangeEvent statusChangeEvent) {
          if (InstanceStatus.DOWN == statusChangeEvent.getStatus() ||
              InstanceStatus.DOWN == statusChangeEvent.getPreviousStatus()) {
            // log at warn level if DOWN was involved
            logger.warn("Saw local status change event {}", statusChangeEvent);
          } else {
            logger.info("Saw local status change event {}", statusChangeEvent);
          }
          instanceInfoReplicator.onDemandUpdate();
        }
      };

      if (clientConfig.shouldOnDemandUpdateStatusChange()) {
        applicationInfoManager.registerStatusChangeListener(statusChangeListener);
      }
      //    
      instanceInfoReplicator.start(clientConfig.getInitialInstanceInfoReplicationIntervalSeconds());
    } else {
      logger.info("Not registering with Eureka server per configuration");
    }
  }
상기 코드 중 몇 가지 주의해 야 할 점 이 있 습 니 다.이 관건 들 은 뒤의 장 에서 계속 전 개 될 것 입 니 다.
a.주기 적 으로 서비스 목록 을 업데이트 합 니 다.
b.주기 적 인 서비스 재계약;
c.서비스 등록 논 리 는 Runnable 구현 클래스 인 InstanceInfoReplicator 에 넣 어 새 스 레 드 에서 실 행 됩 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기