다음을 통해 공유


Tanzu Service Registry 사용

참고 항목

기본, 표준엔터프라이즈 계획은 2025년 3월 중순부터 사용되지 않으며 3년의 은퇴 기간이 있습니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 사용 중지 공지 사항을 참조하세요.

표준 소비 및 전용 계획은 2024년 9월 30일부터 사용되지 않으며 6개월 후에 완전히 종료됩니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 표준 사용량 및 전용 계획을 Azure Container Apps로 마이그레이션을 참조 하세요.

이 문서의 적용 대상:❌ 기본/표준 ✔️ 엔터프라이즈

이 문서에서는 Azure Spring Apps 엔터프라이즈 플랜과 함께 VMware Tanzu Service Registry를 사용하는 방법을 보여 줍니다.

Tanzu Service Registry는 상용 VMware Tanzu 구성 요소 중 하나입니다. 이 구성 요소는 애플리케이션에 서비스 검색 디자인 패턴을 적용하는 데 도움이 됩니다.

서비스 검색은 마이크로 서비스 아키텍처의 주요 아이디어 중 하나입니다. 서비스 검색이 없으면 서비스의 각 클라이언트를 직접 구성하거나 일종의 액세스 규칙을 도입해야 합니다. 이 프로세스는 어려울 수 있으며 구성 및 규칙은 프로덕션 환경에서 불안정할 수 있습니다. 대신 Tanzu Service Registry를 사용하여 애플리케이션에 등록된 서비스를 동적으로 검색하고 호출할 수 있습니다.

Azure Spring Apps 엔터프라이즈 플랜을 사용하면 서비스 레지스트리를 직접 만들거나 시작할 필요가 없습니다. Azure Spring Apps 엔터프라이즈 플랜 인스턴스를 만들 때 Tanzu Service Registry를 선택하여 사용할 수 있습니다.

필수 조건

  • Tanzu Service Registry가 사용하도록 설정된 이미 프로비저닝된 Azure Spring Apps 엔터프라이즈 플랜 인스턴스입니다. 자세한 내용은 빠른 시작: 엔터프라이즈 플랜을 사용하여 Azure Spring Apps에 앱 빌드 및 배포를 참조하세요.
  • Azure Spring Apps Enterprise 계획 확장입니다. 다음 명령을 사용하여 이전 버전을 제거하고 최신 엔터프라이즈 플랜 확장을 설치합니다. 이전에 spring-cloud 확장을 설치한 경우 구성 및 버전 불일치를 방지하기 위해 이 확장을 제거합니다.
    az extension add --upgrade --name spring
    az extension remove --name spring-cloud
    

Service Registry를 사용하는 애플리케이션 만들기

이 문서에서는 두 개의 서비스를 만들고 Azure Spring Apps Service Registry에 등록합니다. 등록 후 한 서비스는 Service Registry를 사용하여 다른 서비스를 검색하고 호출할 수 있습니다. 다음 다이어그램에는 필요한 단계가 요약되어 있습니다.

서비스 A 및 서비스 B를 만들고, 배포하고, 등록하는 단계를 보여 주는 다이어그램

각 단계에 대해서는 다음 섹션에서 자세하게 설명합니다.

  1. 서비스 A를 만듭니다.
  2. Azure Spring Apps에 서비스 A를 배포하고 Service Registry에 등록합니다.
  3. 서비스 B를 만들고 서비스 A를 호출하도록 구현합니다.
  4. 서비스 B를 배포하고 Service Registry에 등록합니다.
  5. 서비스 B를 통해 서비스 A를 호출합니다.

환경 변수 만들기

이 문서에서는 다음 환경 변수를 사용합니다. 이러한 변수를 Azure Spring Apps 엔터프라이즈 플랜 인스턴스를 만들 때 사용한 값으로 설정합니다.

변수 설명
$RESOURCE_GROUP 리소스 그룹 이름
$AZURE_SPRING_APPS_NAME Azure Spring Apps 인스턴스 이름입니다.

Spring Boot를 사용하여 서비스 A 만들기

