الرسائل المستندة إلى السحابة على منصة Red Hat OpenShift باستخدام Quarkus و AMQ Online

أهلاً بكم! ها هي - مشاركتنا الأخيرة في سلسلة Quarkus! (بالمناسبة، شاهد ندوتنا عبر الإنترنت "هذا هو Quarkus - إطار عمل Java الأصلي لـ Kubernetes". سنوضح لك كيفية البدء من الصفر أو نقل الحلول الجاهزة)

الرسائل المستندة إلى السحابة على منصة Red Hat OpenShift باستخدام Quarkus و AMQ Online

В سابق في هذا المنشور، نظرنا إلى الأدوات ذات الصلة التي يمكن استخدامها لقياس التحسينات التي تم الحصول عليها نتيجة لتحديث تطبيقات Java.

منذ الإصدار 0.17.0، كواركوس يدعم استخدام بروتوكول وضع الرسائل في قائمة انتظار المتقدمة (AMQP)، وهو معيار مفتوح لنقل رسائل الأعمال بين التطبيقات أو المؤسسات.

ريد هات AMQ اون لاين هي خدمة مبنية على أساس مشروع مفتوح المصدر إنماسي وتنفيذ آلية المراسلة القائمة على النظام الأساسي ريد هات OpenShift. لمزيد من التفاصيل حول كيفية عمله، راجع هنا (بالإنكليزية). سنعرض لك اليوم كيفية الجمع بين AMQ Online وQuarkus لإنشاء نظام مراسلة حديث قائم على OpenShift باستخدام تقنيتين جديدتين للمراسلة.

من المفترض أنك قمت بالفعل بنشر AMQ Online على منصة OpenShift (إذا لم يكن الأمر كذلك، فراجع دليل التثبيت).

للبدء، سنقوم بإنشاء تطبيق Quarkus الذي سيكون بمثابة نظام بسيط لمعالجة الطلبات باستخدام الرسائل التفاعلية. سيتضمن هذا التطبيق منشئ الطلبات الذي يرسل الأوامر إلى قائمة انتظار الرسائل على فترات زمنية محددة، بالإضافة إلى معالج الطلبات الذي سيقوم بمعالجة الرسائل من قائمة الانتظار وإنشاء تأكيدات يمكن عرضها في المتصفح.

بمجرد إنشاء التطبيق، سنوضح لك كيفية تضمين تكوين نظام المراسلة في التطبيق واستخدام AMQ Online لتوفير الموارد التي نحتاجها في النظام.

تطبيق كواركوس

يعمل تطبيق Quarkus الخاص بنا على OpenShift وهو نسخة معدلة من البرنامج amqp-بدء سريع. يمكن العثور على مثال كامل لجانب العميل هنا.

طلب المولد

يقوم المولد ببساطة بإرسال معرفات الطلبات المتزايدة بشكل رتيب إلى عنوان "الطلبات" كل 5 ثوانٍ.

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable<Integer> generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

معالج الطلب

معالج الطلب أبسط من ذلك، فهو يقوم فقط بإرجاع معرف التأكيد إلى عنوان "التأكيدات".

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Идентификатор подтверждения равен удвоенному идентификатору заказа <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

موارد التأكيد

مورد التأكيد هو نقطة نهاية HTTP لإدراج التأكيدات التي تم إنشاؤها بواسطة تطبيقنا.

@Path("/confirmations")
public class ConfirmationResource {
 
    @Inject
    @Stream("confirmations") Publisher<Integer> orders;
 
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
 
 
    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher<Integer> stream() {
        return orders;
    }
}

تعديل

للاتصال بـ AMQ Online، سيحتاج تطبيقنا إلى بعض بيانات التكوين، وهي: تكوين موصل Quarkus ومعلومات نقطة نهاية AMQP وبيانات اعتماد العميل. ومن الأفضل بالطبع الاحتفاظ بجميع بيانات التكوين في مكان واحد، ولكننا سنتعمد فصلها لإظهار الخيارات الممكنة لتكوين تطبيق Quarkus.

موصلات

يمكن توفير تكوين الموصل في وقت الترجمة باستخدام ملف خصائص التطبيق:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

لتبسيط الأمور، سنستخدم فقط قائمة انتظار الرسائل لعنوان "الطلبات". وسيستخدم عنوان "التأكيدات" الموجود في تطبيقنا قائمة انتظار في الذاكرة.

نقطة النهاية AMQP

في وقت الترجمة، يكون اسم المضيف ورقم المنفذ لنقطة نهاية AMQP غير معروفين، لذا يجب إدخالهما. يمكن تعيين نقطة النهاية في خريطة التكوين التي تم إنشاؤها بواسطة AMQ Online، لذلك سنقوم بتعريفها من خلال متغيرات البيئة في بيان التطبيق:

spec:
  template:
    spec:
      containers:
      - env:
        - name: AMQP_HOST
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.host
        - name: AMQP_PORT
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.port.amqp

أوراق اعتماد

يمكن استخدام الرمز المميز لحساب الخدمة لمصادقة تطبيقنا على OpenShift. للقيام بذلك، يجب عليك أولاً إنشاء مصدر ConfigSource مخصص يقرأ رمز المصادقة من نظام ملفات الكبسولة:

public class MessagingCredentialsConfigSource implements ConfigSource {
    private static final Set<String> propertyNames;
 
    static {
        propertyNames = new HashSet<>();
        propertyNames.add("amqp-username");
        propertyNames.add("amqp-password");
    }
 
    @Override
    public Set<String> getPropertyNames() {
        return propertyNames;
    }
 
    @Override
    public Map<String, String> getProperties() {
        try {
            Map<String, String> properties = new HashMap<>();
            properties.put("amqp-username", "@@serviceaccount@@");
            properties.put("amqp-password", readTokenFromFile());
            return properties;
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
 
    @Override
    public String getValue(String key) {
        if ("amqp-username".equals(key)) {
            return "@@serviceaccount@@";
        }
        if ("amqp-password".equals(key)) {
            try {
                return readTokenFromFile();
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
        return null;
    }
 
    @Override
    public String getName() {
        return "messaging-credentials-config";
    }
 
    private static String readTokenFromFile() throws IOException {
        return new String(Files.readAllBytes(Paths.get("/var/run/secrets/kubernetes.io/serviceaccount/token")), StandardCharsets.UTF_8);
    }
}

بناء ونشر التطبيق

نظرًا لأنه يجب تجميع التطبيق في ملف قابل للتنفيذ، يلزم وجود جهاز GraalVM الظاهري. للحصول على تفاصيل حول كيفية إعداد بيئة لذلك، راجع الإرشادات المقابلة في دليل كواركوس.

وبعد ذلك، باتباع الإرشادات الواردة هناك، يتعين عليك تنزيل المصدر وإنشاء تطبيقنا ونشره:

git clone https://github.com/EnMasseProject/enmasse-example-clients
cd enmasse-example-clients/quarkus-example-client
oc new-project myapp
mvn -Pnative -Dfabric8.mode=openshift -Dfabric8.build.strategy=docker package fabric8:build fabric8:resource fabric8:apply

بعد هذه الأوامر، سيتم نشر التطبيق، لكنه لن يبدأ حتى نقوم بتكوين موارد المراسلة التي نحتاجها في AMQ Online.

إعداد نظام الرسائل

الآن كل ما تبقى هو تعيين الموارد التي يحتاجها تطبيقنا في نظام المراسلة. للقيام بذلك، تحتاج إلى إنشاء: 1) مساحة عنوان لتهيئة نقطة نهاية نظام المراسلة؛ 2) عنوان لتكوين العناوين التي نستخدمها في التطبيق؛ 3) مراسلة المستخدم لتعيين بيانات اعتماد العميل.

مساحة العنوان

كائن AddressSpace في AMQ Online هو مجموعة من العناوين التي تشترك في نقاط نهاية الاتصال وسياسات المصادقة والترخيص. عندما تقوم بإنشاء مساحة عنوان، يمكنك تحديد كيفية عرض نقاط نهاية المراسلة:

apiVersion: enmasse.io/v1beta1
kind: AddressSpace
metadata:
  name: quarkus-example
spec:
  type: brokered
  plan: brokered-single-broker
  endpoints:
  - name: messaging
    service: messaging
    exports:
    - name: quarkus-config
      kind: configmap

عنوان

يتم استخدام العناوين لإرسال واستقبال الرسائل. يحتوي كل عنوان على نوع يحدد دلالاته، بالإضافة إلى خطة تحدد عدد الموارد التي سيتم حجزها. يمكن تحديد العنوان، على سبيل المثال، على النحو التالي:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

مستخدم المراسلة

للتأكد من أن التطبيقات الموثوقة فقط هي التي يمكنها إرسال واستقبال الرسائل إلى عناوينك، يجب عليك إنشاء مستخدم في نظام المراسلة. بالنسبة للتطبيقات التي تعمل على مجموعة، يمكن مصادقة العملاء باستخدام حساب خدمة OpenShift. يمكن تعريف المستخدم "serviceaccount"، على سبيل المثال، على النحو التالي:

apiVersion: user.enmasse.io/v1beta1
kind: MessagingUser
metadata:
  name: quarkus-example.app
spec:
  username: system:serviceaccount:myapp:default
  authentication:
    type: serviceaccount
  authorization:
  - operations: ["send", "recv"]
    addresses: ["orders"]

أذونات لتكوين التطبيق

لكي يتمكن AMQ Online من إنشاء خريطة التكوين التي استخدمناها لتضمين معلومات نقطة نهاية AMQP، يجب تعيين الدور وRoleBinding:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: quarkus-config
spec:
  rules:
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    verbs: [ "create" ]
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    resourceNames: [ "quarkus-config" ]
    verbs: [ "get", "update", "patch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: quarkus-config
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: quarkus-config
subjects:
- kind: ServiceAccount
  name: address-space-controller
  namespace: amq-online-infra

كيفية تطبيق التكوينات

يمكنك تطبيق تكوين نظام المراسلة مثل هذا:

cd enmasse-example-clients/quarkus-example-client
oc project myapp
oc apply -f src/main/resources/k8s/addressspace
oc apply -f src/main/resources/k8s/address

التحقق من التطبيق

للتأكد من بدء تشغيل التطبيق، دعونا نتحقق أولاً مما إذا كانت العناوين المقابلة قد تم إنشاؤها ونشطة:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

ثم دعونا نتحقق من عنوان URL لمسار التطبيق (فقط افتح هذا العنوان في المتصفح):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

يجب أن يُظهر المتصفح أن التذاكر يتم تحديثها بشكل دوري حيث يتم إرسال الرسائل واستلامها بواسطة AMQ Online.

تلخيص

لذلك قمنا بكتابة تطبيق Quarkus الذي يستخدم AMQP للمراسلة، وقمنا بتكوين التطبيق ليتم تشغيله على منصة Red Hat OpenShift، وقمنا بتنفيذ تكوينه بناءً على تكوين AMQ Online. قمنا بعد ذلك بإنشاء البيانات اللازمة لتهيئة نظام المراسلة لتطبيقنا.

وبهذا تنتهي السلسلة حول Quarkus، ولكن هناك الكثير من الأشياء الجديدة والمثيرة للاهتمام في المستقبل، ترقبوا ذلك!

المصدر: www.habr.com

إضافة تعليق