Quarkus va AMQ Online yordamida Red Hat OpenShift platformasida bulutli xabar almashish

Hammaga salom! Mana - Quarkus seriyasidagi so'nggi postimiz! (Aytgancha, bizning vebinarimizni tomosha qiling "Bu Quarkus - Kubernetes mahalliy Java ramkasi". Biz sizga noldan qanday boshlashni yoki tayyor echimlarni uzatishni ko'rsatamiz)

Quarkus va AMQ Online yordamida Red Hat OpenShift platformasida bulutli xabar almashish

В oldingi Ushbu postda biz Java ilovalarini modernizatsiya qilish natijasida olingan yaxshilanishlarni aniqlash uchun ishlatilishi mumkin bo'lgan tegishli vositalarni ko'rib chiqdik.

0.17.0 versiyasidan boshlab, Kvarkus Kengaytirilgan xabar navbati protokolidan foydalanishni qo'llab-quvvatlaydi (AMQP), bu ilovalar yoki tashkilotlar o'rtasida biznes xabarlarini uzatish uchun ochiq standartdir.

Red Hat AMQ Onlayn ochiq kodli loyiha asosida qurilgan xizmatdir EnMasse va platformaga asoslangan xabar almashish mexanizmini amalga oshirish RedHat OpenShift. Bu qanday ishlashi haqida ko'proq ma'lumot olish uchun qarang bu yerda (UZ). Bugun biz sizga ikkita yangi xabar almashish texnologiyasidan foydalangan holda OpenShift asosidagi zamonaviy xabar almashish tizimini yaratish uchun AMQ Online va Quarkusni qanday birlashtirishni ko‘rsatamiz.

Siz allaqachon OpenShift platformasida AMQ Online-ni o'rnatgan deb taxmin qilinadi (agar bo'lmasa, qarang. o'rnatish qo'llanmasi).

Boshlash uchun biz reaktiv xabarlar yordamida oddiy buyurtmalarni qayta ishlash tizimi bo'lgan Quarkus ilovasini yaratamiz. Ushbu ilova buyurtmalarni belgilangan vaqt oralig'ida xabarlar navbatiga yuboradigan buyurtma generatorini, shuningdek navbatdagi xabarlarni qayta ishlovchi va brauzerda ko'rish mumkin bo'lgan tasdiqlarni yaratadigan buyurtma protsessorini o'z ichiga oladi.

Ilovani yaratganimizdan so'ng, biz sizga xabar almashish tizimi konfiguratsiyasini ilovaga qanday kiritish va tizimda kerakli resurslarni ta'minlash uchun AMQ Online-dan foydalanishni ko'rsatamiz.

Quarkus ilovasi

Bizning Quarkus ilovamiz OpenShift-da ishlaydi va dasturning o'zgartirilgan versiyasidir amqp-tezkor ishga tushirish. Mijoz tomonining to'liq misolini topish mumkin shu yerda.

Buyurtma generatori

Jeneratör oddiygina monoton tarzda o'sib borayotgan buyurtma identifikatorlarini har 5 soniyada "buyurtmalar" manziliga yuboradi.

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

Buyurtma protsessor

Buyurtmani qayta ishlovchi yanada sodda, u "tasdiqlashlar" manziliga tasdiqlash identifikatorini qaytaradi.

@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;
    }
}

Tasdiqlash manbalari

Tasdiqlash resursi ilovamiz tomonidan yaratilgan tasdiqlarni roʻyxatga olish uchun HTTP soʻnggi nuqtasidir.

@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;
    }
}

moslashish

AMQ Online ga ulanish uchun ilovamizga baʼzi konfiguratsiya maʼlumotlari kerak boʻladi, xususan: Quarkus ulagichi konfiguratsiyasi, AMQP soʻnggi nuqtasi maʼlumotlari va mijoz hisob maʼlumotlari. Albatta, barcha konfiguratsiya ma'lumotlarini bir joyda saqlash yaxshiroqdir, lekin biz Quarkus ilovasini sozlashning mumkin bo'lgan variantlarini ko'rsatish uchun ularni ataylab ajratamiz.

Ulagichlar

Ulagich konfiguratsiyasi kompilyatsiya vaqtida dastur xususiyatlari fayli yordamida taqdim etilishi mumkin:

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

Ishlarni soddalashtirish uchun biz faqat “buyurtmalar” manzili uchun xabarlar qatoridan foydalanamiz. Va bizning ilovamizdagi "tasdiqlash" manzili xotiradagi navbatdan foydalanadi.

AMQP oxirgi nuqtasi