Spring Initializr로 이동하여 샘플 서비스 A를 만듭니다. 이 링크는 다음 URL을 사용하여 설정을 초기화합니다.

https://start.spring.io/#!type=maven-project&language=java&packaging=jar&groupId=com.example&artifactId=Sample%20Service%20A&name=Sample%20Service%20A&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.Sample%20Service%20A&dependencies=web,cloud-eureka

다음 스크린샷은 필요한 설정이 적용된 Spring Initializr를 보여 줍니다.

필요한 설정을 보여 주는 Spring Initializr 페이지의 스크린샷

다음으로, GENERATE(생성)를 선택하여 다음 디렉터리 구조를 사용하는 Spring Boot에 대한 샘플 프로젝트를 가져옵니다.

├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── Sample
    │   │               └── Service
    │   │                   └── A
    │   │                       └── SampleServiceAApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── example
                    └── Sample
                        └── Service
                            └── A
                                └── SampleServiceAApplicationTests.java

Service Registry 클라이언트의 종속 라이브러리 구성 확인(Eureka 클라이언트)

다음으로, 프로젝트의 pom.xml 파일에 다음 종속성이 포함되어 있는지 확인합니다. 누락된 경우 종속성을 추가합니다.

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

Service Registry 클라이언트 구현

SampleServiceAApplication.java 파일에 @EnableEurekaClient 주석을 추가하여 Eureka 클라이언트로 구성합니다.

package com.example.Sample.Service.A;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class SampleServiceAApplication {

    public static void main(String[] args) {
        SpringApplication.run(SampleServiceAApplication.class, args);
    }
}

테스트를 위한 REST 엔드포인트 만들기

이제 Service Registry에 서비스를 등록할 수 있지만 서비스 엔드포인트를 구현할 때까지는 확인할 수 없습니다. 외부 서비스에서 호출할 수 있는 RESTful 엔드포인트를 만들려면 다음 코드를 사용하여 ServiceAEndpoint.java 파일을 프로젝트에 추가합니다.

package com.example.Sample.Service.A;
import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServiceAEndpoint {

    @GetMapping("/serviceA")
    public String getServiceA(){
        return "This is a result of Service A";
    }

    @GetMapping("/env")
    public Map<String, String> getEnv(){
        Map<String, String> env = System.getenv();
        return env;
    }
}

Spring Boot 애플리케이션 빌드

이제 간단한 서비스가 있으므로 다음 명령을 실행하여 소스 코드를 컴파일하고 빌드합니다.

mvn clean package

서비스 A를 배포하고 Service Registry에 등록

이 섹션에서는 서비스 A를 Azure Spring Apps 엔터프라이즈 플랜 인스턴스에 배포하고 Service Registry에 등록하는 방법을 설명합니다.

Azure Spring Apps 애플리케이션 만들기

먼저 다음 명령을 사용하여 Azure Spring Apps에서 애플리케이션을 만듭니다.

az spring app create \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME  \
    --name serviceA \
    --instance-count 1 \
    --memory 2Gi \
    --assign-endpoint

--assign-endpoint 인수는 유효성 검사를 위해 공용 IP를 부여하고 외부 네트워크에서 액세스할 수 있도록 합니다.

앱에서 Service Registry에 연결

Spring Boot를 사용하여 서비스 인스턴스를 만들고 Azure Spring Apps에서 애플리케이션을 만든 후 애플리케이션을 배포하고 작업을 확인합니다. 그러나 그 전에 Service Registry에서 연결 정보를 가져올 수 있도록 애플리케이션을 레지스트리에 바인딩해야 합니다.

일반적으로 Eureka 클라이언트는 서버에 연결할 수 있도록 Spring Boot 애플리케이션의 application.properties 구성 파일에 다음 연결 정보 설정을 작성해야 합니다.

eureka.client.service-url.defaultZone=http://eureka:8761/eureka/

