Molnbaserad meddelandehantering pÄ Red Hat OpenShift-plattformen med hjÀlp av Quarkus och AMQ Online

Hej alla! HĂ€r Ă€r det – vĂ„rt sista inlĂ€gg i serien om Quarkus! (Förresten, kolla in vĂ„rt webbinarie «Detta Ă€r Quarkus – en Kubernetes-nativ Java-ramverk». Vi visar hur man börjar «frĂ„n grunden» eller flyttar befintliga lösningar)

Molnbaserad meddelandehantering pÄ Red Hat OpenShift-plattformen med hjÀlp av Quarkus och AMQ Online

I föregÄende i detta inlÀgg kommer vi att titta pÄ relevanta verktyg som kan anvÀndas för att kvantitativt utvÀrdera förbÀttringar som gjorts genom modernisering av Java-applikationer.

FrÄn och med version 0.17.0, Quarkus stöder anvÀndningen av Advanced Message Queuing Protocol (AMQP), vilket Àr en öppen standard för överföring av affÀrsmeddelanden mellan applikationer eller organisationer.

Red Hat AMQ Online Àr en tjÀnst byggd pÄ den öppna projektet EnMasse och implementerar en meddelandeutbytesmekanism baserad pÄ plattformen Red Hat OpenShift. För mer information om hur den Àr uppbyggd, se. hÀr (EN). Idag visar vi hur man kombinerar AMQ Online och Quarkus för att bygga ett modernt meddelandeutbyten-system pÄ OpenShift med hjÀlp av tvÄ nya teknologier relaterade till meddelandehantering.

Det förutsÀtts att du redan har implementerat AMQ Online pÄ OpenShift-plattformen (om inte, se. installationsguiden).

Först kommer vi att skapa en Quarkus-applikation som kommer att vara ett enkelt system för orderhantering med reaktiv meddelandeutbyte. Denna applikation kommer att inkludera en ordergenerator som skickar bestÀllningar till meddelandekön med fast intervall, samt en orderhanterare som kommer att behandla meddelanden frÄn kön och skapa bekrÀftelser som Àr tillgÀngliga för visning i webblÀsaren.

Efter att applikationen har skapats kommer vi att visa hur man implementerar meddelandeutbyteskonfigurationen och anvÀnder AMQ Online för att initiera de resurser vi behöver pÄ detta system.

Quarkus-applikationen

VÄr Quarkus-applikation körs pÄ OpenShift och Àr en modifierad version av programmet amqp-quickstart. Ett komplett exempel pÄ klientsidan kan hittas hÀr.

Ordergeneratorn

Generatorn skickar varor med vÀxande order-ID var femte sekund till adressen 'orders'.

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

Orderhanteraren

Orderhanteraren Àr Ànnu enklare; den returnerar bara bekrÀftelse-ID:t till adressen 'confirmations'.

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Bekräftelse-ID är dubbelt så stort som order-ID <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

BekrÀftelseresurser

BekrÀftelsepunkten Àr en HTTP-slutpunkt för att lista de bekrÀftelser som genereras av vÄr applikation.

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

InstÀllning

För att ansluta till AMQ Online behöver vÄr applikation viss konfigurationsdata, nÀmligen: konfiguration av Quarkus-anslutning, information om AMQP-slutpunkten och klientcredentialer. Det Àr bÀst att hÄlla all konfigurationsdata pÄ ett stÀlle, men vi kommer avsiktligt att dela upp dem för att visa möjliga alternativ för att konfigurera Quarkus-applikationen.

Anslutningar

Konfigurationen av anslutningen kan ges vid kompileringstiden med hjÀlp av en applikationsegenskaper fil:

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

För att underlÀtta kommer vi att anvÀnda en meddelandekö endast för adressen "orders". Adressen "confirmations" i vÄr applikation kommer att anvÀnda en minneskö.

AMQP Slutpunkt

