Izvorno sporočanje v oblaku na platformi Red Hat OpenShift z uporabo Quarkus in AMQ Online

Pozdravljeni vsi skupaj! Tukaj je - naša zadnja objava v seriji Quarkus! (Mimogrede, oglejte si naš spletni seminar »To je Quarkus – izvorno ogrodje Java Kubernetes«. Pokazali vam bomo, kako začeti iz nič ali prenesti že pripravljene rešitve)

Izvorno sporočanje v oblaku na platformi Red Hat OpenShift z uporabo Quarkus in AMQ Online

В prejšnji V tem prispevku smo si ogledali ustrezna orodja, ki jih je mogoče uporabiti za kvantificiranje izboljšav, pridobljenih kot rezultat posodobitve aplikacij Java.

Od različice 0.17.0, quarkus podpira uporabo protokola Advanced Message Queuing Protocol (AMQP), ki je odprt standard za prenos poslovnih sporočil med aplikacijami ali organizacijami.

Red Hat AMQ na spletu je storitev zgrajena na osnovi odprtokodnega projekta EnMasse in izvajanje mehanizma za sporočanje, ki temelji na platformi Red Hat OpenShift. Za več podrobnosti o tem, kako deluje, glejte tukaj (EN). Danes vam bomo pokazali, kako združiti AMQ Online in Quarkus za izgradnjo sodobnega sporočilnega sistema, ki temelji na OpenShift, z uporabo dveh novih tehnologij za sporočanje.

Predpostavlja se, da ste AMQ Online že namestili na platformo OpenShift (če niste, glejte vodnik za namestitev).

Za začetek bomo ustvarili aplikacijo Quarkus, ki bo preprost sistem za obdelavo naročil z uporabo reaktivnega sporočanja. Ta aplikacija bo vključevala generator naročil, ki pošilja naročila v čakalno vrsto sporočil v določenem intervalu, kot tudi procesor naročil, ki bo obdelal sporočila iz čakalne vrste in ustvaril potrditve, vidne v brskalniku.

Ko ustvarimo aplikacijo, vam bomo pokazali, kako vdelati konfiguracijo sistema za sporočanje v aplikacijo in uporabiti AMQ Online za zagotavljanje virov, ki jih potrebujemo v sistemu.

Aplikacija Quarkus

Naša aplikacija Quarkus deluje na OpenShift in je spremenjena različica programa amqp-hitri zagon. Najdete lahko celoten primer odjemalske strani tukaj.

Generator naročil

Generator preprosto monotono pošilja naraščajoče ID-je naročil na naslov »naročila« vsakih 5 sekund.

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

Obdelovalec naročil

Upravljavec naročil je še enostavnejši, le potrditveni ID vrne na naslov "potrditve".

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

Potrditveni viri

Potrditveni vir je končna točka HTTP za seznam potrditev, ki jih ustvari 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;
    }
}

prilagoditev

Za povezavo z AMQ Online bo naša aplikacija potrebovala nekaj konfiguracijskih podatkov, in sicer: konfiguracijo priključka Quarkus, informacije o končni točki AMQP in poverilnice odjemalca. Vse konfiguracijske podatke je seveda bolje hraniti na enem mestu, vendar jih bomo namenoma ločili, da prikažemo možne možnosti konfiguracije aplikacije Quarkus.

Konektorji

Konfiguracijo konektorja lahko zagotovite med prevajanjem z uporabo datoteke lastnosti aplikacije:

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

Da bi stvari poenostavili, bomo za naslov »naročila« uporabili samo čakalno vrsto sporočil. In naslov »potrditve« v naši aplikaciji bo uporabljal čakalno vrsto v pomnilniku.

končna točka AMQP

V času prevajanja sta ime gostitelja in številka vrat za končno točko AMQP neznana, zato ju je treba vstaviti. Končno točko lahko nastavite v konfiguracijskem zemljevidu, ki ga ustvari AMQ Online, zato jih bomo definirali s spremenljivkami okolja v 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

Poverilnice

Žeton storitvenega računa se lahko uporablja za preverjanje pristnosti naše aplikacije v OpenShift. Če želite to narediti, morate najprej ustvariti ConfigSource po meri, ki bo prebral žeton za preverjanje pristnosti iz datotečnega sistema sklopa:

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

Zgradite in namestite aplikacijo

Ker mora biti aplikacija prevedena v izvršljivo datoteko, je potreben virtualni stroj GraalVM. Za podrobnosti o tem, kako nastaviti okolje za to, glejte ustrezna navodila v Vodnik Quarkus.

Nato morate po tam podanih navodilih prenesti izvorno kodo, zgraditi in razmestiti našo aplikacijo:

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

Po teh ukazih bo aplikacija razporejena, vendar se ne bo zagnala, dokler ne konfiguriramo virov za sporočanje, ki jih potrebujemo v AMQ Online.

Nastavitev sistema za sporočanje

Zdaj ostane le še, da nastavimo vire, ki jih naša aplikacija potrebuje v sistemu za sporočanje. Če želite to narediti, morate ustvariti: 1) naslovni prostor za inicializacijo končne točke sistema za sporočanje; 2) naslov za konfiguracijo naslovov, ki jih uporabljamo v aplikaciji; 3) Uporabnik za pošiljanje sporočil za nastavitev poverilnic odjemalca.

Naslovni prostor

Objekt AddressSpace v AMQ Online je skupina naslovov, ki si delijo končne točke povezave ter pravilnike za preverjanje pristnosti in avtorizacijo. Ko ustvarite naslovni prostor, lahko določite, kako bodo izpostavljene končne točke sporočanja:

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

Naslov

Naslovi se uporabljajo za pošiljanje in prejemanje sporočil. Vsak naslov ima vrsto, ki določa njegovo semantiko, kot tudi načrt, ki določa število virov, ki jih je treba rezervirati. Naslov je mogoče določiti na primer takole:

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

Uporabnik sporočil

Če želite zagotoviti, da lahko samo zaupanja vredne aplikacije pošiljajo in prejemajo sporočila na vaše naslove, morate ustvariti uporabnika v sistemu za sporočanje. Za aplikacije, ki se izvajajo v gruči, je mogoče odjemalce overiti z računom storitve OpenShift. Uporabniški "serviceaccount" je mogoče definirati na primer takole:

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

Dovoljenja za konfiguracijo aplikacije

Da lahko AMQ Online ustvari konfiguracijski zemljevid, ki smo ga uporabili za vdelavo informacij o končni točki AMQP, morata biti nastavljeni Role in 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 uporabiti konfiguracije

Konfiguracijo sistema za sporočanje lahko uporabite takole:

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

Preverjanje vloge

Da se prepričamo, da se je aplikacija zagnala, najprej preverimo, ali so ustrezni naslovi ustvarjeni in aktivni:

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

Nato preverimo URL poti aplikacije (samo odprite ta naslov v brskalniku):

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

Brskalnik mora pokazati, da se vstopnice redno posodabljajo, ko AMQ Online pošilja in prejema sporočila.

Seštejemo

Tako smo napisali aplikacijo Quarkus, ki uporablja AMQP za sporočanje, konfigurirali aplikacijo za delovanje na platformi Red Hat OpenShift in implementirali njeno konfiguracijo na podlagi konfiguracije AMQ Online. Nato smo ustvarili manifeste, potrebne za inicializacijo sporočilnega sistema za našo aplikacijo.

S tem smo zaključili serijo o Quarkusu, vendar je pred nami še veliko novega in zanimivega, spremljajte nas!

Vir: www.habr.com

Dodaj komentar