다음을 통해 공유


Azure Container Apps에서 Spring용 관리되는 유레카 서버에 연결

Eureka Server for Spring은 마이크로 서비스가 스스로 등록하고 다른 서비스를 검색할 수 있도록 하는 서비스 레지스트리입니다. 유레카 서버 for Spring은 Azure Container Apps 구성 요소로 사용할 수 있습니다. Eureka 서버에 자동 등록하기 위해 컨테이너 앱을 Spring용 Eureka Server에 바인딩할 수 있습니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • Spring Java 구성 요소용 Eureka Server를 만듭니다.
  • 컨테이너 앱을 Spring Java 구성 요소용 Eureka Server에 바인딩합니다.

중요한

이 자습서에서는 Azure 청구서에 영향을 줄 수 있는 서비스를 사용합니다. 따라가기로 결정한 경우 예기치 않은 청구를 방지하기 위해 이 문서에 포함된 리소스를 삭제해야 합니다.

필수 조건

고려 사항

Container Apps에서 Spring용 Eureka Server를 실행하는 경우 다음 세부 정보를 알고 있어야 합니다.

아이템 설명
범위 Spring용 Eureka Server 구성 요소는 연결된 컨테이너 앱과 동일한 환경에서 실행됩니다.
크기 조정 유레카 서버 for Spring 구성 요소의 크기를 조정할 수 없습니다. 크기 조정 속성 minReplicasmaxReplicas은(는) 모두 1(으)로 설정됩니다. 고가용성을 달성하려면 Container Apps에서 고가용성 Eureka 서비스 만들기를 참조 하세요.
리소스 Spring용 Eureka Server에 대한 컨테이너 리소스 할당이 수정되었습니다. CPU 코어 수는 다음과 이며 0.5메모리 크기는 1 Gi.
가격 책정 Spring용 Eureka Server 청구는 사용량 기반 가격 책정에 속합니다. 관리되는 Java 구성 요소에서 사용하는 리소스는 활성/유휴 요금으로 청구됩니다. 더 이상 사용하지 않는 구성 요소를 삭제하여 청구를 중지할 수 있습니다.
바인딩 컨테이너 앱은 바인딩을 통해 Spring용 Eureka Server 구성 요소에 연결합니다. 바인딩은 컨테이너 앱 환경 변수에 구성을 삽입합니다. 바인딩이 설정된 후 컨테이너 앱은 환경 변수에서 구성 값을 읽고 Spring용 Eureka Server 구성 요소에 연결할 수 있습니다.

설정

Spring용 Eureka Server 구성 요소 작업을 시작하기 전에 먼저 필요한 리소스를 만들어야 합니다.

다음 명령을 실행하여 컨테이너 앱 환경에서 리소스 그룹을 만듭니다.

  1. 애플리케이션 구성을 지원하는 변수를 만듭니다. 이러한 값은 이 단원의 목적을 위해 제공됩니다.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export EUREKA_COMPONENT_NAME=eureka
    export APP_NAME=my-eureka-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-eureka-client:latest"
    
    변수 설명
    LOCATION 컨테이너 앱 및 Java 구성 요소를 만드는 Azure 지역 위치입니다.
    ENVIRONMENT 데모 애플리케이션의 컨테이너 앱 환경 이름입니다.
    RESOURCE_GROUP 데모 애플리케이션의 Azure 리소스 그룹 이름입니다.
    EUREKA_COMPONENT_NAME 컨테이너 앱에 대해 만든 Java 구성 요소의 이름입니다. 이 경우 Spring Java 구성 요소에 대한 Eureka Server를 만듭니다.
    IMAGE 컨테이너 앱에 사용되는 컨테이너 이미지입니다.
  2. Azure CLI 사용하여 Azure 로그인합니다.

    az login
    
  3. 리소스 그룹을 만듭니다.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. 컨테이너 앱 환경을 만듭니다.

    az containerapp env create \
      --name $ENVIRONMENT \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION
    

Spring Java 구성 요소용 Eureka Server 만들기

이제 기존 환경이 있으므로 컨테이너 앱을 만들어서 Spring용 Eureka Server의 Java 구성 요소 인스턴스에 바인딩할 수 있습니다.

  1. Spring Java 구성 요소용 Eureka Server를 만듭니다.

    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
    
  2. 선택 사항: Spring Java 구성 요소 구성 요소용 Eureka Server를 업데이트합니다.

    az containerapp env java-component eureka-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
        --configuration eureka.server.renewal-percent-threshold=0.85 eureka.server.eviction-interval-timer-in-ms=10000
    

