Pilvipohjainen viestintä Red Hat OpenShift -alustalla Quarkuksen ja AMQ Onlinen avulla

Hei kaikki! Tässä se on - viimeinen postauksemme Quarkus-sarjassa! (Katso muuten webinaarimme "Tämä on Quarkus - Kubernetesin natiivi Java-kehys". Näytämme sinulle kuinka aloittaa alusta tai siirtää valmiita ratkaisuja)

Pilvipohjainen viestintä Red Hat OpenShift -alustalla Quarkuksen ja AMQ Onlinen avulla

В Edellinen Tässä viestissä tarkastelimme asiaankuuluvia työkaluja, joiden avulla voidaan kvantifioida Java-sovellusten modernisoinnin tuloksena saatuja parannuksia.

Versiosta 0.17.0 lähtien, quarkus tukee Advanced Message Queuing Protocol -protokollan käyttöä (AMQP), joka on avoin standardi yritysviestien siirtämiseen sovellusten tai organisaatioiden välillä.

Red Hat AMQ verkossa on avoimen lähdekoodin projektin pohjalta rakennettu palvelu EnMasse ja alustapohjaisen viestinvälitysmekanismin toteuttaminen Red Hat OpenShift. Katso lisätietoja sen toiminnasta täällä (FI). Tänään näytämme sinulle, kuinka yhdistää AMQ Online ja Quarkus rakentamaan moderni OpenShift-pohjainen viestintäjärjestelmä käyttämällä kahta uutta viestintätekniikkaa.

Oletetaan, että olet jo ottanut AMQ Onlinen käyttöön OpenShift-alustalla (jos ei, katso Asennusohje).

Aluksi luomme Quarkus-sovelluksen, joka on yksinkertainen tilausten käsittelyjärjestelmä, joka käyttää reaktiivista viestintää. Tämä sovellus sisältää tilausgeneraattorin, joka lähettää tilaukset sanomajonoon tietyin väliajoin, sekä tilausprosessorin, joka käsittelee jonosta tulevat viestit ja luo selaimessa näkyvät vahvistukset.

Kun olemme luoneet sovelluksen, näytämme sinulle, kuinka voit upottaa viestintäjärjestelmän kokoonpanon sovellukseen ja käyttää AMQ Onlinea tarvittavien resurssien tarjoamiseen järjestelmässä.

Quarkus sovellus

Quarkus-sovelluksemme toimii OpenShiftillä ja on ohjelman muokattu versio amqp-quickstart. Täydellinen esimerkki asiakaspuolelta löytyy täällä.

Tilausgeneraattori

Generaattori yksinkertaisesti lähettää monotonisesti kasvavat tilaustunnukset "tilaus"-osoitteeseen 5 sekunnin välein.

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

Tilausten käsittelijä

Tilausten käsittelijä on vielä yksinkertaisempi, se palauttaa vain vahvistustunnuksen "vahvistus"-osoitteeseen.

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

Vahvistusresurssit

Vahvistusresurssi on HTTP-päätepiste sovelluksemme luomien vahvistusten luetteloimiseksi.

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

säätö

Yhteyden muodostamiseksi AMQ Onlineen sovelluksemme tarvitsee joitain määritystietoja, nimittäin: Quarkus-liittimen kokoonpano, AMQP-päätepistetiedot ja asiakkaan tunnistetiedot. On tietysti parempi säilyttää kaikki konfigurointitiedot yhdessä paikassa, mutta erottelemme ne tarkoituksella näyttääksemme mahdolliset Quarkus-sovelluksen konfigurointivaihtoehdot.

Liittimet

Liittimen määritykset voidaan antaa käännösvaiheessa käyttämällä sovelluksen ominaisuustiedostoa:

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

Yksinkertaisuuden vuoksi käytämme vain viestijonoa "tilaus"-osoitteelle. Ja "vahvistus"-osoite sovelluksessamme käyttää jonoa muistissa.

AMQP-päätepiste

Käännöshetkellä AMQP-päätepisteen isäntänimi ja portin numero ovat tuntemattomia, joten ne on lisättävä. Päätepiste voidaan asettaa AMQ Onlinen luomassa konfiguraatiokartassa, joten määritämme ne ympäristömuuttujien kautta sovellusluettelossa:

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

Valtuustiedot

Palvelutilitunnusta voidaan käyttää sovelluksemme todentamiseen OpenShiftille. Tätä varten sinun on ensin luotava mukautettu ConfigSource, joka lukee todennustunnuksen podin tiedostojärjestelmästä:

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

Rakenna ja ota sovellus käyttöön

Koska sovellus on käännettävä suoritettavaksi tiedostoksi, tarvitaan GraalVM-virtuaalikone. Katso lisätietoja ympäristön määrittämisestä tätä varten vastaavista ohjeista Quarkus-opas.

Sitten sinun on ladattava lähde, laadittava ja otettava käyttöön sovelluksemme noudattamalla siellä annettuja ohjeita:

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

Näiden komentojen jälkeen sovellus otetaan käyttöön, mutta se ei käynnisty ennen kuin määritämme tarvitsemamme viestiresurssit AMQ Onlinessa.

Viestijärjestelmän määrittäminen

Nyt on enää jäljellä sovelluksemme tarvitsemien resurssien asettaminen viestintäjärjestelmään. Tätä varten sinun on luotava: 1) osoiteavaruus viestinvälitysjärjestelmän päätepisteen alustamiseksi; 2) osoite sovelluksessa käyttämiemme osoitteiden määrittämiseksi; 3) Viestintäkäyttäjä asettaa asiakkaan tunnistetiedot.

Osoitetila

AMQ Onlinen AddressSpace-objekti on ryhmä osoitteita, jotka jakavat yhteyden päätepisteet sekä todennus- ja valtuutuskäytännöt. Kun luot osoiteavaruuden, voit määrittää, kuinka viestien päätepisteet paljastetaan:

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

osoite

Osoitteita käytetään viestien lähettämiseen ja vastaanottamiseen. Jokaisella osoitteella on tyyppi, joka määrittää sen semantiikan, sekä suunnitelma, joka määrittää varattavien resurssien määrän. Osoite voidaan määrittää esimerkiksi näin:

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

Viestintäkäyttäjä

Varmistaaksesi, että vain luotetut sovellukset voivat lähettää ja vastaanottaa viestejä osoitteisiin, sinun on luotava käyttäjä viestijärjestelmään. Klusterissa toimivien sovellusten asiakkaat voidaan todentaa OpenShift-palvelutilin avulla. Käyttäjä "palvelutili" voidaan määritellä esimerkiksi näin:

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

Sovelluksen määritysoikeudet

Jotta AMQ Online voi luoda konfiguraatiokartan, jota käytimme AMQP-päätepistetietojen upottamiseen, Role ja RoleBinding on asetettava:

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

Kuinka konfiguraatioita käytetään

Voit käyttää viestintäjärjestelmän kokoonpanoa seuraavasti:

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

Sovelluksen vahvistus

Varmistaaksesi, että sovellus on käynnistynyt, tarkista ensin, onko vastaavat osoitteet luotu ja aktiivisia:

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

Tarkastetaan sitten sovelluksen reitin URL-osoite (avaa tämä osoite selaimessa):

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

Selaimen tulee näyttää, että lippuja päivitetään säännöllisesti, kun AMQ Online lähettää ja vastaanottaa viestejä.

Yhteenvetona

Joten kirjoitimme Quarkus-sovelluksen, joka käyttää AMQP:tä viestintään, määritimme sovelluksen toimimaan Red Hat OpenShift -alustalla ja toteutimme sen konfiguroinnin AMQ Online -kokoonpanon perusteella. Loimme sitten luettelot, joita tarvitaan sovelluksemme viestintäjärjestelmän alustamiseen.

Tähän päättyy Quarkusta käsittelevä sarja, mutta paljon uutta ja mielenkiintoista on luvassa, pysy kuulolla!

Lähde: will.com

Lisää kommentti