Tanzu-serviceregister gebruiken

Notitie

Azure Spring Apps is de nieuwe naam voor de Azure Spring Cloud-service. Hoewel de service een nieuwe naam heeft, ziet u de oude naam op sommige plaatsen terwijl we werken aan het bijwerken van assets, zoals schermopnamen, video's en diagrammen.

Dit artikel is van toepassing op:❌ Basic/Standard ✔️ Enterprise

In dit artikel leest u hoe u VMware Tanzu Service Registry gebruikt met het Azure Spring Apps Enterprise-abonnement.

Tanzu Service Registry is een van de commerciële VMware Tanzu-onderdelen. Met dit onderdeel kunt u het ontwerppatroon voor servicedetectie toepassen op uw toepassingen.

Servicedetectie is een van de belangrijkste ideeën van de microservicesarchitectuur. Zonder servicedetectie moet u elke client van een service handmatig configureren of een vorm van toegangsconventie aannemen. Dit proces kan moeilijk zijn en de configuraties en conventies kunnen in productie broos zijn. In plaats daarvan kunt u het Tanzu-serviceregister gebruiken om geregistreerde services in uw toepassing dynamisch te detecteren en aan te roepen.

met het Azure Spring Apps Enterprise-abonnement hoeft u het serviceregister niet zelf te maken of te starten. U kunt het Tanzu-serviceregister gebruiken door het te selecteren wanneer u uw Azure Spring Apps Enterprise-abonnementexemplaren maakt.

Vereisten

  • Een al ingericht Azure Spring Apps Enterprise-planexemplaren waarvoor Tanzu Service Registry is ingeschakeld. Zie quickstart: Apps bouwen en implementeren in Azure Spring Apps met behulp van het Enterprise-abonnement voor meer informatie.
  • De Azure Spring Apps Enterprise-abonnementsextensie. Gebruik de volgende opdracht om eerdere versies te verwijderen en de nieuwste Enterprise-abonnementsextensie te installeren. Als u de extensie eerder hebt geïnstalleerd, verwijdert u deze spring-cloud om te voorkomen dat de configuratie en versie niet overeenkomen.
    az extension add --upgrade --name spring
    az extension remove --name spring-cloud
    

Toepassingen maken die gebruikmaken van Service Registry

In dit artikel maakt u twee services en registreert u deze bij Azure Spring Apps Service Registry. Na de registratie kan de ene service serviceregister gebruiken om de andere service te detecteren en aan te roepen. In het volgende diagram ziet u een overzicht van de vereiste stappen:

Diagram met de stappen voor het maken, implementeren en registreren van Service A en Service B.

Deze stappen worden uitgebreid beschreven in de volgende secties.

  1. Service A maken.
  2. Implementeer Service A in Azure Spring Apps en registreer deze bij Service Registry.
  3. Maak Service B en implementeer deze om Service A aan te roepen.
  4. Implementeer Service B en registreer deze bij Service Registry.
  5. Service A aanroepen via service B.

Omgevingsvariabelen maken

In dit artikel worden de volgende omgevingsvariabelen gebruikt. Stel deze variabelen in op de waarden die u hebt gebruikt bij het maken van uw Azure Spring Apps Enterprise-planexemplaren.

Variabele Beschrijving
$RESOURCE_GROUP Naam van de resourcegroep.
$AZURE_SPRING_APPS_NAME De naam van het Azure Spring Apps-exemplaar.

Service A maken met Spring Boot

Navigeer naar Spring Initializr om voorbeeldservice A te maken. Deze koppeling gebruikt de volgende URL om de instellingen te initialiseren.

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

In de volgende schermopname ziet u Spring Initializr met de vereiste instellingen.

Schermopname van de Spring Initializr-pagina met de vereiste instellingen.

Selecteer vervolgens GENERATE om een voorbeeldproject voor Spring Boot op te halen met de volgende mapstructuur.

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

De configuratie van afhankelijke bibliotheken voor de Service Registry-client (Eureka-client) bevestigen

Controleer vervolgens of het pom.xml-bestand voor het project de volgende afhankelijkheid bevat. Voeg de afhankelijkheid toe als deze ontbreekt.

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

De Service Registry-client implementeren

Voeg een @EnableEurekaClient aantekening toe aan het SampleServiceAApplication.java-bestand om het te configureren als een Eureka-client.

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

Een REST-eindpunt maken voor testen

U kunt de service nu registreren bij serviceregister, maar u kunt deze pas verifiëren als u een service-eindpunt implementeert. Als u RESTful-eindpunten wilt maken die externe services kunnen aanroepen, voegt u een ServiceAEndpoint.java-bestand toe aan uw project met de volgende code.

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

Een Spring Boot-toepassing bouwen

Nu u een eenvoudige service hebt, compileert en bouwt u de broncode door de volgende opdracht uit te voeren:

mvn clean package

Service A implementeren en registreren bij serviceregister

In deze sectie wordt uitgelegd hoe u Service A implementeert in een Exemplaar van een Azure Spring Apps Enterprise-abonnement en hoe u deze registreert bij Service Registry.

Een Azure Spring Apps-toepassing maken

Maak eerst een toepassing in Azure Spring Apps met behulp van de volgende opdracht:

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

Het --assign-endpoint argument verleent een openbaar IP-adres voor validatie en maakt toegang mogelijk vanuit het externe netwerk.

Verbinding maken vanuit de app naar het serviceregister

Nadat u een service-exemplaar hebt gemaakt met Spring Boot en een toepassing hebt gemaakt in Azure Spring Apps, implementeert u de toepassing en bevestigt u de bewerking. Daarvoor moet u uw toepassing echter binden aan het serviceregister, zodat deze verbindingsgegevens uit het register kan ophalen.

Normaal gesproken moet een Eureka-client de volgende verbindingsgegevensinstellingen schrijven in het configuratiebestand application.properties van een Spring Boot-toepassing, zodat u verbinding kunt maken met de server:

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

Als u deze instellingen echter rechtstreeks in uw toepassing schrijft, moet u het project opnieuw bewerken en opnieuw opbouwen telkens wanneer de serviceregisterserver wordt gewijzigd. Om dit te voorkomen, stelt Azure Spring Apps uw toepassingen in staat om verbindingsgegevens op te halen uit het serviceregister door er verbinding mee te maken. Nadat u de toepassing hebt gekoppeld aan het serviceregister, kunt u de verbindingsgegevens van het serviceregister (eureka.client.service-url.defaultZone) ophalen uit de Java-omgevingsvariabele. Op deze manier kunt u verbinding maken met het serviceregister door de inhoud van de omgevingsvariabelen te laden wanneer de toepassing wordt gestart.

In de praktijk worden de volgende omgevingsvariabelen toegevoegd aan de JAVA_TOOL_OPTIONS variabele:

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

Een service binden aan het serviceregister

Gebruik de volgende opdracht om de service te verbinden met Azure Service Registry, zodat deze verbinding kan maken met de server.

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

U kunt de toepassingsbindingen ook instellen vanuit Azure Portal, zoals wordt weergegeven in de volgende schermopname:

Schermopname van Azure Portal met de pagina Serviceregister met de vervolgkeuzelijst App-binding gemarkeerd.

Notitie

Het duurt enkele minuten voordat deze wijzigingen worden doorgegeven aan alle toepassingen wanneer de status van het serviceregister wordt gewijzigd.

Als u de bindingsstatus wijzigt, moet u de toepassing opnieuw starten of opnieuw implementeren.

U kunt er nu voor kiezen om uw toepassing rechtstreeks aan het serviceregister te binden wanneer u een nieuwe app maakt met behulp van de volgende opdrachten:

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

U kunt uw toepassing ook verbinden met het serviceregister vanuit Azure Portal, zoals wordt weergegeven in de volgende schermopname:

Schermopname van Azure Portal met de pagina App maken met de vervolgkeuzelijst Bind gemarkeerd.

Een toepassing implementeren in Azure Spring Apps

Nu u uw toepassing hebt gebonden, implementeert u het Spring Boot-artefactbestand Sample-Service-A-A-0.0.1-SNAPSHOT.jar in Azure Spring Apps. Gebruik de volgende opdracht om te implementeren:

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"

Gebruik de volgende opdracht om te zien of uw implementatie is geslaagd.

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

Met deze opdracht wordt uitvoer geproduceerd die vergelijkbaar is met het volgende voorbeeld.

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                  -

Controleer of de Service A-toepassing wordt uitgevoerd

De uitvoer van de vorige opdracht bevat de openbare URL voor de service. Als u toegang wilt krijgen tot het RESTful-eindpunt, voegt u deze toe aan /serviceA de URL, zoals wordt weergegeven in de volgende opdracht:

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

Met deze opdracht wordt de volgende uitvoer gegenereerd.

This is a result of Service A

Service A bevat een RESTful-eindpunt dat een lijst met omgevingsvariabelen weergeeft. Open het eindpunt met /env de omgevingsvariabelen, zoals wordt weergegeven in de volgende opdracht:

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

Met deze opdracht wordt de volgende uitvoer gegenereerd.

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

Zoals u kunt zien, eureka.client.service-url.defaultZone wordt toegevoegd aan JAVA_TOOL_OPTIONS. Op deze manier kan de toepassing de service registreren bij het serviceregister en deze beschikbaar maken vanuit andere services.

U kunt de service nu registreren bij het ServiceRegister (Eureka Server) in Azure Spring Apps. Andere services hebben nu toegang tot de service met behulp van het serviceregister.

Een nieuwe service B implementeren die service A opent via serviceregister

Service B implementeren met Spring Boot

Navigeer naar Spring Initializr om een nieuw project voor Service B te maken. Deze koppeling gebruikt de volgende URL om de instellingen te initialiseren:

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

Selecteer vervolgens GENERATE om het nieuwe project op te halen.

Service B implementeren als een Service Registry-client (Eureka-client)

Voeg net als Service A de @EnableEurekaClient aantekening toe aan Service B om deze te configureren als een Eureka-client.

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

Service-eindpunten implementeren in Service B

Implementeer vervolgens een nieuw service-eindpunt (/invoke-serviceA) dat Service A aanroept. Voeg een ServiceBEndpoint.java-bestand toe aan uw project met de volgende code.

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

In dit voorbeeld wordt RestTemplate gebruikgemaakt van eenvoud. Het eindpunt retourneert de antwoordtekenreeks met een andere tekenreeks (INVOKE SERVICE A FROM SERVICE B: ") om aan te geven dat deze is aangeroepen door Service B.

In dit voorbeeld wordt ook een ander eindpunt (/list-all) geïmplementeerd voor validatie. Deze implementatie zorgt ervoor dat de service correct communiceert met het serviceregister. U kunt dit eindpunt aanroepen om de lijst met toepassingen op te halen die zijn geregistreerd in het serviceregister.

In dit voorbeeld wordt Service A aangeroepen als http://servicea. De servicenaam is de naam die u hebt opgegeven tijdens het maken van de Azure Spring Apps-toepassing. (Bijvoorbeeld: az spring app create --name ServiceA.) De naam van de toepassing komt overeen met de servicenaam die u hebt geregistreerd bij het serviceregister, zodat u de servicenaam gemakkelijker kunt beheren.

Build Service B

Gebruik de volgende opdracht om uw project te bouwen.

mvn clean package

Service B implementeren in Azure Spring Apps

Gebruik de volgende opdracht om een toepassing te maken in Azure Spring Apps om Service B te implementeren.

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

Gebruik vervolgens de volgende opdracht om de toepassing te binden aan het serviceregister.

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

Gebruik vervolgens de volgende opdracht om de service te implementeren.

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"

Gebruik vervolgens de volgende opdracht om de status van de toepassing te controleren.

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

Als Service A en Service B correct zijn geïmplementeerd, produceert deze opdracht uitvoer die vergelijkbaar is met het volgende voorbeeld.

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                  -

Service A aanroepen vanuit service B

De uitvoer van de vorige opdracht bevat de openbare URL voor de service. Als u toegang wilt krijgen tot het RESTful-eindpunt, voegt u deze toe aan /invoke-serviceA de URL, zoals wordt weergegeven in de volgende opdracht:

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

Met deze opdracht wordt de volgende uitvoer gegenereerd:

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

Informatie ophalen uit het serviceregister

Tot slot opent u het /list-all eindpunt en haalt u enkele gegevens op uit het serviceregister. Met de volgende opdracht wordt een lijst opgehaald met services die zijn geregistreerd in het serviceregister.

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

Met deze opdracht wordt de volgende uitvoer gegenereerd.

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

Op deze manier kunt u zo nodig gedetailleerde informatie van het programma verkrijgen.

Serviceregister in- of uitschakelen na het maken van de service

U kunt Service Registry in- en uitschakelen na het maken van de service met behulp van Azure Portal of Azure CLI. Voordat u serviceregister uitschakelt, moet u al uw apps ervan losmaken.

Gebruik de volgende stappen om Service Registry in of uit te schakelen met behulp van Azure Portal:

  1. Navigeer naar uw serviceresource en selecteer vervolgens Serviceregister.
  2. Selecteer Beheren.
  3. Selecteer of hef de selectie van het serviceregister in of uit en selecteer opslaan.
  4. U kunt nu de status van het serviceregister bekijken op de pagina Serviceregister .

Volgende stappen