컨테이너 앱을 Spring Java 구성 요소용 Eureka Server에 바인딩

  1. 컨테이너 앱을 만들고 유레카 서버 for Spring 구성 요소에 바인딩합니다.

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --ingress external \
        --target-port 8080 \
        --bind $EUREKA_COMPONENT_NAME \
        --query properties.configuration.ingress.fqdn
    
  2. 향후 단계에서 사용할 수 있도록 앱의 URL을 텍스트 편집기로 복사합니다.

포털에서 컨테이너 앱으로 돌아갑니다. 향후 단계에서 사용할 수 있도록 앱의 URL을 텍스트 편집기로 복사합니다.

경로로 이동하여 /allRegistrationStatus 유레카 서버 for Spring 구성 요소에 등록된 모든 애플리케이션을 봅니다.

바인딩은 주로 eureka.client.service-url.defaultZone 속성인 환경 변수로 여러 구성을 애플리케이션에 삽입합니다. 이 속성은 Eureka Server Java 구성 요소의 내부 엔드포인트를 나타냅니다.

바인딩은 다음 속성도 삽입합니다.

"eureka.client.register-with-eureka":    "true"
"eureka.client.fetch-registry":          "true"
"eureka.instance.prefer-ip-address":     "true"

eureka.client.register-with-eureka 속성은 Eureka Server에 등록을 적용하기 위해 true(으)로 설정됩니다. 이 등록은 구성 서버 등에서 가져온 설정을 기준으로 application.properties의 로컬 설정을 덮어씁니다. false(으)로 설정하려면 컨테이너 앱에서 환경 변수를 설정하여 덮어쓸 수 있습니다.

eureka.instance.prefer-ip-address 속성은 컨테이너 애플리케이션 환경에서 특정 도메인 이름 시스템 해석 규칙 때문에 true로 설정됩니다. 바인딩을 중단하지 않도록 이 값을 수정하지 마세요.

선택 사항: Spring Java 구성 요소용 Eureka Server에서 컨테이너 앱 바인딩 해제

컨테이너 앱에서 바인딩을 제거하려면 --unbind 옵션을 사용합니다.

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

대시보드를 통해 애플리케이션 보기

중요한

대시보드를 보려면 관리되는 환경 리소스의 계정에 할당된 Microsoft.App/managedEnvironments/write 역할 이상이 있어야 합니다. 리소스에 Owner 대해 명시적으로 또는 Contributor 역할을 할당할 수 있습니다. 단계에 따라 사용자 지정 역할 정의를 만들고 계정에 할당할 수도 있습니다.

참고

