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 구성 요소의 크기를 조정할 수 없습니다. 크기 조정 속성 minReplicas 및 maxReplicas은(는) 모두 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 구성 요소 작업을 시작하기 전에 먼저 필요한 리소스를 만들어야 합니다.
다음 명령을 실행하여 컨테이너 앱 환경에서 리소스 그룹을 만듭니다.
애플리케이션 구성을 지원하는 변수를 만듭니다. 이러한 값은 이 단원의 목적을 위해 제공됩니다.
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컨테이너 앱에 사용되는 컨테이너 이미지입니다. Azure CLI 사용하여 Azure 로그인합니다.
az login리소스 그룹을 만듭니다.
az group create --name $RESOURCE_GROUP --location $LOCATION컨테이너 앱 환경을 만듭니다.
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
Spring Java 구성 요소용 Eureka Server 만들기
이제 기존 환경이 있으므로 컨테이너 앱을 만들어서 Spring용 Eureka Server의 Java 구성 요소 인스턴스에 바인딩할 수 있습니다.
Spring Java 구성 요소용 Eureka Server를 만듭니다.
az containerapp env java-component eureka-server-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $EUREKA_COMPONENT_NAME선택 사항: 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에 바인딩
컨테이너 앱을 만들고 유레카 서버 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향후 단계에서 사용할 수 있도록 앱의 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 대시보드를 사용할 수 없습니다.
사용자 지정 역할 정의를 만듭니다.
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로 반드시 변경해 주시기 바랍니다.관리되는 환경 리소스의 계정에 사용자 지정 역할을 할당합니다.
다음과 같이 관리 환경의 리소스 ID를 가져옵니다.
export ENVIRONMENT_ID=$(az containerapp env show \ --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)사용자의 계정에 역할을 할당합니다.
이 명령을 실행하기 전에 대괄호로
<>표시된 자리 표시자를 사용자 또는 서비스 주체 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단계에서 할당한 이름입니다.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 및 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 구성 요소를 사용하여 서로 통신합니다. 수신 애플리케이션은 호출자 애플리케이션이 호출할 수 있는 엔드포인트를 제공합니다.
호출 대상 애플리케이션을 생성하십시오. 주 클래스에
@EnableDiscoveryClient주석을 추가하여 Spring Boot 애플리케이션에서 Eureka 클라이언트를 사용하도록 설정합니다.@SpringBootApplication @EnableDiscoveryClient public class CalleeApplication { public static void main(String[] args) { SpringApplication.run(CalleeApplication.class, args); } }호출 애플리케이션이 수신자 애플리케이션을 호출할 수 있도록 엔드포인트를 생성합니다.
@RestController public class CalleeController { @GetMapping("/call") public String calledByCaller() { return "Hello from Application callee!"; } }애플리케이션 구성 파일에서 호출 수신자 애플리케이션의 이름을 설정합니다(예: application.yml).
spring.application.name=callee호출자 애플리케이션을 만듭니다.
@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(); } }호출 애플리케이션은
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 서버 구성 요소 클러스터를 생성하기