Kompilyatsiya vaqtida AMQP so'nggi nuqtasi uchun xost nomi va port raqami noma'lum, shuning uchun ularni kiritish kerak. Yakuniy nuqta AMQ Online tomonidan yaratilgan konfiguratsiya xaritasida o'rnatilishi mumkin, shuning uchun biz ularni ilova manifestidagi muhit o'zgaruvchilari orqali aniqlaymiz:

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

Hisob ma'lumotlari

Xizmat hisob qaydnomasi tokeni ilovamizni OpenShiftga autentifikatsiya qilish uchun ishlatilishi mumkin. Buni amalga oshirish uchun, avvalo, pod fayl tizimidan autentifikatsiya tokenini o'qiy oladigan maxsus ConfigSource yaratishingiz kerak:

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);
    }
}

Ilovani yaratish va joylashtirish

Ilova bajariladigan faylga kompilyatsiya qilinishi kerakligi sababli, GraalVM virtual mashinasi talab qilinadi. Buning uchun muhitni qanday o'rnatish haqida batafsil ma'lumot uchun tegishli ko'rsatmalarga qarang Quarkus qo'llanma.

Keyin, u erda berilgan ko'rsatmalarga rioya qilib, siz manbani yuklab olishingiz, dasturimizni qurishingiz va joylashtirishingiz kerak:

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

Ushbu buyruqlardan so'ng dastur o'rnatiladi, lekin biz AMQ Online-da bizga kerak bo'lgan xabar almashish resurslarini sozlamagunimizcha ishga tushmaydi.

Xabarlar tizimini sozlash

Endi qolgan narsa - xabar almashish tizimida ilovamizga kerak bo'lgan resurslarni o'rnatish. Buning uchun siz quyidagilarni yaratishingiz kerak: 1) xabar almashish tizimining oxirgi nuqtasini ishga tushirish uchun manzil maydoni; 2) ilovada biz foydalanadigan manzillarni sozlash uchun manzil; 3) Xabarlar foydalanuvchisi mijoz hisob ma'lumotlarini o'rnatish uchun.

Manzil maydoni

AMQ Online-dagi AddressSpace ob'ekti ulanishning so'nggi nuqtalari, autentifikatsiya va avtorizatsiya siyosatlarini baham ko'radigan manzillar guruhidir. Manzil maydonini yaratganingizda, xabar almashishning so'nggi nuqtalari qanday ko'rinishini belgilashingiz mumkin:

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

Manzillar

Manzillar xabarlarni yuborish va qabul qilish uchun ishlatiladi. Har bir manzilning semantikasini belgilaydigan turi, shuningdek, zahiraga olinadigan resurslar sonini ko'rsatuvchi reja mavjud. Manzilni, masalan, quyidagicha aniqlash mumkin:

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

Xabar foydalanuvchisi

Sizning manzillaringizga faqat ishonchli ilovalar xabar yuborishi va qabul qilishi mumkinligiga ishonch hosil qilish uchun siz xabar almashish tizimida foydalanuvchi yaratishingiz kerak. Klasterda ishlaydigan ilovalar uchun mijozlar OpenShift xizmat hisobi yordamida autentifikatsiya qilinishi mumkin. "Xizmat hisobi" foydalanuvchisi, masalan, quyidagicha belgilanishi mumkin:

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"]

Ilova sozlamalari uchun ruxsatlar

AMQ Online biz AMQP so'nggi nuqta ma'lumotlarini joylashtirishda foydalangan konfiguratsiya xaritasini yaratishi uchun Role va RoleBinding o'rnatilishi kerak:

---
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

Konfiguratsiyalarni qanday qo'llash kerak

Siz xabar almashish tizimi konfiguratsiyasini quyidagicha qo'llashingiz mumkin:

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

Ilovani tekshirish

Ilova boshlanganiga ishonch hosil qilish uchun, avvalo, tegishli manzillar yaratilganligini va faolligini tekshiramiz:

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

Keyin dastur marshruti URL manzilini tekshiramiz (shunchaki brauzerda ushbu manzilni oching):

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

Brauzer chiptalar vaqti-vaqti bilan yangilanib turishini ko'rsatishi kerak, chunki xabarlar AMQ Online tomonidan yuboriladi va qabul qilinadi.

Xulosa

Shunday qilib, biz xabar almashish uchun AMQP dan foydalanadigan Quarkus ilovasini yozdik, dasturni Red Hat OpenShift platformasida ishlash uchun sozladik va uning konfiguratsiyasini AMQ Online konfiguratsiyasi asosida amalga oshirdik. Keyin biz ilovamiz uchun xabar almashish tizimini ishga tushirish uchun zarur bo'lgan manifestlarni yaratdik.

Kvarkus haqidagi serial shu bilan yakunlanadi, ammo oldinda juda ko'p yangi va qiziqarli narsalar bor, bizni kuzatib boring!

Manba: www.habr.com

a Izoh qo'shish