Использование реестра служб Tanzu

Примечание.

Azure Spring Apps — это новое название службы Azure Spring Cloud. Старое название будет еще некоторое время встречаться в наших материалах, пока мы не обновим ресурсы, такие как снимки экрана, видео и схемы.

Эта статья относится к:❌ Basic/Standard ✔️ Enterprise

В этой статье показано, как использовать реестр служб VMware Tanzu с планом Azure Spring Apps Enterprise.

Реестр служб Tanzu представляет собой один из коммерческих компонентов VMware Tanzu. Этот компонент помогает применить шаблон конструктора обнаружения служб к приложениям.

Обнаружение служб — одна из основных идей архитектуры микрослужб. Без обнаружения служб необходимо вручную настроить каждого клиента службы или принять определенную форму соглашения о доступе. Этот процесс может быть сложным, и конфигурации и соглашения могут быть хрупкими в рабочей среде. Вместо этого можно использовать реестр служб Tanzu для динамического обнаружения и вызова зарегистрированных служб в приложении.

с планом Azure Spring Apps Enterprise вам не нужно создавать или запускать реестр служб самостоятельно. Реестр служб Tanzu можно использовать, выбрав его при создании экземпляра плана Azure Spring Apps Enterprise.

Необходимые компоненты

  • Уже подготовленный экземпляр плана Azure Spring Apps Enterprise с включенным реестром служб Tanzu. Дополнительные сведения см . в кратком руководстве по созданию и развертыванию приложений в Azure Spring Apps с помощью плана Enterprise.
  • Расширение плана Azure Spring Apps Enterprise. Используйте следующую команду, чтобы удалить предыдущие версии и установить последнее расширение плана Enterprise. Если вы ранее установили spring-cloud расширение, удалите его, чтобы избежать несоответствий конфигурации и версий.
    az extension add --upgrade --name spring
    az extension remove --name spring-cloud
    

Создание приложений, использующих реестр служб

В этой статье вы создадите две службы и зарегистрируйте их в реестре служб Azure Spring Apps. После регистрации одна служба сможет использовать реестр служб для обнаружения и вызова другой службы. На следующей схеме приведены необходимые действия.

Схема, на которой показаны шаги по созданию, развертыванию и регистрации службы A и службе B.

Данные шаги подробно описываются в следующих разделах.

  1. Создание службы A.
  2. Разверните службу A в Azure Spring Apps и зарегистрируйте ее в реестре служб.
  3. Создайте службу B и реализуйте ее для вызова Службы A.
  4. Разверните службу B и зарегистрируйте ее в реестре служб.
  5. Вызов службы A через службу B.

Создание переменной среды

В этой статье используются следующие переменные среды. Задайте эти переменные значениям, используемым при создании экземпляра плана Azure Spring Apps Enterprise.

«Переменная» Description
$RESOURCE_GROUP Имя группы ресурсов.
$AZURE_SPRING_APPS_NAME Имя экземпляра Azure Spring Apps.

Создание службы A с помощью Spring Boot

Перейдите к 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

Подтвердите конфигурацию зависимых библиотек для клиента Реестра служб (клиент Eureka)

Затем убедитесь, что файл pom.xml для проекта содержит следующую зависимость. Добавьте зависимость, если она отсутствует.

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

Реализация клиента реестра служб

Добавьте заметку @EnableEurekaClient в файл SampleServiceAApplication.java , чтобы настроить его как клиент 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 для тестирования

Теперь вы можете зарегистрировать службу в реестре служб, но ее нельзя проверить, пока не будет реализована конечная точка службы. Чтобы создать конечные точки 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 и регистрация в реестре служб

В этом разделе объясняется, как развернуть службу A в экземпляре плана Azure Spring Apps Enterprise и зарегистрировать его в реестре служб.

Создание приложения 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-адрес для проверки и обеспечивает доступ из внешней сети.

Подключение в реестр служб из приложения

После создания экземпляра службы с помощью Spring Boot и создания приложения в Azure Spring Apps необходимо развернуть приложение и подтвердить операцию. Однако перед этим необходимо привязать приложение к реестру служб, чтобы получить сведения о подключении из реестра.

Как правило, клиенту Eureka необходимо написать следующие параметры сведений о подключении в файле конфигурации application.properties приложения Spring Boot, чтобы подключиться к серверу:

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

Однако если эти параметры записываются непосредственно в приложении, необходимо повторно изменить и повторно перестроить проект при каждом изменении сервера реестра служб. Чтобы избежать этих усилий, Azure Spring Apps позволяет приложениям получать сведения о подключении из реестра служб путем привязки к нему. В частности, после привязки приложения к реестру служб можно получить сведения о подключении реестра служб (eureka.client.service-url.defaultZone) из переменной среды Java. Таким образом, вы можете подключиться к реестру служб, загрузив содержимое переменных среды при запуске приложения.

На практике в переменную добавляются JAVA_TOOL_OPTIONS следующие переменные среды:

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

Привязка службы к реестру служб

Используйте следующую команду, чтобы привязать службу к реестру служб Azure, что позволяет подключиться к серверу.

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

Вы также можете настроить привязки приложения из портал Azure, как показано на следующем снимке экрана:

Снимок экрана: портал Azure, на котором показана страница реестра служб с выделенным раскрывающимся списком привязки приложения.

Примечание.

Эти изменения потребуют несколько минут для распространения всех приложений при изменении состояния реестра служб.

При изменении состояния привязки или отмены привязки необходимо перезапустить или повторно развернуть приложение.

Теперь вы можете привязать приложение к реестру служб непосредственно при создании нового приложения с помощью следующих команд:

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

Вы также можете привязать приложение к реестру служб из портал Azure, как показано на следующем снимке экрана:

Снимок экрана: портал Azure, на котором показана страница

Развертывание приложения в 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                  -

Убедитесь, что приложение Service A запущено

Выходные данные предыдущей команды включают общедоступный URL-адрес службы. Чтобы получить доступ к конечной точке RESTful, добавьте /serviceA URL-адрес, как показано в следующей команде:

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.defaultZone добавляется в JAVA_TOOL_OPTIONS. Таким образом, приложение может зарегистрировать службу в реестре служб и сделать ее доступной из других служб.

Теперь вы можете зарегистрировать службу в реестре служб (Eureka Server) в Azure Spring Apps. Другие службы теперь могут получить доступ к службе с помощью реестра служб.

Реализация новой службы B, которая обращается к службе A через реестр служб

Реализация службы B с помощью Spring Boot

Перейдите к 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 в качестве клиента реестра служб (клиент Eureka)

Как и служба A, добавьте заметку @EnableEurekaClient в службу B, чтобы настроить ее как клиент 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

Затем реализуйте новую конечную точку службы (/invoke-serviceA), которая вызывает службу A. Добавьте в проект файл 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) для проверки. Эта реализация гарантирует правильность взаимодействия службы с реестром служб. Эту конечную точку можно вызвать, чтобы получить список приложений, зарегистрированных в реестре служб.

В этом примере вызывается служба A как http://servicea. Имя службы — это имя, указанное во время создания приложения Azure Spring Apps. (Например: az spring app create --name ServiceA.) Имя приложения совпадает с именем службы, зарегистрированным в реестре служб, что упрощает управление именем службы.

Сборка службы B

Чтобы создать проект, используйте следующую команду.

mvn clean package

Развертывание службы B в Azure Spring Apps

Используйте следующую команду, чтобы создать приложение в 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

Затем используйте следующую команду, чтобы привязать приложение к реестру служб.

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 и Service 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                  -

Вызов службы A из службы B

Выходные данные предыдущей команды включают общедоступный URL-адрес службы. Чтобы получить доступ к конечной точке RESTful, добавьте /invoke-serviceA URL-адрес, как показано в следующей команде:

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

Эта команда выдает следующий результат:

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

Получение некоторых сведений из реестра служб

Наконец, перейдите к конечной точке /list-all и получите некоторые сведения из реестра служб. Следующая команда извлекает список служб, зарегистрированных в реестре служб.

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

Эта команда создает следующие выходные данные.

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

Таким образом, вы можете получить подробные сведения из программы по мере необходимости.

Включение и отключение реестра служб после создания службы

После создания службы можно включить и отключить реестр служб с помощью портал Azure или Azure CLI. Перед отключением реестра служб необходимо отменить привязку всех приложений из него.

Чтобы включить или отключить реестр служб, выполните следующие действия с помощью портал Azure:

  1. Перейдите к ресурсу службы и выберите "Реестр служб".
  2. Выберите Управление.
  3. Выберите или отмените выбор реестра служб, а затем нажмите кнопку "Сохранить".
  4. Теперь можно просмотреть состояние реестра служб на странице реестра служб.

Следующие шаги