그러나 애플리케이션에서 이러한 설정을 직접 작성하는 경우 Service Registry 서버가 변경 될 때마다 프로젝트를 다시 재편집하고 재빌드해야 합니다. 이러한 수고를 방지하기 위해 Azure Spring Apps는 애플리케이션이 서비스 레지스트리에 바인딩하여 연결 정보를 가져올 수 있도록 합니다. 특히 애플리케이션을 Service Registry에 바인딩한 후 Java 환경 변수에서 서비스 레지스트리 연결 정보(eureka.client.service-url.defaultZone)를 가져올 수 있습니다. 이렇게 하면 애플리케이션이 시작될 때 환경 변수의 콘텐츠를 로드하여 Service Registry에 연결할 수 있습니다.

실제로 다음 환경 변수가 JAVA_TOOL_OPTIONS 변수에 추가됩니다.

-Deureka.client.service-url.defaultZone=https://$AZURE_SPRING_APPS_NAME.svc.azuremicroservices.io/eureka/default/eureka

Service Registry에 서비스 바인딩

다음 명령을 사용하여 Azure Service Registry에 서비스를 바인딩하여 서버에 연결할 수 있도록 합니다.

az spring service-registry bind \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME \
    --app serviceA

다음 스크린샷과 같이 Azure Portal에서 애플리케이션 바인딩을 설정할 수도 있습니다.

앱 바인딩 드롭다운이 강조 표시된 서비스 레지스트리 페이지를 보여 주는 Azure Portal의 스크린샷

참고 항목

서비스 레지스트리 상태가 변경될 때 모든 애플리케이션에 이러한 변경 내용이 전파되려면 몇 분 정도 걸립니다.

바인딩/바인딩 해제 상태를 변경하는 경우 애플리케이션을 다시 시작하거나 다시 배포해야 합니다.

이제 다음 명령을 사용하여 새 앱을 만들 때 애플리케이션을 Service Registry에 직접 바인딩하도록 선택할 수 있습니다.

az spring app create \
    --resource-group <resource-group> \
    --service <service-name> \
    --name <app-name> \
    --bind-service-registry

다음 스크린샷과 같이 Azure Portal에서 Service Registry에 애플리케이션을 바인딩할 수도 있습니다.

바인딩 드롭다운이 강조 표시된 앱 만들기 페이지를 보여 주는 Azure Portal의 스크린샷

Azure Spring Apps에 애플리케이션 배포

이제 애플리케이션을 바인딩했으므로 Spring Boot 아티팩트 파일 Sample-Service-A-A-0.0.1-SNAPSHOT.jar을 Azure Spring Apps에 배포합니다. 배포하려면 다음 명령을 사용합니다.

az spring app deploy \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME \
    --name serviceA \
    --artifact-path ./target/Sample-Service-A-0.0.1-SNAPSHOT.jar \
    --jvm-options="-Xms1024m -Xmx1024m"

다음 명령을 사용하여 배포가 성공했는지 확인합니다.

az spring app list \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME \
    --output table

이 명령은 다음 예제와 유사한 출력을 생성합니다.

Name                      Location       ResourceGroup           Public Url                                                           Production Deployment    Provisioning State    CPU    Memory    Running Instance    Registered Instance    Persistent Storage    Bind Service Registry    Bind Application Configuration Service
------------------------  -------------  ----------------------  -------------------------------------------------------------------  -----------------------  --------------------  -----  --------  ------------------  ---------------------  --------------------  -----------------------  ----------------------------------------
servicea                  southeastasia  $RESOURCE_GROUP         https://$AZURE_SPRING_APPS_NAME-servicea.azuremicroservices.io       default                  Succeeded             1      2Gi       1/1                 N/A                    -                     default                  -

서비스 A 애플리케이션이 실행 중인지 확인

이전 명령의 출력에는 서비스의 공용 URL이 포함되어 있습니다. RESTful 엔드포인트에 액세스하려면 다음 명령과 같이 URL에 /serviceA를 추가합니다.

curl https://$AZURE_SPRING_APPS_NAME-servicea.azuremicroservices.io/serviceA

이 명령은 다음과 같은 출력을 생성합니다.

This is a result of Service A

서비스 A에는 환경 변수 목록을 표시하는 RESTful 엔드포인트가 포함되어 있습니다. 다음 명령과 같이 /env를 통해 엔드포인트에 액세스하여 환경 변수를 확인합니다.

