Razmjena poruka u oblaku na platformi Red Hat OpenShift koristeći Quarkus i AMQ Online

Zdravo svima! Evo ga - naš završni post u seriji Quarkus! (Usput, pogledajte naš webinar “Ovo je Quarkus – Kubernetes izvorni Java framework”. Pokazat ćemo vam kako početi od nule ili prenijeti gotova rješenja)

Razmjena poruka u oblaku na platformi Red Hat OpenShift koristeći Quarkus i AMQ Online

В prethodni U ovom postu pogledali smo relevantne alate koji se mogu koristiti za kvantifikaciju poboljšanja dobijenih kao rezultat modernizacije Java aplikacija.

Od verzije 0.17.0, quarkus podržava upotrebu naprednog protokola čekanja poruka (AMQP), koji je otvoreni standard za prijenos poslovnih poruka između aplikacija ili organizacija.

Red Hat AMQ Online je usluga izgrađena na bazi open source projekta EnMasse i implementaciju mehanizma za razmjenu poruka zasnovanog na platformi Red Hat OpenShift. Za više detalja o tome kako radi, pogledajte ovdje (EN). Danas ćemo vam pokazati kako da kombinujete AMQ Online i Quarkus da biste izgradili moderan OpenShift sistem za razmenu poruka koristeći dve nove tehnologije za razmenu poruka.

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

Za početak ćemo kreirati Quarkus aplikaciju koja će biti jednostavan sistem za obradu narudžbi koristeći reaktivnu razmjenu poruka. Ova aplikacija će uključivati ​​generator naloga koji šalje narudžbe u red poruka u fiksnom intervalu, kao i procesor naloga koji će obraditi poruke iz reda i generirati potvrde koje se mogu vidjeti u pretraživaču.

Nakon što kreiramo aplikaciju, pokazat ćemo vam kako da ugradite konfiguraciju sistema za razmjenu poruka u aplikaciju i koristite AMQ Online za obezbjeđivanje resursa koji su nam potrebni na sistemu.

Quarkus app

Naša Quarkus aplikacija radi na OpenShift-u i modificirana je verzija programa amqp-brzi početak. Kompletan primjer klijentske strane može se pronaći ovdje.

Generator narudžbi

Generator jednostavno monotono šalje rastuće ID-ove naloga na adresu „narudžbi“ svakih 5 sekundi.

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

Procesor narudžbi

Rukovalac narudžbama je još jednostavniji, samo vraća ID potvrde na adresu "potvrde".

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

Resursi za potvrdu

Resurs za potvrdu je HTTP krajnja točka za popis potvrda koje generiše naša aplikacija.

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

podešavanje

Za povezivanje na AMQ Online, našoj aplikaciji će biti potrebni neki konfiguracijski podaci, i to: konfiguracija Quarkus konektora, informacije o AMQP krajnjoj tački i vjerodajnice klijenta. Naravno, bolje je sve konfiguracijske podatke držati na jednom mjestu, ali ćemo ih namjerno razdvojiti kako bismo prikazali moguće opcije za konfiguriranje Quarkus aplikacije.

Konektori

Konfiguracija konektora se može pružiti u vrijeme kompajliranja pomoću datoteke svojstava aplikacije:

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

Da stvari budu jednostavne, koristit ćemo samo red poruka za adresu "porudžbina". A adresa "potvrde" u našoj aplikaciji će koristiti red u memoriji.

AMQP krajnja tačka

U vrijeme kompajliranja, ime hosta i broj porta za AMQP krajnju tačku su nepoznati, pa se moraju ubaciti. Krajnja točka se može postaviti u configmapu koju kreira AMQ Online, tako da ćemo ih definirati kroz varijable 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

Akreditivi

Token računa usluge može se koristiti za autentifikaciju naše aplikacije na OpenShift. Da biste to učinili, prvo morate kreirati prilagođeni ConfigSource koji će čitati autentifikacijski token iz sistema datoteka 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);
    }
}

Napravite i implementirajte aplikaciju

Budući da se aplikacija mora kompajlirati u izvršnu datoteku, potrebna je GraalVM virtuelna mašina. Za detalje o tome kako postaviti okruženje za ovo, pogledajte odgovarajuća uputstva u Quarkus Guide.

Zatim, slijedeći upute date tamo, morate preuzeti izvorni izvor, izgraditi 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 naredbi, aplikacija će biti raspoređena, ali se neće pokrenuti dok ne konfiguriramo resurse za razmjenu poruka koje su nam potrebne u AMQ Online.

Podešavanje sistema za razmenu poruka

Sada ostaje samo da se podese resursi koji su potrebni našoj aplikaciji u sistemu za razmenu poruka. Da biste to uradili, potrebno je da kreirate: 1) adresni prostor za inicijalizaciju krajnje tačke sistema za razmenu poruka; 2) adresu za konfigurisanje adresa koje koristimo u aplikaciji; 3) Korisnik za razmjenu poruka da postavi klijentske vjerodajnice.

Adresni prostor

AddressSpace objekt u AMQ Online je grupa adresa koje dijele krajnje točke veze i politike provjere autentičnosti i autorizacije. Kada kreirate adresni prostor, možete odrediti kako će krajnje točke razmjene poruka biti izložene:

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

Adrese

Adrese se koriste za slanje i primanje poruka. Svaka adresa ima tip, koji određuje njenu semantiku, kao i plan, koji specificira broj resursa koji se rezervišu. Adresa se može odrediti, na primjer, ovako:

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

Korisnik razmjene poruka

Da biste bili sigurni da samo pouzdane aplikacije mogu slati i primati poruke na vaše adrese, morate kreirati korisnika u sistemu za razmjenu poruka. Za aplikacije koje se pokreću na klasteru, klijenti se mogu autentifikovati pomoću naloga usluge OpenShift. Korisnički "servisni račun" može se definirati, na primjer, 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 konfiguraciju aplikacije

Da bi AMQ Online kreirao konfiguracijsku mapu koju smo koristili za ugradnju informacija o krajnjoj tački AMQP, Uloga i Vezanje uloga moraju biti postavljeni:

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

Možete primijeniti konfiguraciju sistema za razmjenu poruka na sljedeći način:

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 bili sigurni da je aplikacija pokrenuta, prvo provjerimo da li su odgovarajuće adrese kreirane i aktivne:

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

Zatim provjerimo URL rute aplikacije (samo otvorite ovu adresu u pretraživaču):

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

Pretraživač bi trebao pokazati da se karte periodično ažuriraju kako AMQ Online šalje i prima poruke.

Sumiranje

Tako smo napisali Quarkus aplikaciju koja koristi AMQP za razmenu poruka, konfigurisali aplikaciju da radi na Red Hat OpenShift platformi i implementirali njenu konfiguraciju na osnovu AMQ Online konfiguracije. Zatim smo kreirali manifeste potrebne za inicijalizaciju sistema za razmenu poruka za našu aplikaciju.

Ovim je serijal o Quarkusu završen, ali pred nama je puno novih i zanimljivih stvari, ostanite sa nama!

izvor: www.habr.com

Dodajte komentar