Oblačno orijentirana razmjena poruka na platformi Red Hat OpenShift koristeći Quarkus i AMQ Online

Pozdrav svima! Eto ga – naš završni post iz serije o Quarkusu! (Usput, pogledajte naš webinari «To je Quarkus – Kubernetes native Java okvir». Prikazat ćemo kako započeti «od nule» ili prenijeti gotova rješenja)

Oblačno orijentirana razmjena poruka na platformi Red Hat OpenShift koristeći Quarkus i AMQ Online

U u prethodnom postu pregledali smo odgovarajuće alate kroz koje se mogu kvantitativno procijeniti poboljšanja koja su ostvarena modernizacijom Java aplikacija.

Počevši od verzije 0.17.0, Quarkus podržava korištenje Advanced Message Queuing Protocol (AMQP), koji je otvoreni standard za prijenos poslovnih poruka između aplikacija ili organizacija.

Red Hat AMQ Online – to je usluga izgrađena na temelju otvorenog projekta EnMasse i provodi mehanizam razmjene poruka temeljen na platformi Red Hat OpenShift. Više o tome kako je to uređeno, pogledajte ovdje (EN). Danas ćemo pokazati kako spojiti AMQ Online i Quarkus kako bismo izgradili moderni sustav razmjene poruka temeljen na OpenShiftu koristeći dvije nove tehnologije povezane s obradom poruka.

Pretpostavlja se da ste već implementirali AMQ Online na platformi OpenShift (ako niste, pogledajte upute za instalaciju).

Na početku ćemo stvoriti Quarkus aplikaciju koja će predstavljati jednostavni sustav obrade narudžbi koristeći reaktivnu razmjenu poruka. Ova aplikacija će uključivati generatore narudžbi koji će slati narudžbe u red poruka prema fiksnom intervalu, kao i obradu narudžbi koja će obraditi poruke iz reda i formirati potvrde dostupne za pregled u pregledniku.

Nakon kreiranja aplikacije pokazat ćemo kako implementirati konfiguraciju sustava razmjene poruka i uključiti AMQ Online kako bismo inicijalizirali potrebne resurse na ovom sustavu.

Quarkus aplikacija

Naša Quarkus aplikacija radi na OpenShiftu i predstavlja modificiranu verziju programa amqp-quickstart. Potpuni primjer klijentskog dijela možete pronaći ovdje.

Generator narudžbi

Generator svakih 5 sekundi jednostavno monotono šalje rastuće identifikatore narudžbi na adresu «orders».

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

Obraditelj narudžbi

Obrada narudžbi je još jednostavnija, samo vraća identifikator potvrde na adresu „confirmations“.

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Identifikator potvrde je dvostruko veći od identifikatora narudžbe <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

Resursi potvrde

Resurs potvrde je HTTP krajnja tačka za popis potvrda generiranih radom naše aplikacije.

@Path("/confirmations")
public class ConfirmationResource {
 
    @Inject
    @Stream("confirmations") Publisher orders;
 
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
 
 
    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher stream() {
        return orders;
    }
}

Podešavanje

Za povezivanje s AMQ Online, našoj aplikaciji bit će potrebni neki konfiguracijski podaci, a to su: konfiguracija Quarkus konektora, informacije o AMQP krajnjoj tački i korisnički kredencijali. Najbolje je, naravno, držati sve konfiguracijske podatke na jednom mestu, ali ćemo ih namerno razdvojiti kako bismo prikazali moguće opcije za podešavanje aplikacije Quarkus.

Konektori

Konfiguracija konektora može se pružiti u fazi kompilacije pomoću datoteke svojstava aplikacije:

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

Kako bismo olakšali, koristićemo red poruka samo za adresu „orders“. A adresa „confirmations“ u našoj aplikaciji koristiće red u memoriji.

AMQP krajnja tačka

Tokom kompilacije ime domaćina i broj porta za AMQP krajnju tačku nisu poznati, pa ih je potrebno uvesti. Krajnju tačku možemo odrediti u configmap-u koji kreira AMQ Online, pa ćemo ih definisati putem promenljivih okruženja u manifestu aplikacije:

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

Kredencijali

Token za servisni račun može se koristiti za autentifikaciju naše aplikacije u OpenShift-u. Da bismo to učinili, prvo treba da kreiramo prilagođeni ConfigSource koji će čitati token za autentifikaciju iz datotečnog sistema pod-a:

public class MessagingCredentialsConfigSource implements ConfigSource {
    private static final Set propertyNames;
 
    static {
        propertyNames = new HashSet();
        propertyNames.add("amqp-username");
        propertyNames.add("amqp-password");
    }
 
    @Override
    public Set getPropertyNames() {
        return propertyNames;
    }
 
    @Override
    public Map getProperties() {
        try {
            Map 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);
    }
}

Izgradnja i implementacija aplikacije

Budući da aplikaciju treba konvertirati u izvršnu datoteku, biće potreban virtualni stroj GraalVM. Više informacija o tome kako postaviti ovo okruženje možete pronaći u Quarkus vodiču.

Nakon toga, slijedeći upute tamo, potrebno je preuzeti izvorni kod, izvršiti izgradnju i implementirati našu aplikaciju:

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

Nakon ovih komandi aplikacija će biti implementirana, ali se neće pokrenuti dok ne postavimo potrebne resurse za razmjenu poruka u AMQ Online.

Postavljanje sustava razmjene poruka

Sada je potrebno definirati resurse unutar sustava razmjene poruka koji su potrebni našoj aplikaciji. Za to treba stvoriti: 1) adresni prostor za inicijalizaciju krajnje točke sustava razmjene poruka; 2) adresu za postavljanje adresa koje koristimo u aplikaciji; 3) korisnika sustava razmjene poruka kako bismo definirali klijentske vjerodajnice.

Adresni prostor

Objekt AddressSpace u AMQ Online predstavlja skup adresa koje zajednički koriste krajnje točke povezivanja, kao i politike autentifikacije i autorizacije. Prilikom stvaranja adresnog prostora, možete definirati na koji način će krajnje točke sustava razmjene poruka biti dostupne:

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

Adresa

Adrese se koriste za slanje i primanje poruka. Svaka adresa ima tip koji određuje njenu semantiku, kao i plan koji postavlja količinu rezerviranih resursa. Adresa se može definisati ovako:

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

Korisnik sistema za razmenu poruka

Da bi samo pouzdane aplikacije mogle slati i primati poruke na vaše adrese, potrebno je kreirati korisnika u sistemu za razmenu poruka. Za aplikacije koje rade u klasteru, klijente se može autentifikovati pomoću naloga usluge OpenShift. Korisnika 'serviceaccount' može se definisati ovako:

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

Dozvole za podešavanje aplikacije

Da bi AMQ Online mogao kreirati configmap koji smo koristili za implementaciju informacija o AMQP tački, treba definisati ulogu i vezu uloge (Role i 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

Kako primeniti konfiguracije

Konfiguraciju sistema za razmenu poruka možete primeniti ovako:

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

Verifikacija aplikacije

Da bismo proverili da li je aplikacija pokrenuta, prvo ćemo proveriti da li su odgovarajuće adrese kreirane i aktivne:

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

Zatim ćemo proveriti URL aplikacijske rute (samo ćemo otvoriti ovu adresu u pretraživaču):

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

U pretraživaču bi trebalo da vidite da se tiketi povremeno ažuriraju kako se poruke šalju i primaju u AMQ Online.

Zaključujemo

Dakle, napisali smo Quarkus aplikaciju koja koristi AMQP za razmjenu poruka, postavili smo tu aplikaciju za rad na platformi Red Hat OpenShift, te implementirali njenu konfiguraciju na temelju konfiguracije AMQ Online. Zatim smo stvorili manifeste potrebne za inicijalizaciju sustava za razmjenu poruka za našu aplikaciju.

Time završavamo seriju o Quarkusu, ali nas očekuje mnogo novih i zanimljivih sadržaja, ostanite s nama!

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster