Использование реестра служб Tanzu
Примечание.
Планы "Базовый", "Стандартный" и "Корпоративный" будут устарели начиная с середины марта 2025 г. с 3-летнего периода выхода на пенсию. Рекомендуется перейти в приложения контейнеров Azure. Дополнительные сведения см. в объявлении о выходе на пенсию в Azure Spring Apps.
Стандартный план потребления и выделенного плана будет устарел с 30 сентября 2024 г. с полным завершением работы после шести месяцев. Рекомендуется перейти в приложения контейнеров Azure. Дополнительные сведения см. в статье "Миграция потребления Azure Spring Apps Standard" и выделенного плана в приложения контейнеров Azure.
Эта статья относится к:❌ 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.
- Разверните службу A в Azure Spring Apps и зарегистрируйте ее в реестре служб.
- Создайте службу B и реализуйте ее для вызова Службы A.
- Разверните службу B и зарегистрируйте ее в реестре служб.
- Вызов службы 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 с необходимыми параметрами.
Затем выберите 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, как показано на следующем снимке экрана:
Примечание.
Эти изменения потребуют несколько минут для распространения всех приложений при изменении состояния реестра служб.
При изменении состояния привязки или отмены привязки необходимо перезапустить или повторно развернуть приложение.
Теперь вы можете привязать приложение к реестру служб непосредственно при создании нового приложения с помощью следующих команд:
az spring app create \
--resource-group <resource-group> \
--service <service-name> \
--name <app-name> \
--bind-service-registry
Вы также можете привязать приложение к реестру служб из портал 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:
- Перейдите к ресурсу службы и выберите "Реестр служб".
- Выберите Управление.
- Выберите или отмените выбор реестра служб, а затем нажмите кнопку "Сохранить".
- Теперь можно просмотреть состояние реестра служб на странице реестра служб.