Quarkus və AMQ Online istifadə edərək Red Hat OpenShift platformasında buludda yerli mesajlaşma

Hamıya salam! Budur - Quarkus seriyasındakı son yazımız! (Yeri gəlmişkən, vebinarımızı izləyin "Bu Quarkus - Kubernetes yerli Java çərçivəsidir". Biz sizə sıfırdan necə başlayacağınızı və ya hazır həlləri necə köçürəcəyinizi göstərəcəyik)

Quarkus və AMQ Online istifadə edərək Red Hat OpenShift platformasında buludda yerli mesajlaşma

В əvvəlki Bu yazıda Java proqramlarının modernləşdirilməsi nəticəsində əldə edilən təkmilləşdirmələrin kəmiyyətini qiymətləndirmək üçün istifadə edilə bilən müvafiq vasitələrə baxdıq.

0.17.0 versiyasından bəri, quarkus Qabaqcıl Mesaj Queuing Protokolunun istifadəsini dəstəkləyir (AMQP), tətbiqlər və ya təşkilatlar arasında iş mesajlarının ötürülməsi üçün açıq standartdır.

Red Hat AMQ Online açıq mənbə layihəsi əsasında qurulmuş xidmətdir EnMasse və platforma əsaslı mesajlaşma mexanizminin tətbiqi Red Hat OpenShift. Bunun necə işlədiyi barədə ətraflı məlumat üçün baxın burada (EN). Bu gün biz sizə iki yeni mesajlaşma texnologiyasından istifadə edərək müasir OpenShift əsaslı mesajlaşma sistemi yaratmaq üçün AMQ Online və Quarkus-u necə birləşdirəcəyinizi göstərəcəyik.

Güman edilir ki, siz artıq AMQ Online-ı OpenShift platformasında yerləşdirmisiniz (əgər deyilsə, onda baxın quraşdırma təlimatı).

Başlamaq üçün, reaktiv mesajlaşmadan istifadə edərək sadə sifariş emal sistemi olacaq Quarkus tətbiqi yaradacağıq. Bu proqrama müəyyən intervalda mesaj növbəsinə sifarişlər göndərən sifariş generatoru, həmçinin növbədən gələn mesajları emal edəcək və brauzerdə görünə bilən təsdiqlər yaradan sifariş prosessoru daxil olacaq.

Tətbiqi yaratdıqdan sonra biz sizə mesajlaşma sistemi konfiqurasiyasını proqrama necə yerləşdirməyi və sistemdə ehtiyac duyduğumuz resursları təmin etmək üçün AMQ Online-dan istifadə etməyi göstərəcəyik.

Quarkus proqramı

Quarkus proqramımız OpenShift-də işləyir və proqramın dəyişdirilmiş versiyasıdır amqp-sürətli başlanğıc. Müştəri tərəfinin tam nümunəsi tapıla bilər burada.

Generator sifariş edin

Generator sadəcə olaraq hər 5 saniyədən bir monoton şəkildə artan sifariş identifikatorlarını “sifarişlər” ünvanına göndərir.

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

Sifariş prosessoru

Sifariş işləyicisi daha sadədir, o, sadəcə olaraq "təsdiqlər" ünvanına təsdiq identifikatorunu qaytarır.

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

Təsdiq Resursları

Təsdiq resursu tətbiqimiz tərəfindən yaradılan təsdiqlərin siyahısı üçün HTTP son nöqtəsidir.

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

nizamlama

AMQ Online-a qoşulmaq üçün proqramımız bəzi konfiqurasiya məlumatlarına ehtiyac duyacaq, yəni: Quarkus birləşdiricisinin konfiqurasiyası, AMQP son nöqtəsi məlumatı və müştəri etimadnaməsi. Əlbəttə ki, bütün konfiqurasiya məlumatlarını bir yerdə saxlamaq daha yaxşıdır, lakin Quarkus tətbiqini konfiqurasiya etmək üçün mümkün variantları göstərmək üçün onları qəsdən ayıracağıq.

Bağlayıcılar

Konnektor konfiqurasiyası tərtib zamanı proqram xüsusiyyətləri faylından istifadə etməklə təmin edilə bilər:

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

Hər şeyi sadə saxlamaq üçün biz yalnız "sifarişlər" ünvanı üçün mesaj növbəsindən istifadə edəcəyik. Tətbiqimizdəki "təsdiqlər" ünvanı yaddaşdakı növbədən istifadə edəcəkdir.

AMQP son nöqtəsi

Kompilyasiya zamanı AMQP son nöqtəsi üçün host adı və port nömrəsi bilinmir, ona görə də onlar daxil edilməlidir. Son nöqtə AMQ Online tərəfindən yaradılan konfiqurasiya xəritəsində təyin oluna bilər, ona görə də biz onları tətbiq manifestindəki mühit dəyişənləri vasitəsilə müəyyən edəcəyik:

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

Etimadnamələr

Xidmət hesabı nişanı tətbiqimizi OpenShift-ə autentifikasiya etmək üçün istifadə edilə bilər. Bunu etmək üçün əvvəlcə podun fayl sistemindən autentifikasiya işarəsini oxuyacaq fərdi ConfigSource yaratmalısınız:

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

Tətbiqi qurun və yerləşdirin

Tətbiq icra edilə bilən faylda tərtib edilməli olduğundan, GraalVM virtual maşını tələb olunur. Bunun üçün mühitin necə qurulacağına dair təfərrüatlar üçün müvafiq təlimatlara baxın Quarkus bələdçisi.

Sonra, orada verilmiş təlimatlara əməl edərək, mənbəni yükləməli, tətbiqimizi qurmalı və yerləşdirməlisiniz:

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

Bu əmrlərdən sonra proqram yerləşdiriləcək, lakin biz AMQ Online-da bizə lazım olan mesajlaşma resurslarını konfiqurasiya edənə qədər başlamayacaq.

Mesajlaşma sisteminin qurulması

İndi yalnız mesajlaşma sistemində tətbiqimizin ehtiyac duyduğu resursları təyin etmək qalır. Bunun üçün aşağıdakıları yaratmalısınız: 1) mesajlaşma sisteminin son nöqtəsini işə salmaq üçün ünvan sahəsi; 2) tətbiqdə istifadə etdiyimiz ünvanları konfiqurasiya etmək üçün ünvan; 3) Müştəri etimadnaməsini təyin etmək üçün mesajlaşma istifadəçisi.

Ünvan sahəsi

AMQ Online-da AddressSpace obyekti əlaqənin son nöqtələrini, autentifikasiya və avtorizasiya siyasətlərini paylaşan ünvanlar qrupudur. Ünvan sahəsi yaratdığınız zaman mesajlaşma son nöqtələrinin necə ifşa ediləcəyini təyin edə bilərsiniz:

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

Ünvanlar

Ünvanlar mesaj göndərmək və qəbul etmək üçün istifadə olunur. Hər bir ünvanın semantikasını təyin edən bir növü, eləcə də rezerv ediləcək resursların sayını təyin edən planı var. Ünvan, məsələn, belə müəyyən edilə bilər:

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

Mesajlaşma istifadəçisi

Yalnız etibarlı proqramların ünvanlarınıza mesaj göndərə və qəbul edə bilməsini təmin etmək üçün mesajlaşma sistemində istifadəçi yaratmalısınız. Klasterdə işləyən proqramlar üçün müştərilər OpenShift xidmət hesabından istifadə edərək autentifikasiya oluna bilər. İstifadəçi "xidmət hesabı" müəyyən edilə bilər, məsələn, bu kimi:

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

Tətbiqi konfiqurasiya etmək üçün icazələr

AMQ Online-ın AMQP son nöqtə məlumatını daxil etmək üçün istifadə etdiyimiz konfiqurasiya xəritəsini yaratması üçün Rol və Rol Bağlama müəyyən edilməlidir:

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

Konfiqurasiyaları necə tətbiq etmək olar

Mesajlaşma sistemi konfiqurasiyasını aşağıdakı kimi tətbiq edə bilərsiniz:

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

Tətbiqin yoxlanılması

Tətbiqin başladığına əmin olmaq üçün, ilk növbədə, müvafiq ünvanların yaradılıb-yaradılmadığını və aktiv olub olmadığını yoxlayaq:

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

Sonra tətbiq marşrutunun URL-sini yoxlayaq (yalnız bu ünvanı brauzerdə açın):

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

Brauzer AMQ Online tərəfindən mesajların göndərilməsi və qəbulu zamanı biletlərin vaxtaşırı yeniləndiyini göstərməlidir.

Yekunlaşdıraraq

Beləliklə, biz mesajlaşma üçün AMQP istifadə edən Quarkus tətbiqi yazdıq, tətbiqi Red Hat OpenShift platformasında işləmək üçün konfiqurasiya etdik və AMQ Online konfiqurasiyası əsasında onun konfiqurasiyasını həyata keçirdik. Daha sonra tətbiqimiz üçün mesajlaşma sistemini işə salmaq üçün lazım olan manifestləri yaratdıq.

Bununla Quarkus haqqında serial yekunlaşır, lakin qarşıda çoxlu yeni və maraqlı şeylər var, bizi izləyin!

Mənbə: www.habr.com

Добавить комментарий