PilvepÔhine sÔnumivahetus Red Hat OpenShift platvormil Quarkuse ja AMQ Online'i abil

Tere kĂ”igile! Siin ta on – meie viimane postitus Quarkuse sarjast! (Muide, vaadake meie veebiseminari «See on Quarkus – Kubernetes'i kohaliku Java raamistiku». NĂ€itame, kuidas alustada «nullist» vĂ”i liigutada olemasolevaid lahendusi)

PilvepÔhine sÔnumivahetus Red Hat OpenShift platvormil Quarkuse ja AMQ Online'i abil

Uues eelmine postituses arutame sobivaid tööriistu, millega saab kvantitatiivselt hinnata moderniseerimisega seotud tÀiustusi Java rakendustes.

Alates versioonist 0.17.0 Quarkus toetab Advanced Message Queuing Protocol (AMQP), mis on avatud standard ÀrisÔnumite edastamiseks rakenduste vÔi organisatsioonide vahel.

Red Hat AMQ Online on teenus, mis pĂ”hineb avatud projektil EnMasse ja ellu viib sĂ”numitevahetuse mehhanismi platvormil Red Hat OpenShift. Lisainfot selle tööpĂ”himĂ”tte kohta leiate .. TĂ€na nĂ€itame, kuidas ĂŒhendada AMQ Online ja Quarkus, et luua kaasaegne sĂ”numitevahetussĂŒsteem OpenShiftis kahel uuel tehnoloogial, mis on seotud sĂ”numite töötlemisega.

Eeldatakse, et olete juba juurutanud AMQ Online platvormil OpenShift (kui ei, vaadake paigaldusjuhendit).

Esmalt loome Quarkus rakenduse, mis esindab lihtsat tellimuste töötlemise sĂŒsteemi reaktiivse sĂ”numite vahetuse abil. See rakendus peab sisaldama tellimuste generaatorit, mis saadab tellimusi sĂ”numite jĂ€rjekordadesse kindla ajavahemiku tagant, ning tellimuste töötlejat, mis töötleb jĂ€rjekorrast sĂ”numeid ja genereerib kinnitusi, mida saab veebibrauseris vaadata.

PĂ€rast rakenduse loomist nĂ€itame, kuidas rakenduses sĂ”numite vahetamise sĂŒsteemi konfiguratsiooni integreerida ja kasutame AMQ Online'i, et kĂ€ivitada selle sĂŒsteemi vajalikud ressursid.

Quarkus rakendus

Meie Quarkus rakendus töötab OpenShiftis ja on muudetud versioon programmist amqp-quickstart. TÀieliku nÀite kliendipoole kohta leiate siin.

Tellimuste generaator

Generaator saadab iga 5 sekundi tagant lihtsalt sujuvalt kasvavad tellimuste identifikaatorid aadressile „orders”.

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

Tellimuste töötleja

Tellimuste töötleja on veelgi lihtsam, see tagastab lihtsalt kinnituse identifikaatori aadressile „confirmations”.

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Kinnituse identifikaator on tellimuse identifikaatori kaks korda suurem <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

Kinnituste ressursid

TÔendite ressurss on HTTP lÔpp-punkt, mida kasutatakse meie rakenduse poolt genereeritud tÔendite nimekirjaks.

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

Seadistamine

AMQ Online'iga ĂŒhendamiseks vajab meie rakendus teatud konfiguratsioonikandeid, nimelt: Quarkus-ĂŒhendaja konfiguratsioon, AMQP lĂ”pp-punkti andmed ja kliendi sisselogimisandmed. Parim on hoida kĂ”ik konfiguratsioonikanded ĂŒhes kohas, kuid me jagame need spetsiaalselt, et nĂ€idata rakenduse Quarkus seadistamise vĂ”imalusi.

Ühendajad

Ühendaja konfiguratsiooni vĂ”ib anda kompileerimise etapis rakenduse omaduste faili kaudu:

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

Lihtsuse huvides kasutame sĂ”numite jĂ€rjekorda ainult aadressi „orders“ jaoks. Aadress „confirmations“ meie rakenduses kasutab mĂ€lus olevaid jĂ€rjekordi.

AMQP lÔpp-punkt

Kompileerimise etapis pole AMQP lÔpp-punkti jaoks hosti nime ja sadama numbrit teada, seega tuleb need manustada. LÔpp-punkti saab mÀÀrata configmap'is, mille AMQ Online loob, seega mÀÀrame need keskkonnamuutujate kaudu rakenduse manifestis:

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

Kasutajatunnused

Teenuse konto mĂ€rk vĂ”ib meie rakenduse autentimiseks OpenShiftis olla kasutusel. Selleks tuleb kĂ”igepealt luua kohandatud ConfigSource, mis loeb autentimismĂ€rgi pod'i failisĂŒsteemist:

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

Rakenduse koostamine ja juurutamine

Kuna rakendus tuleb kompileerida kÀivitatavaks failiks, on vajalik GraalVM virtuaalne masin. Lisateavet selle seadistamise kohta leiate sobivatest juhistest Quarkus juhendist.

SeejÀrel, jÀrgides seal toodud juhiseid, tuleb allalaadida lÀhtekood, teostada koostamine ja juurutada meie rakendus:

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

PÀrast neid kÀske juurutatakse rakendus, kuid see ei kÀivitu enne, kui oleme AMQ Online'is seadistanud vajalikud sÔnumivahetuse ressursid.

SĂ”numivahetuse sĂŒsteemi seadistamine

JÀÀb alles mÀÀrata sĂ”numivahetuse sĂŒsteemis ressursid, mis meie rakendusele vajalikud. Selleks tuleb luua: 1) aadressiruumi, et algatada sĂ”numivahetuse sĂŒsteemi lĂ”pp-punkt; 2) aadress, et seadistada aadressid, mida rakenduses kasutame; 3) sĂ”numivahetuse sĂŒsteemi kasutaja, et mÀÀrata kliendi autentimisandmed.

