Karere-a-kapua i runga i te papaaho OpenShift Whero ma te whakamahi i te Quarkus me te AMQ Online

Kia ora katoa! Anei - ko ta matou panui whakamutunga i te raupapa Quarkus! (Na te ara, tirohia to maatau paetukutuku "Ko Quarkus tenei - anga Java taketake Kubernetes". Ma matou e whakaatu ki a koe me pehea te tiimata mai i te wahanga ka whakawhiti ranei i nga otinga kua oti te hanga)

Karere-a-kapua i runga i te papaaho OpenShift Whero ma te whakamahi i te Quarkus me te AMQ Online

В mua I roto i tenei pou, i titiro matou ki nga taputapu e tika ana ka taea te whakamahi ki te tatau i nga whakapainga kua puta mai i te whakahou i nga tono Java.

Mai i te putanga 0.17.0, quarkus e tautoko ana i te whakamahi i te Kawa Tutira Karere Arā Atu Anō (AMQP), he paerewa tuwhera mo te whakawhiti i nga karere pakihi i waenga i nga tono me nga whakahaere.

Red Hat AMQ Online he ratonga i hangaia i runga i te kaupapa tuwhera puna EnMasse me te whakatinana i tetahi tikanga tuku korero i runga i te turanga Potae Whero OpenShift. Mo etahi atu korero mo te mahi, tirohia konei (EN). I tenei ra ka whakaatu matou ki a koe me pehea te whakakotahi i te AMQ Online me te Quarkus ki te hanga i tetahi punaha karere a OpenShift hou ma te whakamahi i nga hangarau karere hou e rua.

E kiia ana kua tukuna kee e koe te AMQ Online i runga i te papaaho OpenShift (ki te kore, katahi ka kite aratohu tāutanga).

Hei timata, ka hangahia e matou he tono Quarkus he punaha tukatuka ota ngawari ma te whakamahi i nga karere urupare. Kei roto i tenei tono he kaiwhakaputa ota ka tuku ota ki tetahi rarangi karere i te waa kua whakaritea, me te tukatuka ota ka tukatuka i nga karere mai i te rarangi me te whakaputa i nga whakapumautanga ka kitea i roto i te tirotiro.

Ina oti te hanga i te tono, ka whakaatu matou ki a koe me pehea te whakauru i te whirihoranga punaha korero ki roto i te tono me te whakamahi i te AMQ Online hei whakarato i nga rauemi e hiahiatia ana e matou ki te punaha.

Taupānga Quarkus

Ko ta maatau tono Quarkus e rere ana i runga i OpenShift, he putanga whakarereke o te kaupapa amqp-tere tere. Ka kitea he tauira katoa o te taha kiritaki konei.

Ota kaihanga

Ka tukuna noa e te kaihanga nga ID ota e tipu haere ana ki nga wahitau "ota" ia 5 hēkona.

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

Tukatuka Tono

He maamaa ake te kaikawe ota, ka whakahokia mai he ID whakau ki te wahitau "whakapumautanga".

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

Rauemi Whakapumau

Ko te rauemi whakapumau he pito mutunga HTTP mo te whakaraarangi i nga whakapumautanga i hangaia e to maatau tono.

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

whakatikatikanga

Hei hono atu ki te AMQ Online, ka hiahiatia e taatau tono etahi raraunga whirihoranga, ara: whirihoranga honohono Quarkus, nga korero mutunga AMQP me nga tohu a te kiritaki. Ko te tikanga, he pai ake te pupuri i nga raraunga whirihoranga katoa ki te waahi kotahi, engari ka ata wehea e matou hei whakaatu i nga whiringa ka taea mo te whirihora i te tono Quarkus.

Kaihono

Ka taea te tuku whirihoranga tūhono i te wā whakahiato mā te whakamahi i tētahi kōnae āhuatanga tono:

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

Kia ngawari noa nga mea, ka whakamahi noa matou i te rarangi karere mo te wahitau "ota". A ko nga wahitau "whakapumautanga" i roto i ta maatau tono ka whakamahi i te rarangi mahara.

AMQP mutunga

I te wa whakahiato, kaore i te mohiotia te ingoa kaihautu me te tau tauranga mo te waahi mutunga AMQP, no reira me werohia. Ka taea te tautuhi i te pito mutunga ki te mapi whirihora i hangaia e AMQ Online, no reira ka tautuhia e matou ma nga taurangi taiao i roto i te whakaaturanga tono:

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

Taipitopito

Ka taea te whakamahi i te tohu kaute ratonga hei whakamotuhēhē i tā mātou tono ki OpenShift. Hei mahi i tenei, me hanga e koe he ConfigSource ritenga ka panui i te tohu motuhēhēnga mai i te punaha konae o te pod:

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

Hanga me te Hoatu i te Taupānga

I te mea me whakahiato te tono ki tetahi konae ka taea te whakahaere, ka hiahiatia he miihini mariko GraalVM. Mo nga taipitopito mo te whakarite i tetahi taiao mo tenei, tirohia nga tohutohu e pa ana ki roto Aratohu Quarkus.

Na, ka whai i nga tohutohu kua hoatu ki reira, me tango e koe te puna, hanga me te tuku i ta maatau tono:

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

Whai muri i enei whakahau, ka tukuna te tono, engari karekau e timata kia whirihora ra ano matou i nga rauemi karere e hiahiatia ana i roto i te AMQ Online.

Te whakarite i te punaha korero

Inaianei ko nga mea e toe ana ko te whakatakoto i nga rauemi e hiahiatia ana e ta maatau tono i roto i te punaha korero. Hei mahi i tenei, me hanga e koe: 1) he mokowā wāhitau hei arawhiti i te pito mutunga o te punaha karere; 2) wāhitau ki te whirihora i nga wahitau e whakamahia ana e matou i roto i te tono; 3) Kaiwhakamahi Karere ki te tautuhi i nga tohu a te kiritaki.

Wāhitau wāhitau

Ko tetahi ahanoa AddressSpace i AMQ Online he roopu o nga wahitau e tiri ana i nga hononga mutunga me nga kaupapa here motuhēhē me te whakamana. Ina waihangahia he mokowā wāhitau, ka taea e koe te whakapūtā me pēhea te whakaatu i ngā pito mutunga karere:

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

Ngā Wāhitau

Ka whakamahia nga wahitau hei tuku me te whiwhi karere. Kei ia wahitau he momo, e whakatau ana i ona kupu, me tetahi mahere, e tohu ana i te maha o nga rauemi ka rahuitia. Ka taea te whakatau i te waahi noho, hei tauira, penei:

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

Kaiwhakamahi Karere

Hei whakarite ka taea e nga tono whakawhirinaki anake te tuku me te whiwhi karere ki o wahitau, me hanga e koe he kaiwhakamahi ki te punaha karere. Mo nga tono e rere ana i runga i te tautau, ka taea te whakamotuhēhēnga o ngā kiritaki mā te whakamahi i tētahi pūkete ratonga OpenShift. Ka taea te tautuhi i te "kaute ratonga" kaiwhakamahi, hei tauira, penei:

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

Whakaaetanga ki te whirihora i te tono

Kia taea e te AMQ Online te hanga i te mapi whirihora i whakamahia e matou ki te whakauru i nga korero tohu mutunga AMQP, me whakarite te Role and 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

Me pehea te tono whirihoranga

Ka taea e koe te whakamahi i te whirihoranga punaha korero penei:

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

Manatoko tono

Kia mohio kua timata te tono, tuatahi, me tirotiro mena kua hangaia nga wahitau e rite ana, kua kaha:

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

Na ka tirohia te URL ara tono (tuwhera noa tenei wahitau i roto i te tirotiro):

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

Me whakaatu te kaitirotiro kei te whakahouhia nga tikiti i ia wa i te mea ka tukuna nga karere ka riro mai i te AMQ Online.

Kohia ana

Na ka tuhia e matou he tono Quarkus e whakamahi ana i te AMQP mo te karere, i whirihorahia te tono kia rere i runga i te papanga Red Hat OpenShift, me te whakatinana i tana whirihoranga i runga i te whirihoranga AMQ Online. Na ka hangaia e matou nga whakaaturanga e hiahiatia ana hei arawhiti i te punaha korero mo ta maatau tono.

Ka mutu tenei te raupapa mo Quarkus, engari he maha nga mea hou me nga mea whakamere kei mua i a koe, noho mai!

Source: will.com

Tāpiri i te kōrero