Cloudové správy na platforme Red Hat OpenShift pomocou Quarkus a AMQ Online

Ahojte všetci! Tu je - náš posledný príspevok v sérii Quarkus! (Mimochodom, sledujte náš webinár „Toto je Quarkus – natívny Java framework Kubernetes“. Ukážeme vám, ako začať od začiatku alebo preniesť hotové riešenia)

Cloudové správy na platforme Red Hat OpenShift pomocou Quarkus a AMQ Online

В predchádzajúce V tomto príspevku sme sa pozreli na príslušné nástroje, ktoré možno použiť na kvantifikáciu zlepšení získaných v dôsledku modernizácie aplikácií Java.

Od verzie 0.17.0, kvarkus podporuje používanie protokolu Advanced Message Queuing Protocol (AMQP), čo je otvorený štandard na prenos obchodných správ medzi aplikáciami alebo organizáciami.

Red Hat AMQ online je služba postavená na báze open source projektu EnMasse a implementácia mechanizmu zasielania správ na báze platformy Red Hat OpenShift. Ďalšie podrobnosti o tom, ako to funguje, nájdete v časti tu (EN). Dnes vám ukážeme, ako skombinovať AMQ Online a Quarkus, aby ste vytvorili moderný systém správ založený na OpenShift pomocou dvoch nových technológií na odosielanie správ.

Predpokladá sa, že ste už AMQ Online nasadili na platformu OpenShift (ak nie, pozri návod na inštaláciu).

Na začiatok vytvoríme aplikáciu Quarkus, ktorá bude jednoduchým systémom spracovania objednávok pomocou reaktívnych správ. Táto aplikácia bude obsahovať generátor objednávok, ktorý odosiela objednávky do frontu správ v pevnom intervale, ako aj procesor objednávok, ktorý bude spracovávať správy z frontu a generovať potvrdenia viditeľné v prehliadači.

Po vytvorení aplikácie vám ukážeme, ako vložiť konfiguráciu systému zasielania správ do aplikácie a použiť AMQ Online na poskytovanie zdrojov, ktoré potrebujeme v systéme.

Aplikácia Quarkus

Naša aplikácia Quarkus beží na OpenShift a je upravenou verziou programu amqp-rýchly štart. Kompletný príklad klientskej strany nájdete tu.

Generátor objednávok

Generátor jednoducho monotónne posiela narastajúce ID objednávok na adresu „objednávky“ každých 5 sekúnd.

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

Spracovateľ objednávok

Spracovateľ objednávky je ešte jednoduchší, len vráti potvrdzovacie ID na adresu „potvrdenia“.

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

Zdroje potvrdenia

Zdroj potvrdenia je koncový bod HTTP na zoznam potvrdení generovaných našou aplikáciou.

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

nastavenie

Na pripojenie k AMQ Online bude naša aplikácia potrebovať niektoré konfiguračné údaje, konkrétne: konfiguráciu konektora Quarkus, informácie o koncovom bode AMQP a prihlasovacie údaje klienta. Všetky konfiguračné údaje je samozrejme lepšie uchovávať na jednom mieste, no zámerne ich oddelíme, aby sme ukázali možné možnosti konfigurácie aplikácie Quarkus.

Konektory

Konfigurácia konektora môže byť poskytnutá v čase kompilácie pomocou súboru vlastností aplikácie:

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

Aby sme to zjednodušili, pre adresu „objednávky“ použijeme iba front správ. A adresa „potvrdenia“ v našej aplikácii bude používať front v pamäti.

Koncový bod AMQP

V čase kompilácie sú názov hostiteľa a číslo portu pre koncový bod AMQP neznáme, takže musia byť vložené. Koncový bod je možné nastaviť v konfiguračnej mape, ktorá je vytvorená AMQ Online, takže ich zadefinujeme prostredníctvom premenných 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

poverenia

Token účtu služby možno použiť na overenie našej aplikácie v OpenShift. Ak to chcete urobiť, musíte najprv vytvoriť vlastný zdroj ConfigSource, ktorý načíta autentifikačný token zo systému súborov modulu:

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

Zostavte a nasaďte aplikáciu

Keďže aplikácia musí byť skompilovaná do spustiteľného súboru, je potrebný virtuálny stroj GraalVM. Podrobnosti o tom, ako na to nastaviť prostredie, nájdete v príslušných pokynoch v Sprievodca kvarkusom.

Potom si podľa uvedených pokynov musíte stiahnuť zdroj, zostaviť 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 nenakonfigurujeme zdroje správ, ktoré potrebujeme v AMQ Online.

Nastavenie systému správ

Teraz už zostáva len nastaviť zdroje, ktoré naša aplikácia potrebuje v systéme správ. Aby ste to dosiahli, musíte vytvoriť: 1) adresný priestor na inicializáciu koncového bodu systému zasielania správ; 2) adresa na konfiguráciu adries, ktoré používame v aplikácii; 3) Používateľovi odosielania správ na nastavenie prihlasovacích údajov klienta.

Adresný priestor

Objekt AddressSpace v AMQ Online je skupina adries, ktoré zdieľajú koncové body pripojenia a politiky autentifikácie a autorizácie. Keď vytvoríte priestor adries, môžete určiť, ako budú vystavené koncové body správ:

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

adresa

Adresy sa používajú na odosielanie a prijímanie správ. Každá adresa má svoj typ, ktorý určuje jej sémantiku, ako aj plán, ktorý určuje počet zdrojov, ktoré sa majú rezervovať. Adresu je možné určiť napríklad takto:

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

Používateľ správ

Ak chcete zabezpečiť, aby správy na vaše adresy mohli odosielať a prijímať iba dôveryhodné aplikácie, musíte v systéme správ vytvoriť používateľa. Pre aplikácie bežiace na klastri je možné klientov autentifikovať pomocou konta služby OpenShift. Užívateľský "serviceaccount" môže byť definovaný 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"]

Povolenia pre nastavenia aplikácie

Aby AMQ Online vytvoril konfiguračnú mapu, ktorú sme použili na vloženie informácií o koncovom bode AMQP, musia byť nastavené 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 správ môžete použiť 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 ste sa uistili, že sa aplikácia spustila, najskôr skontrolujte, či boli vytvorené a aktívne zodpovedajúce adresy:

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

Potom skontrolujeme adresu URL trasy aplikácie (stačí otvoriť túto adresu v prehliadači):

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

Prehliadač by mal ukazovať, že lístky sa pravidelne aktualizujú pri odosielaní a prijímaní správ službou AMQ Online.

Sčítanie

Napísali sme teda aplikáciu Quarkus, ktorá používa AMQP na odosielanie správ, nakonfigurovali sme aplikáciu na spustenie na platforme Red Hat OpenShift a implementovali jej konfiguráciu založenú na konfigurácii AMQ Online. Potom sme vytvorili manifesty potrebné na inicializáciu systému správ pre našu aplikáciu.

Týmto sa séria o Quarkusovi uzatvára, no čaká nás ešte veľa nových a zaujímavých vecí, zostaňte naladení!

Zdroj: hab.com

Pridať komentár