Aadressiruumi

AMQ Online'i AddressSpace objekt on grupp aadressidest, mis jagavad ĂŒhiselt ĂŒhenduspunktide lĂ”pp-punkte ning autentimise ja autoriseerimise poliitikaid. Aadressiruumi loomisel saab mÀÀrata, kuidas sĂ”numivahetuse sĂŒsteemi lĂ”pp-punkte pakutakse:

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

Aadressid

Aadresseid kasutatakse sĂ”numite saatmiseks ja vastuvĂ”tmiseks. Igal aadressil on tĂŒĂŒp, mis mÀÀratleb selle tĂ€henduse, samuti plaan, mis mÀÀrab reserveeritavate ressursside arvu. Aadressi saab mÀÀratleda nĂ€iteks jĂ€rgmiselt:

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

SĂ”numite vahetussĂŒsteemi kasutaja

Kuna sĂ”numite saatmiseks ja vastuvĂ”tmiseks saaksid teie aadressidel kasutada ainult usaldusvÀÀrseid rakendusi, on vajalik luua sĂ”numite vahetussĂŒsteemis kasutaja. Klastri peal töötavate rakenduste puhul saab kliente autentida OpenShift'i teenusekonto kaudu. Kasutajat "serviceaccount" saab mÀÀratleda nĂ€iteks jĂ€rgmiselt:

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

Rakenduse seadistamiseks vajalikud Ôigused

Kuna AMQ Online peab looma configmap'i, mida kasutame AMQP lÔpp-punkti teabe sisestamiseks, on vajalik mÀÀrata roll ja rolli sidumine (Role ja 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

Kuidas rakendada konfiguratsioone

SÔnumite vahetuse konfiguratsiooni saab rakendada jÀrgmiselt:

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

Rakenduse kinnitamine

Et veenduda, et rakendus on kÀivitunud, kontrollime esmalt, kas vastavad aadressid on loodud ja aktiivsed:

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

SeejÀrel kontrollime rakenduse marsruudi URL-i (lihtsalt avame selle aadressi brauseris):

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

Brauseris peaks olema nÀhtav, et piletid uuenevad perioodiliselt, kui sÔnumid saadetakse ja AMQ Online'i kaudu vastuvÔetakse.

Teeme kokkuvÔtte

Nii, me kirjutasime Quarkus rakenduse, mis kasutab AMQP-d sĂ”numite vahetamiseks, seadistasime selle rakenduse Red Hat OpenShift platvormil töötamiseks ja rakendasime selle konfiguratsiooni AMQ Online pĂ”hjal. SeejĂ€rel lĂ”ime vajalikud manifestid meie rakenduse sĂ”numite vahetamise sĂŒsteemi kĂ€ivitamiseks.

Sellega lÔpetame Quarkuse seeria, kuid ees ootab palju uut ja huvitavat, jÀÀge meiega!

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster