Korzystanie z rejestru usługi Tanzu

Uwaga

Azure Spring Apps to nowa nazwa usługi Azure Spring Cloud. Mimo że usługa ma nową nazwę, stara nazwa będzie widoczna w niektórych miejscach przez pewien czas, ponieważ pracujemy nad aktualizowaniem zasobów, takich jak zrzuty ekranu, filmy wideo i diagramy.

Ten artykuł dotyczy:❌ Podstawowa/Standardowa ✔️ Enterprise

W tym artykule pokazano, jak używać rejestru usługi VMware Tanzu z planem Azure Spring Apps Enterprise.

Rejestr usługi Tanzu jest jednym z komercyjnych składników VMware Tanzu. Ten składnik pomaga zastosować wzorzec projektowania odnajdywania usług do aplikacji.

Odnajdywanie usług to jeden z głównych pomysłów architektury mikrousług. Bez odnajdywania usług należy ręcznie skonfigurować każdego klienta usługi lub przyjąć jakąś formę konwencji dostępu. Ten proces może być trudny, a konfiguracje i konwencje mogą być kruche w środowisku produkcyjnym. Zamiast tego możesz użyć rejestru usługi Tanzu do dynamicznego odnajdywania i wywoływania zarejestrowanych usług w aplikacji.

w ramach planu Usługi Azure Spring Apps Enterprise nie musisz samodzielnie tworzyć ani uruchamiać rejestru usług. Rejestr usługi Tanzu można użyć, wybierając go podczas tworzenia wystąpienia planu Usługi Azure Spring Apps Enterprise.

Wymagania wstępne

  • Już aprowizowane wystąpienie planu Usługi Azure Spring Apps Enterprise z włączoną usługą Tanzu Service Registry. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie i wdrażanie aplikacji w usłudze Azure Spring Apps przy użyciu planu Enterprise.
  • Rozszerzenie planu Usługi Azure Spring Apps Enterprise. Użyj następującego polecenia, aby usunąć poprzednie wersje i zainstalować najnowsze rozszerzenie planu Enterprise. Jeśli wcześniej zainstalowano spring-cloud rozszerzenie, odinstaluj je, aby uniknąć niezgodności konfiguracji i wersji.
    az extension add --upgrade --name spring
    az extension remove --name spring-cloud
    

Tworzenie aplikacji korzystających z rejestru usług

W tym artykule utworzysz dwie usługi i zarejestrujesz je w usłudze Azure Spring Apps Service Registry. Po rejestracji jedna usługa będzie mogła używać rejestru usług do odnajdywania i wywoływania drugiej usługi. Na poniższym diagramie przedstawiono podsumowanie wymaganych kroków:

Diagram przedstawiający kroki tworzenia, wdrażania i rejestrowania usług A i Service B.

Te kroki opisano bardziej szczegółowo w poniższych sekcjach.

  1. Utwórz usługę A.
  2. Wdróż usługę A w usłudze Azure Spring Apps i zarejestruj ją w rejestrze usług.
  3. Utwórz usługę B i zaimplementuj ją w celu wywołania usługi A.
  4. Wdróż usługę B i zarejestruj ją w rejestrze usług.
  5. Wywoływanie usługi A za pośrednictwem usługi B.

Tworzenie zmiennych środowiskowych

W tym artykule są używane następujące zmienne środowiskowe. Ustaw te zmienne na wartości użyte podczas tworzenia wystąpienia planu Usługi Azure Spring Apps Enterprise.

Zmienna opis
$RESOURCE_GROUP Nazwa grupy zasobów.
$AZURE_SPRING_APPS_NAME Nazwa wystąpienia usługi Azure Spring Apps.

Tworzenie usługi A przy użyciu platformy Spring Boot

Przejdź do narzędzia Spring Initializr , aby utworzyć przykładową usługę A. Ten link używa następującego adresu URL do zainicjowania ustawień.

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

Poniższy zrzut ekranu przedstawia narzędzie Spring Initializr z wymaganymi ustawieniami.

Zrzut ekranu przedstawiający stronę Spring Initializr z wymaganymi ustawieniami.

Następnie wybierz pozycję GENERUJ , aby pobrać przykładowy projekt dla platformy Spring Boot z następującą strukturą katalogów.

├── 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

Potwierdź konfigurację bibliotek zależnych dla klienta rejestru usług (klient Eureka)

Następnie upewnij się, że plik pom.xml dla projektu zawiera następującą zależność. Dodaj zależność, jeśli jej brakuje.

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

Implementowanie klienta rejestru usług

Dodaj adnotację @EnableEurekaClient do pliku SampleServiceAApplication.java , aby skonfigurować ją jako klienta 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);
    }
}

Tworzenie punktu końcowego REST na potrzeby testowania

Możesz teraz zarejestrować usługę w rejestrze usług, ale nie możesz jej zweryfikować, dopóki nie zaimplementujesz punktu końcowego usługi. Aby utworzyć punkty końcowe RESTful, które mogą wywoływać usługi zewnętrzne, dodaj plik ServiceAEndpoint.java do projektu przy użyciu następującego kodu.

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;
    }
}

Kompilowanie aplikacji platformy Spring Boot

Teraz, gdy masz prostą usługę, skompiluj i skompiluj kod źródłowy, uruchamiając następujące polecenie:

mvn clean package

Wdrażanie usługi A i rejestrowanie w rejestrze usług

W tej sekcji wyjaśniono, jak wdrożyć usługę A w wystąpieniu planu Usługi Azure Spring Apps Enterprise i zarejestrować ją w rejestrze usług.

Tworzenie aplikacji usługi Azure Spring Apps

Najpierw utwórz aplikację w usłudze Azure Spring Apps przy użyciu następującego polecenia:

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

Argument --assign-endpoint przyznaje publiczny adres IP do weryfikacji i umożliwia dostęp z sieci zewnętrznej.

Połączenie do rejestru usług z aplikacji

Po utworzeniu wystąpienia usługi za pomocą platformy Spring Boot i utworzeniu aplikacji w usłudze Azure Spring Apps należy wdrożyć aplikację i potwierdzić operację. Przed tym należy jednak powiązać aplikację z rejestrem usług, aby można było uzyskać informacje o połączeniu z rejestru.

Zazwyczaj klient Eureka musi zapisać następujące ustawienia informacji o połączeniu w pliku konfiguracji application.properties aplikacji Spring Boot, aby można było nawiązać połączenie z serwerem:

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

Jeśli jednak zapiszesz te ustawienia bezpośrednio w aplikacji, musisz ponownie edytować i ponownie ponownie skompilować projekt przy każdym zmianie serwera rejestru usług. Aby uniknąć tego nakładu pracy, usługa Azure Spring Apps umożliwia aplikacjom uzyskiwanie informacji o połączeniu z rejestru usług przez powiązanie z nim. W szczególności po powiązaniu aplikacji z rejestrem usług można uzyskać informacje o połączeniu rejestru usług (eureka.client.service-url.defaultZone) ze zmiennej środowiskowej Java. W ten sposób można nawiązać połączenie z rejestrem usług, ładując zawartość zmiennych środowiskowych po uruchomieniu aplikacji.

W praktyce do zmiennej JAVA_TOOL_OPTIONS są dodawane następujące zmienne środowiskowe:

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

Wiązanie usługi z rejestrem usług

Użyj następującego polecenia, aby powiązać usługę z usługą Azure Service Registry, umożliwiając jej nawiązanie połączenia z serwerem.

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

Powiązania aplikacji można również skonfigurować w witrynie Azure Portal, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu witryny Azure Portal przedstawiający stronę Rejestru usług z wyróżnioną listą rozwijaną Powiązanie aplikacji.

Uwaga

Propagowanie tych zmian do wszystkich aplikacji po zmianie stanu rejestru usługi potrwa kilka minut.

Jeśli zmienisz stan powiązania/odłączania, musisz ponownie uruchomić lub ponownie wdrożyć aplikację.

Teraz możesz powiązać aplikację z rejestrem usług bezpośrednio podczas tworzenia nowej aplikacji przy użyciu następujących poleceń:

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

Aplikację można również powiązać z rejestrem usług w witrynie Azure Portal, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu witryny Azure Portal przedstawiający stronę Tworzenie aplikacji z wyróżnioną listą rozwijaną Wiązanie.

Wdrażanie aplikacji w usłudze Azure Spring Apps

Po powiązaniu aplikacji wdróż plik artefaktu Spring Boot Sample-Service-A-A-0.0.1-SNAPSHOT.jar w usłudze Azure Spring Apps. Aby wdrożyć, użyj następującego polecenia:

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"

Użyj następującego polecenia, aby sprawdzić, czy wdrożenie zakończyło się pomyślnie.

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

To polecenie generuje dane wyjściowe podobne do poniższego przykładu.

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                  -

Upewnij się, że aplikacja Service A jest uruchomiona

Dane wyjściowe poprzedniego polecenia zawierają publiczny adres URL usługi. Aby uzyskać dostęp do punktu końcowego RESTful, dołącz go /serviceA do adresu URL, jak pokazano w poniższym poleceniu:

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

To polecenie generuje następujące dane wyjściowe.

This is a result of Service A

Usługa A zawiera punkt końcowy RESTful, który wyświetla listę zmiennych środowiskowych. Uzyskaj dostęp do punktu końcowego za pomocą /env polecenia , aby wyświetlić zmienne środowiskowe, jak pokazano w poniższym poleceniu:

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

To polecenie generuje następujące dane wyjściowe.

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

Jak widać, eureka.client.service-url.defaultZone jest dodawany do elementu JAVA_TOOL_OPTIONS. W ten sposób aplikacja może zarejestrować usługę w rejestrze usług i udostępnić ją z innych usług.

Teraz możesz zarejestrować usługę w rejestrze usług (Eureka Server) w usłudze Azure Spring Apps. Inne usługi mogą teraz uzyskiwać dostęp do usługi przy użyciu rejestru usług.

Implementowanie nowej usługi B, która uzyskuje dostęp do usługi A za pośrednictwem rejestru usług

Implementowanie usługi B przy użyciu platformy Spring Boot

Przejdź do narzędzia Spring Initializr , aby utworzyć nowy projekt dla usługi B. Ten link używa następującego adresu URL do zainicjowania ustawień:

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

Następnie wybierz pozycję GENERUJ , aby pobrać nowy projekt.

Implementowanie klienta usługi B jako rejestru usług (klient Eureka)

Podobnie jak usługa A, dodaj adnotację @EnableEurekaClient do usługi B, aby skonfigurować ją jako klienta 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);
    }
}

Implementowanie punktów końcowych usługi w usłudze B

Następnie zaimplementuj nowy punkt końcowy usługi (/invoke-serviceA), który wywołuje usługę A. Dodaj plik ServiceBEndpoint.java do projektu przy użyciu następującego kodu.

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;
    }
}

W tym przykładzie użyto RestTemplate dla uproszczenia. Punkt końcowy zwraca ciąg odpowiedzi z innym ciągiem (INVOKE SERVICE A FROM SERVICE B: "), aby wskazać, że został wywołany przez usługę B.

W tym przykładzie zaimplementowany jest również inny punkt końcowy (/list-all) na potrzeby walidacji. Ta implementacja gwarantuje, że usługa komunikuje się prawidłowo z rejestrem usług. Ten punkt końcowy można wywołać, aby uzyskać listę aplikacji zarejestrowanych w rejestrze usług.

W tym przykładzie usługa A jest wywoływana jako http://servicea. Nazwa usługi to nazwa określona podczas tworzenia aplikacji Azure Spring Apps. (Na przykład: az spring app create --name ServiceA.) Nazwa aplikacji jest zgodna z nazwą usługi zarejestrowaną w rejestrze usług, co ułatwia zarządzanie nazwą usługi.

Kompilowanie usługi B

Użyj następującego polecenia, aby skompilować projekt.

mvn clean package

Wdrażanie usługi B w usłudze Azure Spring Apps

Użyj następującego polecenia, aby utworzyć aplikację w usłudze Azure Spring Apps w celu wdrożenia usługi B.

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

Następnie użyj następującego polecenia, aby powiązać aplikację z rejestrem usług.

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

Następnie użyj następującego polecenia, aby wdrożyć usługę.

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"

Następnie użyj następującego polecenia, aby sprawdzić stan aplikacji.

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

Jeśli usługa A i usługa B są prawidłowo wdrożone, to polecenie generuje dane wyjściowe podobne do poniższego przykładu.

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                  -

Wywoływanie usługi A z usługi B

Dane wyjściowe poprzedniego polecenia zawierają publiczny adres URL usługi. Aby uzyskać dostęp do punktu końcowego RESTful, dołącz go /invoke-serviceA do adresu URL, jak pokazano w poniższym poleceniu:

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

To polecenie generuje następujące dane wyjściowe:

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

Uzyskiwanie informacji z rejestru usług

Na koniec uzyskaj dostęp do punktu końcowego /list-all i pobierz informacje z rejestru usług. Następujące polecenie pobiera listę usług zarejestrowanych w rejestrze usług.

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

To polecenie generuje następujące dane wyjściowe.

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

W ten sposób można uzyskać szczegółowe informacje z programu zgodnie z potrzebami.

Włączanie/wyłączanie rejestru usług po utworzeniu usługi

Rejestr usług można włączyć i wyłączyć po utworzeniu usługi przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure. Przed wyłączeniem rejestru usług wymagane jest usunięcie powiązania wszystkich aplikacji z niego.

Aby włączyć lub wyłączyć usługę Service Registry przy użyciu witryny Azure Portal, wykonaj następujące kroki:

  1. Przejdź do zasobu usługi, a następnie wybierz pozycję Rejestr usług.
  2. Zaznacz Zarządzaj.
  3. Wybierz lub usuń zaznaczenie rejestru usług, a następnie wybierz pozycję Zapisz.
  4. Stan rejestru usług można teraz wyświetlić na stronie Rejestr usług.

Następne kroki