21Vianet에서 운영하는 Azure 대시보드를 사용할 수 없습니다.

  1. 사용자 지정 역할 정의를 만듭니다.

    az role definition create --role-definition '{
        "Name": "<YOUR_ROLE_NAME>",
        "IsCustom": true,
        "Description": "Can access managed Java Component dashboards in managed environments",
        "Actions": [
            "Microsoft.App/managedEnvironments/write"
        ],
        "AssignableScopes": ["/subscriptions/<SUBSCRIPTION_ID>"]
    }'
    

    <SUBSCRIPTION_ID> 값에 포함된 AssignableScopes 표시를 사용자의 구독 ID로 반드시 변경해 주시기 바랍니다.

  2. 관리되는 환경 리소스의 계정에 사용자 지정 역할을 할당합니다.

    다음과 같이 관리 환경의 리소스 ID를 가져옵니다.

    export ENVIRONMENT_ID=$(az containerapp env show \
        --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    
  3. 사용자의 계정에 역할을 할당합니다.

    이 명령을 실행하기 전에 대괄호로 <> 표시된 자리 표시자를 사용자 또는 서비스 주체 ID 및 역할 이름으로 바꿉니다.

    az role assignment create \
        --assignee <USER_OR_SERVICE_PRINCIPAL_ID> \
        --role "<ROLE_NAME>" \
        --scope $ENVIRONMENT_ID
    

    참고

    <USER_OR_SERVICE_PRINCIPAL_ID> 값은 일반적으로 Azure 포털에 액세스하는 데 사용하는 ID여야 합니다. <ROLE_NAME> 값은 1단계에서 할당한 이름입니다.

  4. Spring용 유레카 서버 대시보드의 URL을 가져옵니다.

    az containerapp env java-component eureka-server-for-spring show \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME \
        --query properties.ingress.fqdn \
        --output tsv
    

    이 명령은 Spring용 Eureka Server 대시보드에 액세스하는 데 사용할 수 있는 URL을 반환합니다. 대시보드를 사용하면 다음 스크린샷과 같이 컨테이너 앱을 볼 수도 있습니다.

    Spring용 Eureka Server 대시보드를 보여 주는 스크린샷.

선택 사항: Spring 및 Admin for Spring Java 구성 요소에 대한 Eureka Server 통합

Spring용 Eureka 서버와 Spring Java 관리자 구성 요소를 통합하려면 보장 관리자를 Spring용 Eureka Server와 통합 참조하세요.

리소스 정리

이 자습서에서 만든 리소스는 Azure 청구서에 영향을 줍니다. 이러한 서비스를 장기적으로 사용하지 않을 경우 다음 명령을 실행하여 이 자습서에서 만든 모든 항목을 제거합니다.

az group delete --resource-group $RESOURCE_GROUP

Eureka Server for Spring에 허용되는 구성 목록

다음 섹션에서는 지원되는 구성에 대해 설명합니다. 자세한 내용은 Spring Cloud Eureka Server를 참조 하세요.

참고

새 기능 요청에 대한 지원 티켓을 제출할 수 있습니다.

구성 옵션

az containerapp update 명령은 --configuration 매개 변수를 사용하여 Spring용 Eureka Server를 구성하는 방법을 제어합니다. 여러 매개 변수를 공백으로 구분하면 한 번에 여러 매개 변수를 사용할 수 있습니다. 자세한 내용은 Spring Cloud Eureka Server를 참조 하세요.

구성 속성에서 eureka.server 사용할 수 있는 구성 설정은 다음과 같습니다.

이름 설명 기본값
eureka.server.enable-self-preservation 사용하도록 설정하면 서버는 서버에서 받아야 하는 갱신 횟수를 추적합니다. 갱신 수가 eureka.server.renewal-percent-threshold으로 정의된 임계값 백분율 아래로 떨어지면. 기본값은 원래 Eureka 서버에서 true로 설정되지만 Eureka Server Java 구성 요소에서 기본값은 false로 설정됩니다. Spring Java 구성 요소의 Eureka Server 제한 사항을 참조하세요. false
eureka.server.renewal-percent-threshold 에 지정된 eureka.server.renewal-threshold-update-interval-ms기간 동안 클라이언트에서 예상되는 최소 갱신 비율입니다. 갱신이 임계값 아래로 떨어지면 사용 가능한 경우 eureka.server.enable-self-preservation 만료가 비활성화됩니다. 0.85
eureka.server.renewal-threshold-update-interval-ms 임계값(지정된 eureka.server.renewal-percent-threshold 대로)을 업데이트해야 하는 간격입니다. 0
eureka.server.expected-client-renewal-interval-seconds 클라이언트가 하트비트를 보낼 것으로 예상되는 간격. 기본값은 30초입니다. 클라이언트가 15초마다 다른 빈도로 하트비트를 보내는 경우 이 매개 변수를 적절하게 조정해야 합니다. 그렇지 않으면 자체 보존이 예상대로 작동하지 않습니다. 30
eureka.server.response-cache-auto-expiration-in-seconds 변경 이벤트가 무효화되지 않는 경우 레지스트리 페이로드를 캐시에 유지해야 하는 시간을 가져옵니다. 180
eureka.server.response-cache-update-interval-ms 클라이언트의 페이로드 캐시를 업데이트해야 하는 시간 간격을 가져옵니다. 0
eureka.server.use-read-only-response-cache com.netflix.eureka.registry.ResponseCache은 현재 응답에 대해 2단계 캐싱 전략을 사용합니다. 만료 정책이 있는 readWrite 캐시 및 만료 없이 캐시되는 readonly 캐시입니다. true
eureka.server.disable-delta 델타 정보가 클라이언트에 제공될 수 있는지 확인합니다. false
eureka.server.retention-time-in-m-s-in-delta-queue 클라이언트가 값을 놓치지 않고 검색할 수 있도록 델타 정보를 캐시해야 하는 시간을 가져옵니다. 0
eureka.server.delta-retention-timer-interval-in-ms 정리 작업이 만료된 델타 정보를 확인하기 위해 주기적으로 깨어나 실행되는 시간 간격을 가져옵니다. 0
eureka.server.eviction-interval-timer-in-ms 인스턴스를 만료시키기 위한 작업이 실행되도록, 깨어나야 하는 시간 간격을 설정합니다. 60000
eureka.server.sync-when-timestamp-differs 타임스탬프가 다를 때 인스턴스를 동기화할지 여부를 확인합니다. true
eureka.server.rate-limiter-enabled 속도 제한기를 사용하도록 설정할지 사용하지 않도록 설정할지 여부를 나타냅니다. false
eureka.server.rate-limiter-burst-size 속도 제한기, 토큰 버킷 알고리즘 속성입니다. 10
eureka.server.rate-limiter-registry-fetch-average-rate 속도 제한기, 토큰 버킷 알고리즘 속성입니다. 평균 적용 요청 속도를 지정합니다. 500
eureka.server.rate-limiter-privileged-clients 표준 eureka Java 클라이언트 외에도 인증된 클라이언트 목록입니다. N/A
eureka.server.rate-limiter-throttle-standard-clients 속도 제한 표준 클라이언트인지 여부를 나타냅니다. false(으)로 설정하면 비표준 클라이언트만 속도가 제한됩니다. false
eureka.server.rate-limiter-full-fetch-average-rate 속도 제한기, 토큰 버킷 알고리즘 속성입니다. 평균 적용 요청 속도를 지정합니다. 100

일반 구성

  • 관련 구성 로깅
    • logging.level.*
    • logging.group.*
    • 네임스페이스 아래의 logging.* 다른 모든 구성은 금지되어야 합니다. 예를 들어 사용하여 logging.file 로그 파일을 작성하는 것은 금지되어야 합니다.

애플리케이션 간 호출

이 예제에서는 Java 코드를 작성하여 Eureka Server for Spring 구성 요소에 등록된 애플리케이션 간에 호출하는 방법을 보여 줍니다. 컨테이너 앱이 Eureka와 바인딩되면 Eureka 서버를 통해 서로 통신합니다.

이 예제에서는 호출자와 호출 수신자라는 두 개의 애플리케이션을 만듭니다. 두 애플리케이션 모두 Eureka Server for Spring 구성 요소를 사용하여 서로 통신합니다. 수신 애플리케이션은 호출자 애플리케이션이 호출할 수 있는 엔드포인트를 제공합니다.

  1. 호출 대상 애플리케이션을 생성하십시오. 주 클래스에 @EnableDiscoveryClient 주석을 추가하여 Spring Boot 애플리케이션에서 Eureka 클라이언트를 사용하도록 설정합니다.

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CalleeApplication {
      public static void main(String[] args) {
        SpringApplication.run(CalleeApplication.class, args);
      }
    }
    
  2. 호출 애플리케이션이 수신자 애플리케이션을 호출할 수 있도록 엔드포인트를 생성합니다.

    @RestController
    public class CalleeController {
    
        @GetMapping("/call")
        public String calledByCaller() {
            return "Hello from Application callee!";
        }
    }
    
  3. 애플리케이션 구성 파일에서 호출 수신자 애플리케이션의 이름을 설정합니다(예: application.yml).

    spring.application.name=callee
    
  4. 호출자 애플리케이션을 만듭니다.

    @EnableDiscoveryClient 주석을 추가하여 Eureka 클라이언트 기능을 사용하도록 설정합니다. 또한 WebClient.Builder 주석을 사용하여 @LoadBalanced 빈을 만들어 다른 서비스에 대한 부하 분산 호출을 수행합니다.

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CallerApplication {
      public static void main(String[] args) {
        SpringApplication.run(CallerApplication.class, args);
      }
    
      @Bean
      @LoadBalanced
      public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
      }
    }
    
  5. 호출 애플리케이션은 WebClient.Builder 을 활용하여, 수신 측 애플리케이션의 이름을 통해 자신을 호출할 수 있도록 지원하는 컨트롤러를 생성합니다.

    @RestController
    public class CallerController {
        @Autowired
        private WebClient.Builder webClientBuilder;
    
        @GetMapping("/call-callee")
        public Mono<String> callCallee() {
            return webClientBuilder.build()
                .get()
                .uri("http://callee/call")
                .retrieve()
                .bodyToMono(String.class);
        }
    }
    

이제 Spring Java 구성 요소용 Eureka Server를 사용하여 서로 통신하는 호출자 및 호출 수신자 애플리케이션이 있습니다. 호출자 애플리케이션에서 /call-callee 엔드포인트를 테스트하기 전에 두 애플리케이션이 실행 중이고 Eureka 서버와 바인딩되어 있는지 확인합니다.

제한 사항

  • Eureka Server Java 구성 요소에는 기본 설정 eureka.server.enable-self-preservation이 있으며, 값은 false로 설정됩니다. 이 기본 구성은 자체 보존을 사용하도록 설정한 후 인스턴스가 삭제되지 않는 시간을 피하는 데 도움이 됩니다. 인스턴스가 너무 일찍 삭제되면 일부 요청이 존재하지 않는 인스턴스로 전달될 수 있습니다. 이 설정을 true 변경하려면 Java 구성 요소에서 고유한 구성을 설정하여 덮어쓸 수 있습니다.
  • Eureka 대시보드는 21Vianet에서 운영하는 Azure 사용할 수 없습니다.

다음 단계

Azure Container Apps에서 고가용성의 Eureka 서버 구성 요소 클러스터를 생성하기

Spring용 관리형 관리자와 Spring용 유레카 서버 통합