Vid kompilering Àr vÀrdnamnet och portnumret för AMQP-slutpunkten okÀnda, sÄ de mÄste injiceras. Slutpunkten kan definieras i en configmap som skapas av AMQ Online, sÄ vi kommer att definiera dem genom miljövariabler i applikationens manifest:

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

Credentialer

En tjÀnstkonto-token kan anvÀndas för att autentisera vÄr applikation i OpenShift. För detta mÄste vi först skapa en anpassad ConfigSource som lÀser autentiseringstoken frÄn podden filsystem:

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

Byggande och distribution av applikationen

Eftersom applikationen mÄste kompileras till en körbar fil, behövs en virtuell maskin av GraalVM. För mer information om hur du konfigurerar miljön för detta, se relevanta instruktioner i Quarkus Guide.

Följ sedan instruktionerna dÀr för att ladda ner kÀllkoden, bygga och distribuera vÄr applikation:

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

Efter dessa kommandon kommer applikationen att vara distribuerad, men den kommer inte att starta förrÀn vi har konfigurerat de nödvÀndiga resurserna för meddelandehantering i AMQ Online.

Konfiguration av meddelandesystem

Nu ÄterstÄr det att specificera de resurser som vÄrt applikation behöver i meddelandesystemet. För detta mÄste du skapa: 1) ett adressutrymme för att initiera en slutpunkt för meddelandesystemet; 2) en adress för att konfigurera adresserna vi anvÀnder i applikationen; 3) en anvÀndare för meddelandesystemet för att ange klientens autentiseringsuppgifter.

Adressutrymme

Objektet AddressSpace i AMQ Online Àr en grupp adresser som gemensamt anvÀnder slutpunkterna för anslutning samt autentiserings- och auktoriseringspolicyer. NÀr du skapar ett adressutrymme kan du specificera hur slutpunkterna för meddelandesystemet kommer att tillhandahÄllas:

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

Adresser

Adresser anvÀnds för att skicka och ta emot meddelanden. Varje adress har en typ som definierar dess betydelse samt en plan som anger mÀngden reserverade resurser. En adress kan definieras sÄ hÀr:

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

AnvÀndare i meddelandesystemet

För att endast betrodda applikationer ska kunna skicka och ta emot meddelanden pÄ dina adresser, mÄste en anvÀndare skapas i meddelandesystemet. För applikationer som körs pÄ klustret kan kunder autentiseras med hjÀlp av ett OpenShift-tjÀnstekonto. AnvÀndaren "serviceaccount" kan definieras sÄ hÀr:

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

Behörigheter för att konfigurera applikationen

För att AMQ Online ska kunna skapa en configmap, som vi anvÀnde för att införa uppgifter om AMQP-endpunkten, mÄste en roll och en rollbindning (Role och RoleBinding) definieras:

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

Hur man tillÀmpar konfigurationer

Konfigurationen av meddelandesystemet kan tillÀmpas sÄ hÀr:

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

Verifiering av applikationen

För att sÀkerstÀlla att applikationen har startat, lÄt oss först kontrollera om respektive adresser har skapats och Àr aktiva:

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

DÀrefter kontrollerar vi URL:en för applikationens rutt (vi öppnar helt enkelt denna adress i webblÀsaren):

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

I webblÀsaren ska man kunna se att biljetterna uppdateras regelbundet i takt med att meddelanden skickas och tas emot av AMQ Online.

Sammanfattning

SÄ, vi har skrivit en Quarkus-applikation som anvÀnder AMQP för meddelandeutbyte, stÀllt in denna applikation för att fungera pÄ Red Hat OpenShift-plattformen, samt implementerat dess konfiguration baserat pÄ AMQ Online-konfigurationen. Vi har sedan skapat de manifest som behövs för att initiera meddelandesystemet för vÄr applikation.

Med detta avslutar vi serien om Quarkus, men det ligger mycket nytt och intressant framför oss, stanna kvar med oss!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster