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

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



في سابقة آخر ألقينا نظرة على الأدوات المناسبة التي يمكنك تحديد التحسينات التي أدخلت نتيجة التحديث جافا التطبيقات.

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

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

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

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

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

تطبيق Quarkus


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

مولد الطلب


يرسل المولد كل 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 مخصص لقراءة رمز المصادقة المميز من نظام ملفات pod:

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. لمزيد من المعلومات حول كيفية إعداد بيئة لذلك ، راجع التعليمات ذات الصلة في دليل Quarkus .

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

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 ، يجب عليك تحديد الدور والدور الملزم (الدور والدور):

---
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 ، لكن هناك الكثير من الأشياء الجديدة والمثيرة للاهتمام ، ابق معنا!

All Articles