Share via


Använda Tanzu Service Registry

Kommentar

Azure Spring Apps är det nya namnet på Azure Spring Cloud-tjänsten. Även om tjänsten har ett nytt namn ser du det gamla namnet på vissa platser ett tag medan vi arbetar med att uppdatera tillgångar som skärmbilder, videor och diagram.

Den här artikeln gäller för:❌ Basic/Standard ✔️ Enterprise

Den här artikeln visar hur du använder VMware Tanzu Service Registry med Azure Spring Apps Enterprise-planen.

Tanzu Service Registry är en av de kommersiella VMware Tanzu-komponenterna. Den här komponenten hjälper dig att använda designmönstret för tjänstidentifiering för dina program.

Tjänstidentifiering är en av huvudidéerna i mikrotjänstarkitekturen. Utan tjänstidentifiering skulle du behöva handkonfigurera varje klient för en tjänst eller anta någon form av åtkomstkonvention. Den här processen kan vara svår och konfigurationerna och konventionerna kan vara spröda i produktionen. I stället kan du använda Tanzu Service Registry för att dynamiskt identifiera och anropa registrerade tjänster i ditt program.

Med Azure Spring Apps Enterprise-planen behöver du inte skapa eller starta tjänstregistret själv. Du kan använda Tanzu Service Registry genom att välja det när du skapar din Azure Spring Apps Enterprise-planinstans.

Förutsättningar

  • En redan etablerad Azure Spring Apps Enterprise-planinstans med Tanzu Service Registry aktiverat. Mer information finns i Snabbstart: Skapa och distribuera appar till Azure Spring Apps med hjälp av Enterprise-planen.
  • Azure Spring Apps Enterprise-plantillägget. Använd följande kommando för att ta bort tidigare versioner och installera det senaste Enterprise-plantillägget. Om du tidigare har installerat spring-cloud tillägget avinstallerar du det för att undvika konfigurations- och versionsmatchningar.
    az extension add --upgrade --name spring
    az extension remove --name spring-cloud
    

Skapa program som använder Service Registry

I den här artikeln skapar du två tjänster och registrerar dem med Azure Spring Apps Service Registry. Efter registreringen kan en tjänst använda Service Registry för att identifiera och anropa den andra tjänsten. Följande diagram sammanfattar de steg som krävs:

Diagram som visar stegen för att skapa, distribuera och registrera tjänst A och tjänst B.

De här stegen beskrivs mer detaljerat i följande avsnitt.

  1. Skapa tjänst A.
  2. Distribuera Service A till Azure Spring Apps och registrera den med Service Registry.
  3. Skapa service B och implementera den för att anropa Service A.
  4. Distribuera Service B och registrera den med Service Registry.
  5. Anropa tjänst A via service B.

Skapa miljövariabler

I den här artikeln används följande miljövariabler. Ange de här variablerna till de värden som du använde när du skapade din Azure Spring Apps Enterprise-planinstans.

Olika beskrivning
$RESOURCE_GROUP Namn på resursgrupp.
$AZURE_SPRING_APPS_NAME Azure Spring Apps-instansnamn.

Skapa service A med Spring Boot

Gå till Spring Initializr för att skapa exempeltjänst A. Den här länken använder följande URL för att initiera inställningarna.

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

Följande skärmbild visar Spring Initializr med nödvändiga inställningar.

Skärmbild av sidan Spring Initializr som visar de inställningar som krävs.

Välj sedan GENERERA för att hämta ett exempelprojekt för Spring Boot med följande katalogstruktur.

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

Bekräfta konfigurationen av beroende bibliotek för Service Registry-klienten (Eureka-klienten)

Bekräfta sedan att den pom.xml filen för projektet innehåller följande beroende. Lägg till beroendet om det saknas.

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

Implementera Service Registry-klienten

Lägg till en @EnableEurekaClient anteckning i filen SampleServiceAApplication.java för att konfigurera den som en Eureka-klient.

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

Skapa en REST-slutpunkt för testning

Nu kan du registrera tjänsten till Service Registry, men du kan inte verifiera den förrän du implementerar en tjänstslutpunkt. Om du vill skapa RESTful-slutpunkter som externa tjänster kan anropa lägger du till en ServiceAEndpoint.java fil i projektet med följande kod.

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

Skapa en Spring Boot-app

Nu när du har en enkel tjänst kompilerar och skapar du källkoden genom att köra följande kommando:

mvn clean package

Distribuera tjänst A och registrera med Service Registry

Det här avsnittet beskriver hur du distribuerar Service A till en Azure Spring Apps Enterprise-planinstans och registrerar den med Service Registry.

Skapa ett Azure Spring Apps-program

Skapa först ett program i Azure Spring Apps med hjälp av följande kommando:

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

Argumentet --assign-endpoint beviljar en offentlig IP-adress för validering och ger åtkomst från det externa nätverket.

Anslut till tjänstregistret från appen

När du har skapat en tjänstinstans med Spring Boot och skapat ett program i Azure Spring Apps distribuerar du programmet och bekräftar åtgärden. Innan dess måste du dock binda programmet till tjänstregistret så att det kan hämta anslutningsinformation från registret.

Vanligtvis måste en Eureka-klient skriva följande inställningar för anslutningsinformation i konfigurationsfilen application.properties för ett Spring Boot-program så att du kan ansluta till servern:

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

Men om du skriver de här inställningarna direkt i ditt program måste du redigera om och återskapa projektet igen varje gång Service Registry-servern ändras. För att undvika detta gör Azure Spring Apps det möjligt för dina program att hämta anslutningsinformation från tjänstregistret genom att binda till det. När du har bindt programmet till Service Registry kan du hämta anslutningsinformationen för tjänstregistret (eureka.client.service-url.defaultZone) från Java-miljövariabeln. På så sätt kan du ansluta till tjänstregistret genom att läsa in innehållet i miljövariablerna när programmet startar.

I praktiken läggs följande miljövariabler till i variabeln JAVA_TOOL_OPTIONS :

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

Binda en tjänst till tjänstregistret

Använd följande kommando för att binda tjänsten till Azure Service Registry så att den kan ansluta till servern.

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

Du kan också konfigurera programbindningarna från Azure-portalen, enligt följande skärmbild:

Skärmbild av Azure-portalen som visar sidan Service Registry med listrutan Appbindning markerad.

Kommentar

De här ändringarna tar några minuter att sprida till alla program när tjänstens registerstatus ändras.

Om du ändrar bindnings-/avbindningsstatusen måste du starta om eller distribuera om programmet.

Nu kan du välja att binda programmet till tjänstregistret direkt när du skapar en ny app med hjälp av följande kommandon:

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

Du kan också binda ditt program till Service Registry från Azure-portalen, enligt följande skärmbild:

Skärmbild av Azure-portalen som visar sidan Skapa app med listrutan Bind markerad.

Distribuera ett program till Azure Spring Apps

Nu när du har bundit programmet distribuerar du Spring Boot-artefaktfilen Sample-Service-A-A-0.0.1-SNAPSHOT.jar till Azure Spring Apps. Använd följande kommando för att distribuera:

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"

Använd följande kommando för att se om distributionen lyckas.

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

Det här kommandot genererar utdata som liknar följande exempel.

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                  -

Bekräfta att Service A-programmet körs

Utdata från föregående kommando innehåller den offentliga URL:en för tjänsten. Om du vill komma åt RESTful-slutpunkten lägger du /serviceA till url:en enligt följande kommando:

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

Det här kommandot genererar följande utdata.

This is a result of Service A

Service A innehåller en RESTful-slutpunkt som visar en lista över miljövariabler. Få åtkomst till slutpunkten med /env för att se miljövariablerna, som du ser i följande kommando:

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

Det här kommandot genererar följande utdata.

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

Som du ser eureka.client.service-url.defaultZone läggs till i JAVA_TOOL_OPTIONS. På så sätt kan programmet registrera tjänsten i tjänstregistret och göra den tillgänglig från andra tjänster.

Nu kan du registrera tjänsten i Service Registry (Eureka Server) i Azure Spring Apps. Andra tjänster kan nu komma åt tjänsten med hjälp av tjänstregistret.

Implementera en ny tjänst B som har åtkomst till Service A via Service Registry

Implementera Service B med Spring Boot

Gå till Spring Initializr för att skapa ett nytt projekt för Service B. Den här länken använder följande URL för att initiera inställningarna:

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

Välj sedan GENERERA för att hämta det nya projektet.

Implementera Service B som en tjänstregisterklient (Eureka-klient)

Precis som Service A lägger du till anteckningen @EnableEurekaClient i Service B för att konfigurera den som en Eureka-klient.

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

Implementera tjänstslutpunkter i Service B

Implementera sedan en ny tjänstslutpunkt (/invoke-serviceA) som anropar Tjänst A. Lägg till en ServiceBEndpoint.java fil i projektet med följande kod.

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

Det här exemplet används RestTemplate för enkelhetens skull. Slutpunkten returnerar svarssträngen med en annan sträng (INVOKE SERVICE A FROM SERVICE B: ") för att indikera att den anropades av Service B.

Det här exemplet implementerar också en annan slutpunkt (/list-all) för validering. Den här implementeringen säkerställer att tjänsten kommunicerar korrekt med tjänstregistret. Du kan anropa den här slutpunkten för att hämta listan över program som är registrerade i tjänstregistret.

I det här exemplet anropas Service A som http://servicea. Tjänstnamnet är det namn som du angav när du skapade Azure Spring Apps-programmet. (Till exempel: az spring app create --name ServiceA.) Programnamnet matchar tjänstnamnet som du registrerade i tjänstregistret, vilket gör det enklare att hantera tjänstnamnet.

Skapa tjänst B

Använd följande kommando för att skapa projektet.

mvn clean package

Distribuera Service B till Azure Spring Apps

Använd följande kommando för att skapa ett program i Azure Spring Apps för att distribuera Service B.

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

Använd sedan följande kommando för att binda programmet till tjänstregistret.

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

Använd sedan följande kommando för att distribuera tjänsten.

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"

Använd sedan följande kommando för att kontrollera programmets status.

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

Om Service A och Service B distribueras korrekt genererar det här kommandot utdata som liknar följande exempel.

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                  -

Anropa tjänst A från tjänst B

Utdata från föregående kommando innehåller den offentliga URL:en för tjänsten. Om du vill komma åt RESTful-slutpunkten lägger du /invoke-serviceA till url:en enligt följande kommando:

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

Det här kommandot genererar följande utdata:

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

Hämta lite information från Service Registry

Slutligen får du åtkomst till /list-all slutpunkten och hämtar viss information från tjänstregistret. Följande kommando hämtar en lista över tjänster som är registrerade i tjänstregistret.

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

Det här kommandot genererar följande utdata.

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

På så sätt kan du få detaljerad information från programmet efter behov.

Aktivera/inaktivera Tjänstregister när tjänsten har skapats

Du kan aktivera och inaktivera Service Registry när tjänsten har skapats med hjälp av Azure-portalen eller Azure CLI. Innan du inaktiverar Service Registry måste du avbinda alla dina appar från det.

Använd följande steg för att aktivera eller inaktivera Service Registry med hjälp av Azure-portalen:

  1. Gå till tjänstresursen och välj sedan Tjänstregister.
  2. Välj Hantera.
  3. Välj eller avmarkera Aktivera tjänstregister och välj sedan Spara.
  4. Nu kan du visa tillståndet för Service Registry på sidan Service Registry .

Nästa steg