Skýjaskilaboð á Red Hat OpenShift pallinum með Quarkus og AMQ Online

Hæ allir! Hér er hún - lokafærslan okkar í Quarkus seríunni! (Við the vegur, horfðu á vefnámskeiðið okkar „Þetta er Quarkus – innfæddur Java rammi frá Kubernetes“. Við sýnum þér hvernig á að byrja frá grunni eða flytja tilbúnar lausnir)

Skýjaskilaboð á Red Hat OpenShift pallinum með Quarkus og AMQ Online

В fyrri Í þessari færslu skoðuðum við viðeigandi verkfæri sem hægt er að nota til að mæla umbætur sem fengnar eru vegna nútímavæðingar Java forrita.

Frá útgáfu 0.17.0, Kvarkus styður notkun Advanced Message Queuing Protocol (AMQP), sem er opinn staðall til að flytja viðskiptaskilaboð á milli forrita eða stofnana.

Red Hat AMQ á netinu er þjónusta byggð á grunni opins hugbúnaðarverkefnis EnMasse og innleiða kerfisbundið skilaboðakerfi RedHat OpenShift. Fyrir frekari upplýsingar um hvernig það virkar, sjá hér (EN). Í dag munum við sýna þér hvernig á að sameina AMQ Online og Quarkus til að byggja upp nútímalegt OpenShift-undirstaða skilaboðakerfi með tveimur nýjum skilaboðatækni.

Gert er ráð fyrir að þú hafir þegar sett AMQ Online á OpenShift pallinum (ef ekki, þá sjáðu uppsetningarleiðbeiningar).

Til að byrja, munum við búa til Quarkus forrit sem verður einfalt pöntunarvinnslukerfi sem notar viðbragðsskilaboð. Þetta forrit mun innihalda pöntunargenerator sem sendir pantanir í skilaboðaröð með föstu millibili, auk pöntunarvinnsluaðila sem mun vinna úr skilaboðum úr biðröðinni og búa til staðfestingar sem hægt er að skoða í vafranum.

Þegar við höfum búið til forritið munum við sýna þér hvernig á að fella stillingar skilaboðakerfisins inn í forritið og nota AMQ Online til að útvega þau úrræði sem við þurfum á kerfinu.

Quarkus app

Quarkus forritið okkar keyrir á OpenShift og er breytt útgáfa af forritinu amqp-fljót byrjun. Fullkomið dæmi um hlið viðskiptavinarins má finna hér.

Panta rafall

Rafallinn sendir einfaldlega eintóna auðkenni vaxandi pöntunar á „pantana“ heimilisfangið á 5 sekúndna fresti.

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

Panta örgjörvi

Pöntunarstýringin er enn einfaldari, hún skilar bara staðfestingarauðkenni á „staðfestingar“ heimilisfangið.

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

Staðfestingarauðlindir

Staðfestingarforritið er HTTP endapunktur til að skrá staðfestingar sem myndast af forritinu okkar.

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

aðlögun

Til að tengjast AMQ Online mun forritið okkar þurfa nokkur stillingargögn, þ.e.: Quarkus tengistillingar, AMQP endapunktaupplýsingar og skilríki viðskiptavinar. Það er auðvitað betra að hafa öll stillingargögnin á einum stað, en við munum vísvitandi aðskilja þau til að sýna mögulega valkosti til að stilla Quarkus forritið.

Tengi

Hægt er að útvega tengistillingu á samsetningartíma með því að nota eiginleikaskrá forritsins:

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

Til að hafa hlutina einfalda, munum við aðeins nota skilaboðaröð fyrir „pantana“ heimilisfangið. Og „staðfestingar“ heimilisfangið í umsókn okkar mun nota biðröð í minni.

AMQP endapunktur

Við samantektartíma eru hýsingarheiti og gáttarnúmer fyrir AMQP endapunkt óþekkt, þannig að þeim verður að sprauta. Hægt er að stilla endapunktinn í stillingarkortinu sem er búið til af AMQ Online, þannig að við munum skilgreina þá í gegnum umhverfisbreytur í upplýsingaskrá forritsins:

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

Skilríki

Hægt er að nota þjónustureikningslykilinn til að auðkenna forritið okkar fyrir OpenShift. Til að gera þetta verður þú fyrst að búa til sérsniðna ConfigSource sem mun lesa auðkenningartáknið úr skráarkerfi podsins:

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

Byggja og dreifa forritinu

Þar sem forritið verður að safna saman í keyrsluskrá er GraalVM sýndarvél nauðsynleg. Fyrir upplýsingar um hvernig á að setja upp umhverfi fyrir þetta, sjá samsvarandi leiðbeiningar í Quarkus leiðarvísir.

Síðan, eftir leiðbeiningunum sem gefnar eru þar, þarftu að hlaða niður upprunanum, smíða og dreifa forritinu okkar:

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

Eftir þessar skipanir verður forritið sett í notkun en það byrjar ekki fyrr en við stillum skilaboðaauðlindir sem við þurfum í AMQ Online.

Uppsetning á skilaboðakerfinu

Nú er allt sem er eftir að stilla tilföngin sem forritið okkar þarfnast í skilaboðakerfinu. Til að gera þetta þarftu að búa til: 1) heimilisfangsrými til að frumstilla endapunkt skilaboðakerfisins; 2) heimilisfang til að stilla heimilisföngin sem við notum í forritinu; 3) Skilaboð notandi til að stilla persónuskilríki viðskiptavinar.

Heimilisfangsrými

AddressSpace hlutur í AMQ Online er hópur vistfönga sem deila tengingarendapunktum og auðkenningar- og heimildarstefnu. Þegar þú býrð til heimilisfangsrými geturðu tilgreint hvernig endapunktar skilaboða verða afhjúpaðir:

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

Heimilisfang

Heimilisföng eru notuð til að senda og taka á móti skilaboðum. Hvert heimilisfang hefur tegund, sem ákvarðar merkingarfræði þess, sem og áætlun, sem tilgreinir fjölda auðlinda sem á að taka frá. Heimilisfangið er til dæmis hægt að ákvarða á þennan hátt:

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

Skilaboðanotandi

Til að tryggja að aðeins traust forrit geti sent og tekið á móti skilaboðum á netföngin þín verður þú að búa til notanda í skilaboðakerfinu. Fyrir forrit sem keyra á klasa er hægt að auðkenna viðskiptavini með OpenShift þjónustureikningi. Hægt er að skilgreina notandann „þjónustureikning“, til dæmis, svona:

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

Heimildir til að stilla forritið

Til þess að AMQ Online geti búið til stillingarkortið sem við notuðum til að fella inn AMQP endapunktsupplýsingarnar, verður að stilla hlutverk og hlutverkabindingu:

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

Hvernig á að beita stillingum

Þú getur notað stillingar skilaboðakerfisins á þessa leið:

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

Staðfesting umsóknar

Til að ganga úr skugga um að forritið hafi byrjað, skulum við fyrst og fremst athuga hvort samsvarandi heimilisföng hafi verið búin til og eru virk:

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

Þá skulum við athuga vefslóð forritsleiðar (bara opnaðu þetta heimilisfang í vafranum):

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

Vafrinn ætti að sýna að miðar eru uppfærðir reglulega þegar skilaboð eru send og móttekin af AMQ Online.

Toppur upp

Þannig að við skrifuðum Quarkus forrit sem notar AMQP til að senda skilaboð, stilltum forritið til að keyra á Red Hat OpenShift pallinum og útfærðum uppsetningu þess byggt á AMQ Online stillingunni. Við bjuggum síðan til upplýsingarnar sem þarf til að frumstilla skilaboðakerfið fyrir forritið okkar.

Þar með lýkur þáttaröðinni um Quarkus, en það er margt nýtt og áhugavert framundan, fylgist með!

Heimild: www.habr.com

Bæta við athugasemd