Izvorno slanje poruka u oblaku na platformi Red Hat OpenShift pomoću Quarkusa i AMQ Online

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

Izvorno slanje poruka u oblaku na platformi Red Hat OpenShift pomoću Quarkusa i AMQ Online

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

Od verzije 0.17.0, kvarkus podržava korištenje 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 temelju open source projekta EnMasse i implementacija mehanizma za slanje poruka temeljenog na platformi Red Hat OpenShift. Za više detalja o tome kako to radi, pogledajte ovdje (HR). Danas ćemo vam pokazati kako kombinirati AMQ Online i Quarkus za izgradnju modernog sustava za razmjenu poruka baziranog na OpenShiftu koristeći dvije nove tehnologije za razmjenu poruka.

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

Za početak ćemo izraditi aplikaciju Quarkus koja će biti jednostavan sustav za obradu narudžbi koji koristi reaktivne poruke. Ova će aplikacija uključivati ​​generator narudžbi koji šalje narudžbe u red poruka u fiksnom intervalu, kao i procesor narudžbi koji će obrađivati ​​poruke iz reda čekanja i generirati potvrde vidljive u pregledniku.

Nakon što izradimo aplikaciju, pokazat ćemo vam kako ugraditi konfiguraciju sustava za razmjenu poruka u aplikaciju i koristiti AMQ Online za osiguravanje resursa koji su nam potrebni u sustavu.

Aplikacija Quarkus

Naša aplikacija Quarkus radi na OpenShiftu i modificirana je verzija programa amqp-brzi početak. Potpuni primjer klijentske strane može se pronaći здесь.

Generator narudžbi

Generator jednostavno monotono šalje rastuće ID-ove narudžbi na adresu "narudžbe" 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žbe

Rukovatelj narudžbama još je 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 potvrde je HTTP krajnja točka za ispisivanje potvrda koje je generirala 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 s AMQ Online našoj će aplikaciji biti potrebni neki konfiguracijski podaci, naime: konfiguracija Quarkus konektora, informacije o krajnjoj točki AMQP-a i vjerodajnice klijenta. Naravno, bolje je sve konfiguracijske podatke držati na jednom mjestu, no mi ćemo ih namjerno odvojiti kako bismo prikazali moguće mogućnosti konfiguracije Quarkus aplikacije.

Priključci

Konfiguracija konektora može se osigurati tijekom kompajliranja pomoću datoteke svojstava aplikacije:

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

Kako bismo pojednostavili stvari, koristit ćemo samo red poruka za adresu "narudžbi". A adresa "potvrda" u našoj aplikaciji koristit će red čekanja u memoriji.

AMQP krajnja točka

U vrijeme kompajliranja naziv glavnog računala i broj priključka za AMQP krajnju točku su nepoznati, pa se moraju ubaciti. Krajnja točka može se postaviti u konfiguracijskoj mapi koju je izradio AMQ Online, pa ć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

vjerodajnice

Token servisnog računa može se koristiti za autentifikaciju naše aplikacije na OpenShift. Da biste to učinili, prvo morate stvoriti prilagođeni ConfigSource koji će čitati autentifikacijski token iz datotečnog sustava modula:

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

Izradite i implementirajte aplikaciju

Budući da se aplikacija mora kompajlirati u izvršnu datoteku, potreban je GraalVM virtualni stroj. Za detalje o tome kako postaviti okruženje za to, pogledajte odgovarajuće upute u Quarkus vodič.

Zatim, slijedeći tamo dane upute, morate preuzeti 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 se implementirati, ali se neće pokrenuti dok ne konfiguriramo resurse za razmjenu poruka koje su nam potrebne u AMQ Online.

Postavljanje sustava za razmjenu poruka

Sada preostaje samo postaviti resurse koje naša aplikacija treba u sustavu za razmjenu poruka. Da biste to učinili, trebate kreirati: 1) adresni prostor za inicijalizaciju krajnje točke sustava za razmjenu poruka; 2) adresa za konfiguriranje adresa koje koristimo u aplikaciji; 3) Korisnik za slanje poruka za postavljanje vjerodajnica klijenta.

Adresni prostor

Objekt AddressSpace u AMQ Online je grupa adresa koje dijele krajnje točke veze i pravila provjere autentičnosti i autorizacije. Kada stvorite adresni prostor, možete odrediti kako će krajnje točke slanja 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 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 rezerviraju. 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 za slanje poruka

Kako biste osigurali da samo pouzdane aplikacije mogu slati i primati poruke na vaše adrese, morate stvoriti korisnika u sustavu za razmjenu poruka. Za aplikacije koje se izvode na klasteru, klijenti se mogu autentificirati pomoću računa usluge OpenShift. Korisnički "serviceaccount" 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"]

Dopuštenja za konfiguriranje aplikacije

Kako bi AMQ Online stvorio konfiguracijsku mapu koju smo koristili za ugradnju informacija o krajnjoj točki AMQP-a, Role i RoleBinding 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

Konfiguraciju sustava za razmjenu poruka možete primijeniti 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

Provjera prijave

Kako bismo bili sigurni da je aplikacija pokrenuta, prije svega provjerimo jesu li 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 pregledniku):

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

Preglednik bi trebao pokazati da se karte povremeno ažuriraju kako AMQ Online šalje i prima poruke.

Sažimanje

Tako smo napisali Quarkus aplikaciju koja koristi AMQP za razmjenu poruka, konfigurirali aplikaciju za rad na Red Hat OpenShift platformi i implementirali njezinu konfiguraciju temeljenu na AMQ Online konfiguraciji. Zatim smo izradili manifeste potrebne za inicijalizaciju sustava za razmjenu poruka za našu aplikaciju.

Ovime završavamo serijal o Quarkusu, ali čeka nas puno toga novog i zanimljivog, pratite nas!

Izvor: www.habr.com

Dodajte komentar