curl https://$AZURE_SPRING_APPS_NAME-servicea.azuremicroservices.io/env

이 명령은 다음과 같은 출력을 생성합니다.

"JAVA_TOOL_OPTIONS":"-Deureka.client.service-url.defaultZone=https://$AZURE_SPRING_APPS_NAME.svc.azuremicroservices.io/eureka/default/eureka

보이는 바와 같이 eureka.client.service-url.defaultZoneJAVA_TOOL_OPTIONS에 추가되었습니다. 이러한 방식으로 애플리케이션은 서비스를 Service Registry에 등록하고 다른 서비스에서 사용할 수 있도록 할 수 있습니다.

이제 Azure Spring Apps의 Service Registry(Eureka Server)에 서비스를 등록할 수 있습니다. 이제 다른 서비스는 서비스 레지스트리를 사용하여 서비스에 액세스할 수 있습니다.

Service Registry를 통해 서비스 A에 액세스하는 새 서비스 B 구현

Spring Boot를 사용하여 서비스 B 구현

Spring Initializr로 이동하여 서비스 B의 새 프로젝트를 만듭니다. 이 링크는 다음 URL을 사용하여 설정을 초기화합니다.

https://start.spring.io/#!type=maven-project&language=java&packaging=jar&groupId=com.example&artifactId=Sample%20Service%20B&name=Sample%20Service%20B&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.Sample%20Service%20B&dependencies=web,cloud-eureka

그런 다음, GENERATE(생성)를 선택하여 새 프로젝트를 가져옵니다.

서비스 B를 Service Registry 클라이언트(Eureka 클라이언트)로 구현

서비스 A와 마찬가지로 서비스 B에 @EnableEurekaClient 주석을 추가하여 Eureka 클라이언트로 구성합니다.

package com.example.Sample.Service.B;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class SampleServiceBApplication {

    public static void main(String[] args) {
        SpringApplication.run(SampleServiceBApplication.class, args);
    }
}

서비스 B에서 서비스 엔드포인트 구현

다음으로, 서비스 A를 호출하는 새 서비스 엔드포인트(/invoke-serviceA)를 구현합니다. 다음 코드를 사용하여 ServiceBEndpoint.java 파일을 프로젝트에 추가합니다.

package com.example.Sample.Service.B;
import java.util.List;
import java.util.stream.Collectors;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.shared.Application;
import com.netflix.discovery.shared.Applications;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ServiceBEndpoint {
    @Autowired
    private EurekaClient discoveryClient;

    @GetMapping(value = "/invoke-serviceA")
    public String invokeServiceA()
    {
        RestTemplate  restTemplate = new RestTemplate();
        String response = restTemplate.getForObject("http://servicea/serviceA",String.class);
        return "INVOKE SERVICE A FROM SERVICE B: " + response;
    }

    @GetMapping(value = "/list-all")
    public List<String> listsAllServices() {
        Applications applications = discoveryClient.getApplications();
        List<Application> registeredApplications = applications.getRegisteredApplications();
        List<String> appNames = registeredApplications.stream().map(app -> app.getName()).collect(Collectors.toList());
        return appNames;
    }
}

이 예제에서는 단순한 설명을 위해 RestTemplate을 사용합니다. 엔드포인트는 다른 문자열(INVOKE SERVICE A FROM SERVICE B: ")이 있는 응답 문자열을 반환하여 서비스 B에서 호출했음을 나타냅니다.

이 예제에서는 유효성 검사를 위해 다른 엔드포인트(/list-all)도 구현합니다. 이 구현은 서비스가 Service Registry와 올바르게 통신하도록 합니다. 이 엔드포인트를 호출하여 Service Registry에 등록된 애플리케이션 목록을 가져올 수 있습니다.

이 예제에서는 서비스 A를 http://servicea로 호출합니다. 서비스 이름은 Azure Spring Apps 애플리케이션을 만드는 동안 지정한 이름입니다. (예: az spring app create --name ServiceA.) 애플리케이션 이름은 서비스 레지스트리에 등록한 서비스 이름과 일치하므로 서비스 이름을 더 쉽게 관리할 수 있습니다.

서비스 B 빌드

다음 명령을 사용하여 프로젝트를 빌드합니다.

mvn clean package

Azure Spring Apps에 서비스 B 배포

다음 명령을 사용하여 Azure Spring Apps에서 서비스 B를 배포하는 애플리케이션을 만듭니다.

az spring app create \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME \
    --name serviceB \
    --instance-count 1 \
    --memory 2Gi \
    --assign-endpoint

그리고 다음 명령을 사용하여 애플리케이션을 Service Registry에 바인딩합니다.

az spring service-registry bind \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME \
    --app serviceB

다음으로, 다음 명령을 사용하여 서비스를 배포합니다.

az spring app deploy \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME \
    --name serviceB \
    --artifact-path ./target/Sample-Service-B-0.0.1-SNAPSHOT.jar \
    --jvm-options="-Xms1024m -Xmx1024m"

다음 명령을 사용하여 애플리케이션의 상태를 확인합니다.

az spring app list \
    --resource-group $RESOURCE_GROUP \
    --service $AZURE_SPRING_APPS_NAME \
    --output table

서비스 A와 서비스 B가 올바르게 배포된 경우 이 명령은 다음 예와 유사한 출력을 생성합니다.

Name      Location       ResourceGroup           Public Url                                                       Production Deployment    Provisioning State    CPU    Memory    Running Instance    Registered Instance    Persistent Storage    Bind Service Registry    Bind Application Configuration Service
--------  -------------  ----------------------  ---------------------------------------------------------------  -----------------------  --------------------  -----  --------  ------------------  ---------------------  --------------------  -----------------------  ----------------------------------------
servicea  southeastasia  SpringCloud-Enterprise  https://$AZURE_SPRING_APPS_NAME-servicea.azuremicroservices.io  default                  Succeeded             1      2Gi       1/1                 1/1                    -                     default                  -
serviceb  southeastasia  SpringCloud-Enterprise  https://$AZURE_SPRING_APPS_NAME-serviceb.azuremicroservices.io  default                  Succeeded             1      2Gi       1/1                 1/1                    -                     default                  -

서비스 B에서 서비스 A 호출

이전 명령의 출력에는 서비스의 공용 URL이 포함되어 있습니다. RESTful 엔드포인트에 액세스하려면 다음 명령과 같이 URL에 /invoke-serviceA를 추가합니다.

curl https://$AZURE_SPRING_APPS_NAME-serviceb.azuremicroservices.io/invoke-serviceA

이 명령에서 생성되는 출력은 다음과 같습니다.

INVOKE SERVICE A FROM SERVICE B: This is a result of Service A

Service Registry에서 일부 정보 가져오기

마지막으로, /list-all 엔드포인트에 액세스하고 Service Registry에서 일부 정보를 검색합니다. 다음 명령은 Service Registry에 등록된 서비스 목록을 검색합니다.

curl https://$AZURE_SPRING_APPS_NAME-serviceb.azuremicroservices.io/list-all

이 명령은 다음과 같은 출력을 생성합니다.

["SERVICEA","EUREKA-SERVER","SERVICEB"]

이러한 방식으로 필요에 따라 프로그램에서 자세한 정보를 가져올 수 있습니다.

서비스를 만든 후 서비스 레지스트리 사용/사용 안 함

Azure Portal 또는 Azure CLI를 사용하여 서비스를 만든 후 서비스 레지스트리를 사용하거나 사용하지 않도록 설정할 수 있습니다. 서비스 레지스트리를 사용하지 않도록 설정하기 전에 모든 앱을 바인딩 해제해야 합니다.

다음 단계를 사용하여 Azure Portal로 서비스 레지스트리를 사용하거나 사용하지 않도록 설정합니다.

  1. 서비스 리소스로 이동한 다음, 서비스 레지스트리를 선택합니다.
  2. 관리를 선택합니다.
  3. 서비스 레지스트리 사용을 선택하거나 선택 취소한 다음 저장을 선택합니다.
  4. 이제 서비스 레지스트리 페이지에서 서비스 레지스트리의 상태를 볼 수 있습니다 .

다음 단계