Felhőalapú üzenetküldés a Red Hat OpenShift platformon a Quarkus és az AMQ Online segítségével

Üdvözlet mindenkinek! Itt a végső bejegyzésünk a Quarkusról szóló sorozatban! (Egyébként nézd meg a webináriumunkat „Ez a Quarkus – a Kubernetes natív Java keretrendszer“. Megmutatjuk, hogyan lehet „nulláról“ indítani vagy kész megoldásokat átvinni.)

Felhőalapú üzenetküldés a Red Hat OpenShift platformon a Quarkus és az AMQ Online segítségével

A A korábbi bejegyzésünkben a megfelelő eszközöket használtuk, amelyek segítségével mennyiségileg értékelhetjük a modernizációs folyamat során elért javulásokat a Java alkalmazásokban.

A 0.17.0 verziótól kezdve Quarkus támogatja az Advanced Message Queuing Protocol (AMQP), amely egy nyílt üzleti üzenettovábbító szabvány az alkalmazások vagy szervezetek között.

A Red Hat AMQ Online egy olyan szolgáltatás, amely egy nyílt projekt, az EnMasse alapján épült, és megvalósítja az üzenetküldő mechanizmust a Red Hat OpenShiftplatformon. További részletek a működéséről itt találhatók: itt (EN). Ma megmutatjuk, hogyan lehet az AMQ Online-t és a Quarkust összekapcsolni, hogy egy modern üzenetküldő rendszert építsünk az OpenShift segítségével, két új, üzenetkezeléssel kapcsolatos technológia felhasználásával.

Feltételezzük, hogy már telepítetted az AMQ Online-t az OpenShift platformra (ha nem, akkor nézd meg a telepítési útmutatót).

). Először létrehozunk egy Quarkus alkalmazást, amely egy egyszerű rendeléskezelő rendszert fog bemutatni reaktív üzenetküldéssel. Ez az alkalmazás magában foglalja a rendelésgenerátort, amely meghatározott időközönként küldi el a rendeléseket az üzenetsorba, valamint a rendelésfeldolgozót, amely a sorba érkező üzeneteket feldolgozza és a böngészőben megtekinthető visszaigazolásokat képez.

Az alkalmazás létrehozása után megmutatjuk, hogyan lehet integrálni az üzenetküldő rendszer konfigurációját, és igénybe vesszük az AMQ Online-t, hogy inicializáljuk a szükséges erőforrásokat.

Quarkus alkalmazásunk

A Quarkus alkalmazásunk az OpenShift-en fut, és a amqp-quickstartprogram módosított verziója. A kliens rész teljes példáját itt találod: itt.

Rendelésgenerátor

A generátor minden 5 másodpercben monoton módon küldi el a növekvő rendelésazonosítókat az „orders” címre.

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

Rendelésfeldolgozó

A rendelésfeldolgozó még egyszerűbb, csak visszaadja a visszaigazolás azonosítóját a „confirmations” címre.

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // A megerősítés azonosítója a rendelés azonosítójának kétszerese. <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

Megerősítési erőforrások

Megerősítési erőforrás - ez egy HTTP végpont, amely az alkalmazásunk működése során létrehozott megerősítések listázására szolgál.

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

Beállítás

Az AMQ Online-hoz való csatlakozáshoz az alkalmazásunknak néhány konfigurációs adatra van szüksége, nevezetesen: a Quarkus-csatlakozó konfigurációjára, az AMQP végpont adataira és a kliens hitelesítő adataira. Jobb, ha az összes konfigurációs adat egy helyen van, de szándékosan elválasztjuk őket, hogy bemutassuk az alkalmazás Quarkus beállításának lehetséges módjait.

Csatlakozók

A csatlakozó konfigurációját a fordítási időszakban, az alkalmazás properties fájljával lehet megadni:

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

Annak érdekében, hogy ne bonyolítsuk túl a dolgokat, csak az 'orders' címre fogunk üzenetsort használni. A 'confirmations' cím kezelésére pedig a memóriában lévő sorokat fogjuk használni.

AMQP végpont

A fordítási időszakban az AMQP végpont házigazzal és port számmal kapcsolatos információk még ismeretlenek, ezért ezeket be kell illeszteni. A végpontot a configmap-ban lehet megadni, amelyet az AMQ Online hoz létre, ezért ezek meghatározását a környezeti változókon keresztül fogjuk végezni az alkalmazás manifesztjében:

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

Bejelentkezési adatok

A szolgáltatási fiók token használható az alkalmazásunk hitelesítésére az OpenShift-ben. Ehhez először létre kell hozni egy egyedi ConfigSource-t, amely a pod fájlrendszeréből olvassa a hitelesítési tokent:

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

Alkalmazás összeállítása és telepítése

Mivel az alkalmazást végrehajtható fájllá kell fordítani, szükség lesz a GraalVM virtuális gépre. További információkért, hogy miként állíthatja be a környezetet, lásd a megfelelő útmutatót a Quarkus Útmutató.

Ezután a használható utasítások követésével le kell tölteni a forrást, el kell végezni az összeállítást és telepíteni kell az alkalmazásunkat:

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

A parancsok után az alkalmazás telepítve lesz, de nem fog elindulni, amíg nem állítjuk be az AMQ Online szükséges üzenetküldő erőforrásait.

Üzenetküldő rendszer beállítása

Most már be kell állítanunk az üzenetküldő rendszerben azokat az erőforrásokat, amelyekre az alkalmazásunknak szüksége van. Ehhez létre kell hozni: 1) egy címzési teret az üzenetküldő rendszer végpontjának inicializálásához; 2) egy címet az alkalmazásunkban használt címek beállításához; 3) egy üzenetküldő rendszer felhasználót a kliens hitelesítő adatainak megadásához.

Címzési tér

Az AddressSpace objektum az AMQ Online rendszerben csoportja a címeknek, amelyek közösen használják a kapcsolódási végpontokat, valamint a hitelesítési és jogosultsági politikákat. Címzési tér létrehozásakor megadható, hogy a kapcsolódási végpontok hogyan lesznek biztosítva:

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

Cím

A címek a üzenetek küldésére és fogadására használatosak. Minden címnek van típusa, amely meghatározza a szemantikáját, és van egy terve, amely szabályozza a fenntartott erőforrások számát. A címet például így lehet definiálni:

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

Üzenetküldő rendszer felhasználója

Ahhoz, hogy a címekre üzeneteket küldhessenek és fogadhassanak, csak megbízható alkalmazásoknak szabad hozzáférniük, ezért az üzenetküldő rendszerben létre kell hozni egy felhasználót. A klaszteren futó alkalmazások esetében a klienseket az OpenShift szolgáltatásfiókjának hitelesítésével lehet azonosítani. A „serviceaccount” felhasználót például így lehet definiálni:

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

Alkalmazás beállítások engedélyei

Ahhoz, hogy az AMQ Online létrehozhassa a configmap-et, amelyet az AMQP végpont információinak bevitelére használtunk, meg kell határozni egy szerepet és szerepkötést (Role és 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

Hogyan alkalmazzuk a konfigurációkat

Az üzenetküldő rendszer konfigurációja az alábbi módon alkalmazható:

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

Alkalmazás ellenőrzése

Annak érdekében, hogy megbizonyosodjunk arról, hogy az alkalmazás elindult, először ellenőrizzük, hogy a megfelelő címek létrejöttek-e és aktívak-e:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Még nem készen"; sleep 5; done

Ezután ellenőrizzük az alkalmazás útvonalának URL-jét (egyszerűen nyissuk meg ezt a címet a böngészőben):

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

A böngészőben látható, hogy a jegyek időszakonként frissülnek, ahogy az üzeneteket az AMQ Online küldik és fogadják.

Összegzés

Tehát elkészítettük a Quarkus alkalmazást, amely AMQP-t használ az üzenetváltáshoz, beállítottuk ezt az alkalmazást a Red Hat OpenShift platformon, valamint implementáltuk a konfigurációját az AMQ Online konfigurációja alapján. Ezután létrehoztuk azokat a manifesztumokat, amelyek szükségesek az üzenetváltó rendszer inicializálásához a mi alkalmazásunk számára.

Ezzel befejezzük a Quarkus sorozatot, de sok új és érdekes dolog vár ránk, maradjatok velünk!

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster