Gunakan Registri Layanan Tanzu

Catatan

Azure Spring Apps adalah nama baru untuk layanan Azure Spring Cloud. Meskipun layanan memiliki nama baru, Anda akan melihat nama lama di beberapa tempat untuk sementara saat kami berupaya memperbarui aset seperti cuplikan layar, video, dan diagram.

Artikel ini berlaku untuk:❌ Basic/Standard ✔️ Enterprise

Artikel ini memperlihatkan kepada Anda cara menggunakan VMware Tanzu Service Registry dengan paket Azure Spring Apps Enterprise.

Registri Layanan Tanzu adalah salah satu komponen VMware Tanzu komersial. Komponen ini membantu Anda menerapkan pola desain penemuan layanan ke aplikasi Anda.

Penemuan layanan adalah salah satu ide utama arsitektur layanan mikro. Tanpa penemuan layanan, Anda harus mengonfigurasi setiap klien layanan secara tangan atau mengadopsi beberapa bentuk konvensi akses. Proses ini bisa sulit, dan konfigurasi dan konvensi dapat rapuh dalam produksi. Sebagai gantinya, Anda dapat menggunakan Tanzu Service Registry untuk menemukan dan memanggil layanan terdaftar secara dinamis di aplikasi Anda.

dengan paket Azure Spring Apps Enterprise, Anda tidak perlu membuat atau memulai Service Registry sendiri. Anda dapat menggunakan Tanzu Service Registry dengan memilihnya saat membuat instans paket Azure Spring Apps Enterprise.

Prasyarat

  • Instans paket Azure Spring Apps Enterprise yang sudah disediakan dengan Tanzu Service Registry diaktifkan. Untuk informasi selengkapnya, lihat Mulai Cepat: Membuat dan menyebarkan aplikasi ke Azure Spring Apps menggunakan paket Enterprise.
  • Ekstensi paket Azure Spring Apps Enterprise. Gunakan perintah berikut untuk menghapus versi sebelumnya dan menginstal ekstensi paket Enterprise terbaru. Jika sebelumnya Anda menginstal ekstensi spring-cloud, hapus instalannya untuk menghindari ketidakcocokan konfigurasi dan versi.
    az extension add --upgrade --name spring
    az extension remove --name spring-cloud
    

Membuat aplikasi yang menggunakan Service Registry

Dalam artikel ini, Anda membuat dua layanan dan mendaftarkannya dengan Azure Spring Apps Service Registry. Setelah pendaftaran, satu layanan akan dapat menggunakan Service Registry untuk menemukan dan memanggil layanan lain. Diagram berikut ini meringkas langkah-langkah yang diperlukan:

Diagram memperlihatkan langkah-langkah untuk membuat, menyebarkan, dan mendaftarkan Layanan A dan Layanan B.

Langkah-langkah ini dijelaskan secara lebih rinci di bagian berikut.

  1. Buat Layanan A.
  2. Sebarkan Layanan A ke Azure Spring Apps dan daftarkan dengan Service Registry.
  3. Buat Layanan B dan terapkan untuk memanggil Layanan A.
  4. Sebarkan Layanan B dan daftarkan dengan Service Registry.
  5. Panggil Layanan A hingga Layanan B.

Membuat variabel lingkungan

Artikel ini menggunakan variabel lingkungan berikut. Atur variabel ini ke nilai yang Anda gunakan saat membuat instans paket Azure Spring Apps Enterprise.

Variabel Deskripsi
$RESOURCE_GROUP Nama grup sumber daya.
$AZURE_SPRING_APPS_NAME Nama instans Azure Spring Apps.

Membuat Layanan A dengan Spring Boot

Navigasi ke Spring Initializr untuk membuat contoh Layanan A. Tautan ini menggunakan URL berikut untuk menginisialisasi pengaturan.

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

Cuplikan layar berikut menunjukkan Spring Initializr dengan pengaturan yang diperlukan.

Cuplikan layar halaman Spring Initializr yang memperlihatkan pengaturan yang diperlukan.

Selanjutnya, pilih GENERATE untuk mendapatkan proyek sampel untuk Spring Boot dengan struktur direktori berikut.

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

Mengonfirmasi konfigurasi pustaka dependen untuk klien Service Registry (klien Eureka)

Selanjutnya, konfirmasikan bahwa file pom.xml untuk proyek berisi dependensi berikut. Tambahkan dependensi jika hilang.

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

Menerapkan klien Service Registry

Tambahkan anotasi @EnableEurekaClient ke file SampleServiceAApplication.java untuk mengonfigurasinya sebagai Klien 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);
    }
}

Membuat titik akhir REST untuk pengujian

Anda sekarang dapat mendaftarkan layanan ke Service Registry, tetapi Anda tidak dapat memverifikasinya sampai Anda menerapkan titik akhir layanan. Untuk membuat titik akhir RESTful yang dapat dipanggil layanan eksternal, tambahkan file ServiceAEndpoint.java ke proyek Anda dengan kode berikut.

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

Bangun aplikasi Spring Boot

Sekarang setelah Anda memiliki layanan sederhana, kompilasi dan bangun kode sumber dengan menjalankan perintah berikut:

mvn clean package

Menyebarkan Layanan A dan mendaftar dengan Service Registry

Bagian ini menjelaskan cara menyebarkan Layanan A ke instans paket Azure Spring Apps Enterprise dan mendaftarkannya dengan Service Registry.

Membuat aplikasi Azure Spring Apps

Pertama, buat aplikasi di Azure Spring Apps dengan menggunakan perintah berikut:

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

Argumen --assign-endpoint memberikan IP publik untuk validasi dan mengaktifkan akses dari jaringan eksternal.

Koneksi ke Service Registry dari aplikasi

Setelah Anda membuat instans layanan dengan Spring Boot dan membuat aplikasi di Azure Spring Apps, Anda menyebarkan aplikasi dan mengonfirmasi operasi. Namun, sebelum itu, Anda harus mengikat aplikasi Anda ke Registri Layanan sehingga bisa mendapatkan informasi koneksi dari registri.

Biasanya, klien Eureka perlu menulis pengaturan informasi koneksi berikut dalam file konfigurasi application.properties dari aplikasi Spring Boot sehingga Anda dapat terhubung ke server:

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

Namun, jika Anda menulis pengaturan ini langsung di aplikasi Anda, Anda perlu mengedit ulang dan membangun kembali proyek lagi setiap kali server Service Registry berubah. Untuk menghindari upaya ini, Azure Spring Apps memungkinkan aplikasi Anda mendapatkan informasi koneksi dari registri layanan dengan mengikatnya. Secara khusus, setelah mengikat aplikasi ke Service Registry, Anda bisa mendapatkan informasi koneksi registri layanan (eureka.client.service-url.defaultZone) dari variabel lingkungan Java. Dengan cara ini, Anda dapat terhubung ke Service Registry dengan memuat konten variabel lingkungan saat aplikasi dimulai.

Dalam praktiknya, variabel lingkungan berikut ditambahkan ke JAVA_TOOL_OPTIONS variabel :

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

Mengikat layanan ke Registri Layanan

Gunakan perintah berikut untuk mengikat layanan ke Azure Service Registry, memungkinkannya untuk tersambung ke server.

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

Anda juga dapat menyiapkan pengikatan aplikasi dari portal Azure, seperti yang ditunjukkan pada cuplikan layar berikut:

Cuplikan layar portal Azure yang memperlihatkan halaman Service Registry dengan dropdown Pengikatan aplikasi disorot.

Catatan

Perubahan ini akan memakan waktu beberapa menit untuk disebarluaskan ke semua aplikasi ketika status registri layanan berubah.

Jika Anda mengubah status pengikatan/pengikatan, Anda perlu memulai ulang atau menyebarkan ulang aplikasi.

Anda sekarang dapat memilih untuk mengikat aplikasi Anda ke Service Registry secara langsung saat membuat aplikasi baru dengan menggunakan perintah berikut:

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

Anda juga dapat mengikat aplikasi Anda ke Service Registry dari portal Azure, seperti yang ditunjukkan pada cuplikan layar berikut:

Cuplikan layar portal Azure yang memperlihatkan halaman Buat Aplikasi dengan menu tarik-turun Ikat disorot.

Menyebarkan aplikasi ke Azure Spring Apps

Setelah Anda mengikat aplikasi, sebarkan file artefak Spring Boot Sample-Service-A-A-0.0.1-SNAPSHOT.jar ke Azure Spring Apps. Untuk menyebarkan, gunakan perintah berikut:

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"

Gunakan perintah berikut untuk melihat apakah penyebaran Anda berhasil.

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

Perintah ini menghasilkan output yang mirip dengan contoh berikut.

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                  -

Konfirmasikan bahwa aplikasi Layanan A sedang berjalan

Output perintah sebelumnya mencakup URL publik untuk layanan. Untuk mengakses titik akhir RESTful, tambahkan /serviceA ke URL, seperti yang diperlihatkan dalam perintah berikut:

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

Perintah ini menghasilkan output berikut.

This is a result of Service A

Layanan A menyertakan titik akhir RESTful yang menampilkan daftar variabel lingkungan. Akses titik akhir dengan /env untuk melihat variabel lingkungan, seperti yang diperlihatkan dalam perintah berikut:

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

Perintah ini menghasilkan output berikut.

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

Seperti yang Anda lihat, eureka.client.service-url.defaultZone ditambahkan ke JAVA_TOOL_OPTIONS. Dengan cara ini, aplikasi dapat mendaftarkan layanan ke Registri Layanan dan membuatnya tersedia dari layanan lain.

Anda sekarang dapat mendaftarkan layanan ke Service Registry (Eureka Server) di Azure Spring Apps. Layanan lain sekarang dapat mengakses layanan dengan menggunakan registri layanan.

Menerapkan Layanan B baru yang mengakses Layanan A melalui Registri Layanan

Menerapkan Layanan B dengan Spring Boot

Navigasi ke Spring Initializr untuk membuat proyek baru untuk Layanan B. Tautan ini menggunakan URL berikut untuk menginisialisasi pengaturan:

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

Kemudian, pilih GENERATE untuk mendapatkan proyek baru.

Menerapkan Layanan B sebagai klien Service Registry (klien Eureka)

Seperti Layanan A, tambahkan @EnableEurekaClient anotasi ke Layanan B untuk mengonfigurasinya sebagai klien 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);
    }
}

Menerapkan titik akhir layanan di Layanan B

Selanjutnya, terapkan titik akhir layanan baru (/invoke-serviceA) yang memanggil Layanan A. Tambahkan file ServiceBEndpoint.java ke proyek Anda dengan kode berikut.

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

Contoh ini menggunakan untuk kesederhanaan RestTemplate . Titik akhir mengembalikan string respons dengan string lain (INVOKE SERVICE A FROM SERVICE B: ") untuk menunjukkan bahwa string tersebut dipanggil oleh Layanan B.

Contoh ini juga mengimplementasikan titik akhir lain (/list-all) untuk validasi. Implementasi ini memastikan bahwa layanan berkomunikasi dengan benar dengan Registri Layanan. Anda dapat memanggil titik akhir ini untuk mendapatkan daftar aplikasi yang terdaftar di Service Registry.

Contoh ini memanggil Layanan A sebagai http://servicea. Nama layanan adalah nama yang Anda tentukan selama pembuatan aplikasi Azure Spring Apps. (Misalnya: az spring app create --name ServiceA.) Nama aplikasi cocok dengan nama layanan yang Anda daftarkan dengan registri layanan, sehingga lebih mudah untuk mengelola nama layanan.

Build Service B

Gunakan perintah berikut untuk membangun proyek Anda.

mvn clean package

Menyebarkan Layanan B ke Azure Spring Apps

Gunakan perintah berikut untuk membuat aplikasi di Azure Spring Apps untuk menyebarkan Layanan B.

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

Selanjutnya, gunakan perintah berikut untuk mengikat aplikasi ke Registri Layanan.

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

Selanjutnya, gunakan perintah berikut untuk menyebarkan layanan.

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"

Selanjutnya, gunakan perintah berikut untuk memeriksa status aplikasi.

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

Jika Layanan A dan Layanan B disebarkan dengan benar, perintah ini menghasilkan output yang mirip dengan contoh berikut.

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                  -

Panggil Layanan A dari Layanan B

Output perintah sebelumnya mencakup URL publik untuk layanan. Untuk mengakses titik akhir RESTful, tambahkan /invoke-serviceA ke URL, seperti yang diperlihatkan dalam perintah berikut:

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

Perintah ini menghasilkan output berikut:

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

Mendapatkan beberapa informasi dari Service Registry

Terakhir, akses /list-all titik akhir dan ambil beberapa informasi dari Registri Layanan. Perintah berikut mengambil daftar layanan yang terdaftar di Service Registry.

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

Perintah ini menghasilkan output berikut.

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

Dengan cara ini, Anda dapat memperoleh informasi terperinci dari program sesuai kebutuhan.

Mengaktifkan/menonaktifkan Service Registry setelah pembuatan layanan

Anda dapat mengaktifkan dan menonaktifkan Service Registry setelah pembuatan layanan menggunakan portal Azure atau Azure CLI. Sebelum menonaktifkan Service Registry, Anda diharuskan untuk membatalkan semua aplikasi Anda darinya.

Gunakan langkah-langkah berikut untuk mengaktifkan atau menonaktifkan Service Registry menggunakan portal Azure:

  1. Navigasikan ke sumber daya layanan Anda, lalu pilih Registri Layanan.
  2. Pilih Kelola.
  3. Pilih atau batal pilih Aktifkan Registri Layanan, lalu pilih Simpan.
  4. Sekarang Anda dapat melihat status Registri Layanan di halaman Registri Layanan.

Langkah berikutnya