Cloud-oriented messaging on the Red Hat OpenShift platform using Quarkus and AMQ Online

Ahojte všetci! Tu je náš posledný príspevok v sérii o Quarkus! (Mimochodom, pozrite si náš webinár „Quarkus – Kubernetes natívny Java framework“. Predvedieme, ako začať „od nuly“ alebo preniesť existujúce riešenia)

Cloud-oriented messaging on the Red Hat OpenShift platform using Quarkus and AMQ Online

V predchádzajúcom v príspevku sme preskúmali príslušné nástroje, pomocou ktorých môžeme kvantitatívne hodnotiť zlepšenia, ktoré sme dosiahli modernizáciou Java aplikácií.

Od verzie 0.17.0, Quarkus podporuje využívanie Advanced Message Queuing Protocol (AMQP), ktorý je otvoreným štandardom pre prenos obchodných správ medzi aplikáciami alebo organizáciami.

Red Hat AMQ Online je služba vybudovaná na základe otvoreného projektu EnMasse a implementuje mechanizmus výmeny správ na báze platformy Red Hat OpenShift. Viac o tom, ako to funguje, si prečítajte tu (EN). Dnes ukážeme, ako skombinovať AMQ Online a Quarkus, aby sme vybudovali moderný systém výmeny správ na báze OpenShift s použitím dvoch nových technológií súvisiacich so spracovaním správ.

Predpokladá sa, že ste už nasadili AMQ Online na platforme OpenShift (ak nie, pozrite si príručku na inštaláciu).

Na začiatok vytvoríme aplikáciu Quarkus, ktorá predstavuje jednoduchý systém spracovania objednávok s použitím reaktívnej výmeny správ. Táto aplikácia bude obsahovať generátor objednávok, ktorý pravidelne odosiela objednávky do fronty správ, a spracovateľ objednávok, ktorý spracováva správy z fronty a vytvára potvrdenia dostupné na prezeranie v prehliadači.

Po vytvorení aplikácie ukážeme, ako integrovať konfiguráciu systému výmeny správ a aktivujeme AMQ Online, aby sme na tejto platforme inicializovali potrebné zdroje.

Aplikácia Quarkus

Naša aplikácia Quarkus beží na OpenShift a je modifikovanou verziou programu amqp-quickstart. Kompletný príklad klientskej časti nájdete tu.

Generátor objednávok

Generátor každých 5 sekúnd jednoducho monotonicky odosiela rastúce identifikátory objednávok 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++);
    }
}

Spracovateľ objednávok

Spracovateľ objednávok je ešte jednoduchší, jednoducho vracia identifikátor potvrdenia na adresu „confirmations“.

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Identifikačný kód potvrdenia je rovný dvojnásobku identifikačného kódu objednávky <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

Súvisiace zdroje potvrdení

Ressursa potvrdenia je HTTP koncový bod pre zoznam potvrdení vytvorených našou aplikáciou.

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

Nastavenie

Na pripojenie k AMQ Online bude našej aplikácii potrebné niekoľko konfiguračných údajov, konkrétne: konfigurácia Quarkus konektora, informácie o AMQP koncovom bode a klientské prihlasovacie údaje. Najlepšie je samozrejme mať všetky konfiguračné údaje na jednom mieste, ale zvyčajne ich rozdelíme, aby sme ukázali možné varianty nastavenia aplikácie Quarkus.

Konektory

Konfiguráciu konektora je možné poskytnúť počas kompilácie prostredníctvom aplikačného konfiguračného súboru:

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

Aby sme to zjednodušili, budeme používať frontu správ iba pre adresu „orders“. Adresa „confirmations“ v našej aplikácii bude používať frontu v pamäti.

AMQP koncový bod

Počas kompilácie nie sú názov hostiteľa a číslo portu pre AMQP koncový bod známe, preto ich treba injektovať. Koncový bod je možné nastaviť v configmap, ktorý vytvorí AMQ Online, preto ich definujeme prostredníctvom prostredia v manifeste aplikácie:

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

Prihlasovacie údaje

Token účtu služby môže byť použitý na autentifikáciu našej aplikácie v OpenShift. Najprv je nutné vytvoriť vlastný ConfigSource, ktorý bude čítať token autentifikácie zo súborového systému podu:

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

Zostavenie a nasadenie aplikácie

Keďže aplikáciu je potrebné skompilovať do spustiteľného súboru, bude vyžadovaná virtuálna mašina GraalVM. Viac informácií o tom, ako nastaviť prostredie, nájdete v príslušných pokynoch v sprievodcovi Quarkus.

Následne, podľa pokynov tam uvedených, je potrebné stiahnuť zdrojový kód, vykonať zostavenie a nasadiť našu aplikáciu:

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 týchto príkazoch bude aplikácia nasadená, ale nespustí sa, kým nenastavíme potrebné zdroje správy správ v AMQ Online.

Nastavenie systému správy správ

Teraz je potrebné v systéme správy správ nastaviť zdroje, ktoré naša aplikácia potrebuje. Na to je potrebné vytvoriť: 1) priestor adries, aby sa inicializoval koncový bod systému správy správ; 2) adresu, aby sa nastavili adresy, ktoré používame v aplikácii; 3) používateľa systému správy správ, aby sa určili prihlasovacie údaje klienta.

Priestor adries

Objekt AddressSpace v AMQ Online je skupina adries, ktoré spoločne využívajú koncové body pripojenia, ako aj politiky autentifikácie a autorizácie. Pri vytváraní priestoru adries je možné zadať, ako budú koncové body systému správy správ poskytované:

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

Adresy

Adresy sa používané na odosielanie a prijímanie správ. Každý adres má typ, ktorý určuje jeho sémantiku, ako aj plán, ktorý určuje množstvo rezervovaných zdrojov. Adresu môžeme definovať napríklad takto:

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

Používateľ systému výmeny správ

Aby mohli iba dôveryhodné aplikácie odosielať a prijímať správy na vaše adresy, je potrebné v systéme výmeny správ vytvoriť používateľa. Pre aplikácie bežiace na klastrov môže byť autentizácia klientov vykonaná pomocou účtu služby OpenShift. Používateľa „serviceaccount“ môžeme definovať napríklad takto:

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

Oprávnenia na nastavenie aplikácie

Aby AMQ Online mohol vytvoriť configmap, ktorý sme použili na zavedenie informácií o koncovej AMQP, je potrebné zadať rolu a viazanie roly (Role a 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

Ako aplikovať konfigurácie

Konfiguráciu systému výmeny správ môžeme aplikovať takto:

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

Overenie aplikácie

Aby sme sa uistili, že aplikácia sa spustila, najskôr skontrolujeme, či sú príslušné adresy vytvorené a aktívne:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Ešte nie je pripravené"; sleep 5; done

Potom skontrolujeme URL trasy aplikácie (jednoducho otvoríme túto adresu v prehliadači):

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

V prehliadači by malo byť vidieť, že tikety sa periodicky aktualizujú, keď správy odosielajú a prijímajú AMQ Online.

Zhrnieme to

Napísali sme aplikáciu Quarkus, ktorá využíva AMQP na výmenu správ, nastavili sme túto aplikáciu pre platformu Red Hat OpenShift a implementovali jej konfiguráciu na základe konfigurácie AMQ Online. Následne sme vytvorili manifesty potrebné na inicializáciu systému výmeny správ pre našu aplikáciu.

Týmto končíme sériu o Quarkus, avšak pred nami je ešte veľa nového a zaujímavého, zostaňte s nami!

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster