استخدام Tanzu Service Registry

إشعار

يعد Azure Spring Apps هو الاسم الجديد لخدمة Azure Spring Cloud. رغم أن الخدمة تحمل اسماً جديداً، سترى الاسم القديم في بعض الأماكن لفترة من الوقت بينما نعمل على تحديث الأصول مثل لقطات الشاشة، ومقاطع الفيديو، والرسوم التخطيطية.

تنطبق هذه المقالة على:❌ Basic/Standard ✔️ Enterprise

توضح هذه المقالة كيفية استخدام سجل خدمة VMware Tanzu مع خطة Azure Spring Apps Enterprise.

يعد Tanzu Service Registry أحد المكونات التجارية لبرنامج VMware. يساعدك هذا المكون على تطبيق نمط تصميم اكتشاف الخدمة على تطبيقاتك.

اكتشاف الخدمة هو أحد الأفكار الرئيسية لبنية الخدمات المصغرة. بدون اكتشاف الخدمة، سيتعين عليك تكوين كل عميل خدمة يدويا أو اعتماد شكل من أشكال اصطلاح الوصول. قد تكون هذه العملية صعبة، ويمكن أن تكون التكوينات والاصطلاحات هشة في الإنتاج. بدلا من ذلك، يمكنك استخدام سجل خدمة Tanzu لاكتشاف الخدمات المسجلة واستدعاؤها ديناميكيا في التطبيق الخاص بك.

باستخدام خطة Azure Spring Apps Enterprise، لا يتعين عليك إنشاء سجل الخدمة أو بدء تشغيله بنفسك. يمكنك استخدام سجل خدمة Tanzu عن طريق تحديده عند إنشاء مثيل خطة Azure Spring Apps Enterprise.

المتطلبات الأساسية

  • مثيل خطة Azure Spring Apps Enterprise الذي تم توفيره بالفعل مع تمكين سجل خدمة Tanzu. لمزيد من المعلومات، راجع التشغيل السريع: إنشاء التطبيقات ونشرها في Azure Spring Apps باستخدام خطة المؤسسة.
  • ملحق خطة Azure Spring Apps Enterprise. استخدم الأمر التالي لإزالة الإصدارات السابقة وتثبيت أحدث ملحق لخطة المؤسسة. إذا قمت بتثبيت الملحق spring-cloud مسبقًا، قم بإلغاء تثبيته لتجنب عدم تطابق التكوين والإصدار.
    az extension add --upgrade --name spring
    az extension remove --name spring-cloud
    

إنشاء التطبيقات التي تستخدم سجل الخدمة

في هذه المقالة، يمكنك إنشاء خدمتين وتسجيلهما باستخدام Azure Spring Apps Service Registry. بعد التسجيل، ستكون إحدى الخدمات قادرة على استخدام سجل الخدمة لاكتشاف الخدمة الأخرى واستدعاؤها. يلخص الرسم التخطيطي التالي الخطوات المطلوبة:

رسم تخطيطي يوضح خطوات إنشاء الخدمة A والخدمة B ونشرها وتسجيلها.

يتم وصف هذه الخطوات بمزيد من التفصيل في الأقسام التالية.

  1. إنشاء خدمة A.
  2. نشر الخدمة أ إلى Azure Spring Apps وتسجيلها مع سجل الخدمة.
  3. إنشاء الخدمة B وتنفيذها للاتصال بالخدمة A.
  4. نشر الخدمة B وتسجيلها مع سجل الخدمة.
  5. استدعاء الخدمة A من خلال الخدمة B.

إنشاء متغيرات البيئة

تستخدم هذه المقالة متغيرات البيئة التالية. قم بتعيين هذه المتغيرات إلى القيم التي استخدمتها عند إنشاء مثيل خطة Azure Spring Apps Enterprise.

المتغير ‏‏الوصف
$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 مع الإعدادات المطلوبة.

لقطة شاشة لصفحة 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

تأكيد تكوين المكتبات التابعة لعميل سجل الخدمة (عميل يوريكا)

بعد ذلك، تأكد من أن ملف 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 إلى مثيل خطة 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. بهذه الطريقة، يمكنك الاتصال ب Service Registry عن طريق تحميل محتويات متغيرات البيئة عند بدء تشغيل التطبيق.

في الممارسة العملية، تتم إضافة متغيرات البيئة التالية إلى JAVA_TOOL_OPTIONS المتغير:

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

ربط خدمة بسجل الخدمة

استخدم الأمر التالي لربط الخدمة ب Azure Service Registry، مما يمكنها من الاتصال بالخادم.

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

يمكنك أيضا إعداد روابط التطبيق من مدخل Microsoft Azure، كما هو موضح في لقطة الشاشة التالية:

لقطة شاشة لمدخل Azure تعرض صفحة سجل الخدمة مع تمييز القائمة المنسدلة لربط التطبيق.

إشعار

ستستغرق هذه التغييرات بضع دقائق للنشر إلى جميع التطبيقات عند تغيير حالة سجل الخدمة.

إذا قمت بتغيير حالة الربط/إلغاء الربط، فستحتاج إلى إعادة تشغيل التطبيق أو إعادة نشره.

يمكنك الآن اختيار ربط التطبيق الخاص بك ب Service Registry مباشرة عند إنشاء تطبيق جديد باستخدام الأوامر التالية:

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

يمكنك أيضا ربط التطبيق الخاص بك ب Service Registry من مدخل Microsoft Azure، كما هو موضح في لقطة الشاشة التالية:

لقطة شاشة لمدخل Azure تعرض صفحة إنشاء تطبيق مع تمييز القائمة المنسدلة Bind.

نشر تطبيق إلى 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                  -

تأكد من تشغيل تطبيق الخدمة 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. بهذه الطريقة، يمكن للتطبيق تسجيل الخدمة في سجل الخدمة وإتاحتها من خدمات أخرى.

يمكنك الآن تسجيل الخدمة في سجل الخدمة (خادم يوريكا) في Azure Spring Apps. يمكن للخدمات الأخرى الآن الوصول إلى الخدمة باستخدام سجل الخدمة.

تنفيذ خدمة B جديدة تصل إلى الخدمة أ من خلال سجل الخدمة

تنفيذ الخدمة 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 ك عميل سجل خدمة (عميل يوريكا)

مثل الخدمة 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

بعد ذلك، استخدم الأمر التالي لربط التطبيق ب Service Registry.

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 والخدمة 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                  -

استدعاء الخدمة أ من الخدمة 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. قبل تعطيل سجل الخدمة، يطلب منك إلغاء ربط جميع تطبيقاتك منه.

استخدم الخطوات التالية لتمكين تسجيل الخدمة أو تعطيله باستخدام مدخل Microsoft Azure:

  1. انتقل إلى مورد الخدمة، ثم حدد سجل الخدمة.
  2. حدد إدارة.
  3. حدد تمكين سجل الخدمة أو قم بإلغاء تحديده، ثم حدد حفظ.
  4. يمكنك الآن عرض حالة سجل الخدمة على صفحة سجل الخدمة.

الخطوات التالية