Felhőalapú üzenetküldés a Red Hat OpenShift platformon Quarkus és AMQ Online használatával

Sziasztok! Itt van - utolsó bejegyzésünk a Quarkus sorozatban! (Egyébként nézze meg webináriumunkat "Ez a Quarkus – Kubernetes natív Java keretrendszer". Megmutatjuk, hogyan kezdje el a nulláról, vagy vigye át kész megoldásokat)

Felhőalapú üzenetküldés a Red Hat OpenShift platformon Quarkus és AMQ Online használatával

В előző Ebben a bejegyzésben áttekintettük azokat a releváns eszközöket, amelyek segítségével számszerűsíthetőek a Java alkalmazások modernizálása eredményeként elért fejlesztések.

A 0.17.0 verzió óta, quarkus támogatja az Advanced Message Queuing Protocol használatát (AMQP), amely egy nyílt szabvány az alkalmazások vagy szervezetek közötti üzleti üzenetek továbbítására.

Red Hat AMQ Online egy nyílt forráskódú projektre épülő szolgáltatás EnMasse és egy platform alapú üzenetküldési mechanizmus megvalósítása Red Hat OpenShift. A működésével kapcsolatos további részletekért lásd itt (EN). Ma megmutatjuk, hogyan kombinálható az AMQ Online és a Quarkus egy modern OpenShift alapú üzenetküldő rendszer felépítéséhez, két új üzenetkezelési technológiával.

Feltételezzük, hogy már telepítette az AMQ Online-t az OpenShift platformon (ha nem, akkor lásd Telepítési útmutató).

Kezdésként létrehozunk egy Quarkus alkalmazást, amely egy egyszerű, reaktív üzenetküldést használó rendelésfeldolgozó rendszer lesz. Ez az alkalmazás tartalmazni fog egy rendelésgenerátort, amely meghatározott időközönként küld rendeléseket egy üzenetsorba, valamint egy rendelésfeldolgozót, amely feldolgozza a sor üzeneteit, és a böngészőben megtekinthető visszaigazolásokat generál.

Miután létrehoztuk az alkalmazást, megmutatjuk, hogyan ágyazhatja be az üzenetküldő rendszer konfigurációját az alkalmazásba, és hogyan használhatja az AMQ Online-t a szükséges erőforrások biztosításához a rendszeren.

Quarkus alkalmazás

Quarkus alkalmazásunk OpenShift-en fut, és a program módosított változata amqp-quickstart. Az ügyféloldal teljes példája megtalálható itt.

Rendelés generátor

A generátor egyszerűen monoton módon 5 másodpercenként küldi a növekvő rendelésazonosítókat a „rendelések” címére.

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

Rendelésfeldolgozó

A rendeléskezelő még egyszerűbb, csak egy visszaigazoló azonosítót ad vissza a „visszaigazolások” címére.

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

Megerősítő források

A megerősítési erőforrás egy HTTP-végpont az alkalmazásunk által generált megerősítések listázásához.

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

beállítás

Az AMQ Online-hoz való csatlakozáshoz alkalmazásunknak szüksége lesz néhány konfigurációs adatra, nevezetesen: Quarkus-csatlakozó-konfigurációra, AMQP-végpont-információkra és ügyfél hitelesítő adataira. Természetesen jobb, ha az összes konfigurációs adatot egy helyen tároljuk, de szándékosan szétválasztjuk őket, hogy megmutassuk a Quarkus alkalmazás beállítási lehetőségeit.

Csatlakozók

A csatlakozási szoftver konfigurációja fordításkor is megadható egy alkalmazástulajdonság-fájl segítségével:

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

Az egyszerűség kedvéért csak üzenetsort fogunk használni a „rendelési” címhez. Az alkalmazásunkban található „megerősítési” cím pedig egy sort fog használni a memóriában.

AMQP végpont

Fordításkor az AMQP-végpont gazdagépneve és portszáma ismeretlen, ezért be kell adni őket. A végpont az AMQ Online által létrehozott konfigurációs térképben állítható be, ezért az alkalmazás jegyzékében lévő környezeti változókon keresztül határozzuk meg őket:

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

Hitelesítő adatok

A szolgáltatásfiók-token felhasználható alkalmazásunk OpenShift hitelesítésére. Ehhez először létre kell hoznia egy egyéni ConfigSource-t, amely beolvassa a hitelesítési tokent a pod fájlrendszeréből:

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

Az alkalmazás felépítése és üzembe helyezése

Mivel az alkalmazást végrehajtható fájlba kell fordítani, GraalVM virtuális gépre van szükség. Az ehhez szükséges környezet beállításának részleteiért tekintse meg a megfelelő utasításokat Quarkus Guide.

Ezután az ott megadott utasításokat követve le kell töltenie a forrást, össze kell építenie és telepítenie 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

E parancsok után az alkalmazás telepítésre kerül, de addig nem indul el, amíg be nem állítjuk a szükséges üzenetkezelési erőforrásokat az AMQ Online-ban.

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

Most már csak be kell állítani azokat az erőforrásokat, amelyekre alkalmazásunknak szüksége van az üzenetküldő rendszerben. Ehhez létre kell hoznia: 1) egy címteret az üzenetküldő rendszer végpontjának inicializálásához; 2) cím az alkalmazásban használt címek konfigurálásához; 3) Üzenetküldő felhasználó az ügyfél hitelesítő adatainak beállításához.

Címterület

Az AMQ Online AddressSpace objektuma olyan címcsoport, amely megosztja a kapcsolati végpontokat, valamint a hitelesítési és engedélyezési házirendeket. Amikor létrehoz egy címteret, megadhatja, hogyan jelenjenek meg az üzenetküldési végpontok:

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 üzenetek küldésére és fogadására szolgálnak. Minden címnek van egy típusa, amely meghatározza a szemantikáját, valamint egy terv, amely meghatározza a lefoglalandó erőforrások számát. A címet például így lehet meghatározni:

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

Üzenetküldő felhasználó

Annak biztosítása érdekében, hogy csak megbízható alkalmazások küldhessenek és fogadhassanak üzeneteket az Ön címére, létre kell hoznia egy felhasználót az üzenetküldő rendszerben. Fürtön futó alkalmazások esetén az ügyfelek OpenShift szolgáltatásfiókkal hitelesíthetők. A "serviceaccount" felhasználó például a következőképpen határozható meg:

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

Engedélyek az alkalmazás konfigurálásához

Ahhoz, hogy az AMQ Online létrehozza azt a konfigurációs térképet, amelyet az AMQP végpont információinak beágyazásához használtunk, be kell állítani a Role és RoleBinding paramétereket:

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

A konfigurációk alkalmazása

Az üzenetküldő rendszer konfigurációját a következőképpen alkalmazhatja:

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őrizze, 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 "Not yet ready"; sleep 5; done

Ezután nézzük meg az alkalmazás útvonalának URL-jét (csak nyissa 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őnek azt kell mutatnia, hogy a jegyek rendszeresen frissülnek, ahogy az AMQ Online üzeneteket küld és fogad.

Összefoglalva

Így írtunk egy Quarkus alkalmazást, amely AMQP-t használ az üzenetküldéshez, beállítottuk az alkalmazást, hogy a Red Hat OpenShift platformon fusson, és a konfigurációját az AMQ Online konfigurációja alapján implementáltuk. Ezután létrehoztuk az alkalmazásunk üzenetküldő rendszerének inicializálásához szükséges jegyzékeket.

Ezzel véget is ért a Quarkusról szóló sorozat, de sok új és érdekes dolog áll előttünk, maradj velünk!

Forrás: will.com

Hozzászólás