أهلاً بكم! ها هي - مشاركتنا الأخيرة في سلسلة Quarkus! (بالمناسبة، شاهد ندوتنا عبر الإنترنت
В
منذ الإصدار 0.17.0،
من المفترض أنك قمت بالفعل بنشر AMQ Online على منصة OpenShift (إذا لم يكن الأمر كذلك، فراجع
للبدء، سنقوم بإنشاء تطبيق Quarkus الذي سيكون بمثابة نظام بسيط لمعالجة الطلبات باستخدام الرسائل التفاعلية. سيتضمن هذا التطبيق منشئ الطلبات الذي يرسل الأوامر إلى قائمة انتظار الرسائل على فترات زمنية محددة، بالإضافة إلى معالج الطلبات الذي سيقوم بمعالجة الرسائل من قائمة الانتظار وإنشاء تأكيدات يمكن عرضها في المتصفح.
بمجرد إنشاء التطبيق، سنوضح لك كيفية تضمين تكوين نظام المراسلة في التطبيق واستخدام AMQ Online لتوفير الموارد التي نحتاجها في النظام.
تطبيق كواركوس
يعمل تطبيق Quarkus الخاص بنا على OpenShift وهو نسخة معدلة من البرنامج
طلب المولد
يقوم المولد ببساطة بإرسال معرفات الطلبات المتزايدة بشكل رتيب إلى عنوان "الطلبات" كل 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