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