Ifiranṣẹ abinibi-awọsanma lori pẹpẹ Red Hat OpenShift ni lilo Quarkus ati AMQ Online

Bawo ni gbogbo eniyan! Eyi ni - ifiweranṣẹ ikẹhin wa ninu jara Quarkus! (Ni ọna, wo webinar wa "Eyi ni Quarkus - ilana Java abinibi Kubernetes". A yoo fihan ọ bi o ṣe le bẹrẹ lati ibere tabi gbe awọn solusan ti a ti ṣetan)

Ifiranṣẹ abinibi-awọsanma lori pẹpẹ Red Hat OpenShift ni lilo Quarkus ati AMQ Online

В ti tẹlẹ Ninu ifiweranṣẹ yii, a wo awọn irinṣẹ ti o yẹ ti o le ṣee lo lati ṣe iwọn awọn ilọsiwaju ti o gba bi abajade ti imudara awọn ohun elo Java.

Lati ẹya 0.17.0, quarkus ṣe atilẹyin fun lilo Ilana Queuing Message To ti ni ilọsiwaju (AMQP), eyiti o jẹ boṣewa ṣiṣi fun gbigbe awọn ifiranṣẹ iṣowo laarin awọn ohun elo tabi awọn ajọ.

Red Hat AMQ Online jẹ iṣẹ kan ti a ṣe lori ipilẹ ti iṣẹ akanṣe orisun ṣiṣi EnMasse ati imuse ilana fifiranṣẹ ti o da lori pẹpẹ RedHat Hat OpenShift. Fun alaye diẹ sii lori bi o ṣe n ṣiṣẹ, wo nibi (EN). Loni a yoo fihan ọ bi o ṣe le darapọ AMQ Online ati Quarkus lati kọ eto fifiranṣẹ ti o da lori OpenShift ni lilo awọn imọ-ẹrọ fifiranṣẹ tuntun meji.

O ti ro pe o ti ran AMQ Online sori ẹrọ OpenShift (ti kii ba ṣe bẹ, lẹhinna wo fifi sori guide).

Lati bẹrẹ, a yoo ṣẹda ohun elo Quarkus kan ti yoo jẹ eto sisẹ aṣẹ ti o rọrun nipa lilo fifiranṣẹ ifaseyin. Ohun elo yii yoo pẹlu olupilẹṣẹ aṣẹ ti o fi awọn aṣẹ ranṣẹ si isinyi ifiranṣẹ ni aarin aarin, bakanna bi ero isise aṣẹ ti yoo ṣe ilana awọn ifiranṣẹ lati isinyi ati ṣe agbekalẹ awọn ijẹrisi wiwo ni ẹrọ aṣawakiri.

Ni kete ti a ti ṣẹda ohun elo naa, a yoo fihan ọ bi o ṣe le fi sabe atunto eto fifiranṣẹ sinu ohun elo naa ki o lo AMQ Online lati pese awọn orisun ti a nilo lori eto naa.

Quarkus app

Ohun elo Quarkus wa nṣiṣẹ lori OpenShift ati pe o jẹ ẹya ti a ṣe atunṣe ti eto naa amqp-kicksstart. A pipe apẹẹrẹ ti awọn ose ẹgbẹ le ṣee ri nibi.

Olupilẹṣẹ ibere

Olupilẹṣẹ naa ni ẹyọkan firanṣẹ awọn ID aṣẹ ti ndagba si adirẹsi “awọn aṣẹ” ni gbogbo iṣẹju-aaya 5.

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

Bere fun isise

Olutọju aṣẹ paapaa rọrun, o kan da ID idaniloju pada si adirẹsi “awọn ijẹrisi”.

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

Ìmúdájú Resources

Awọn orisun ìmúdájú jẹ aaye ipari HTTP fun kikojọ awọn ijẹrisi ti ipilẹṣẹ nipasẹ ohun elo wa.

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

Ṣe akanṣe

Lati sopọ si AMQ Online, ohun elo wa yoo nilo data atunto diẹ, eyun: Iṣeto asopọ asopọ Quarkus, alaye ipari AMQP ati awọn ẹri alabara. O jẹ, nitorinaa, dara julọ lati tọju gbogbo data iṣeto ni aaye kan, ṣugbọn a yoo mọọmọ ya wọn lati ṣafihan awọn aṣayan ti o ṣeeṣe fun atunto ohun elo Quarkus.

Awọn asopọ

Iṣeto asopo ni a le pese ni akoko akopọ nipa lilo faili ohun-ini ohun elo kan:

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

Lati jẹ ki awọn nkan rọrun, a yoo lo isinyi ifiranṣẹ nikan fun adirẹsi “awọn aṣẹ”. Ati adirẹsi “awọn ijẹrisi” ninu ohun elo wa yoo lo isinyi ni iranti.

AMQP ipari

Ni akoko akojọpọ, orukọ olupin ati nọmba ibudo fun aaye ipari AMQP jẹ aimọ, nitorinaa wọn gbọdọ jẹ itasi. O le ṣeto aaye ipari ni atunto atunto ti o ṣẹda nipasẹ AMQ Online, nitorinaa a yoo ṣalaye wọn nipasẹ awọn oniyipada ayika ni iṣafihan ohun elo:

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

Awọn iwe eri

Aami akọọlẹ iṣẹ le ṣee lo lati jẹri ohun elo wa si OpenShift. Lati ṣe eyi, o gbọdọ kọkọ ṣẹda aṣa aṣa ConfigSource ti yoo ka ami ìfàṣẹsí lati inu eto faili podu naa:

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

Kọ ati Mu Ohun elo naa ṣiṣẹ

Niwọn igba ti ohun elo naa gbọdọ ṣe akopọ sinu faili ti o le ṣiṣẹ, ẹrọ foju GraalVM kan nilo. Fun awọn alaye lori bi o ṣe le ṣeto agbegbe kan fun eyi, wo awọn ilana ti o baamu ninu Quarkus Itọsọna.

Lẹhinna, ni atẹle awọn itọnisọna ti a fun nibẹ, o nilo lati ṣe igbasilẹ orisun, kọ ati mu ohun elo wa:

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

Lẹhin awọn aṣẹ wọnyi, ohun elo naa yoo gbe lọ, ṣugbọn kii yoo bẹrẹ titi ti a fi tunto awọn orisun fifiranṣẹ ti a nilo ni AMQ Online.

Ṣiṣeto eto fifiranṣẹ

Bayi gbogbo ohun ti o ku ni lati ṣeto awọn orisun ti ohun elo wa nilo ninu eto fifiranṣẹ. Lati ṣe eyi, o nilo lati ṣẹda: 1) aaye adirẹsi kan lati bẹrẹ aaye ipari eto fifiranṣẹ; 2) adirẹsi lati tunto awọn adirẹsi ti a lo ninu awọn ohun elo; 3) Olumulo fifiranṣẹ lati ṣeto awọn iwe-ẹri alabara.

Aaye adirẹsi

Ohun AdirẹsiSpace kan ni AMQ Online jẹ akojọpọ awọn adirẹsi ti o pin awọn aaye ipari asopọ ati ijẹrisi ati awọn ilana aṣẹ. Nigbati o ba ṣẹda aaye adirẹsi, o le pato bi awọn aaye ipari fifiranṣẹ yoo ṣe han:

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

.Еса

Awọn adirẹsi ni a lo lati firanṣẹ ati gba awọn ifiranṣẹ wọle. Adirẹsi kọọkan ni iru kan, eyiti o pinnu awọn atunmọ rẹ, bakanna bi ero kan, eyiti o ṣalaye nọmba awọn orisun lati wa ni ipamọ. Adirẹsi naa le pinnu, fun apẹẹrẹ, bii eyi:

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

Olumulo fifiranṣẹ

Lati rii daju pe awọn ohun elo ti o gbẹkẹle nikan le firanṣẹ ati gba awọn ifiranṣẹ si awọn adirẹsi rẹ, o gbọdọ ṣẹda olumulo kan ninu eto fifiranṣẹ. Fun awọn ohun elo ti n ṣiṣẹ lori iṣupọ kan, awọn alabara le jẹ ijẹrisi nipa lilo akọọlẹ iṣẹ OpenShift kan. Olumulo "account service" le jẹ asọye, fun apẹẹrẹ, bii eyi:

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

Awọn igbanilaaye lati tunto ohun elo naa

Ni ibere fun AMQ Online lati ṣẹda iṣeto atunto ti a lo lati fi sabe alaye ipari AMQP, Ipa ati RoleBinding gbọdọ ṣeto:

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

Bi o ṣe le lo awọn atunto

O le lo iṣeto ni eto fifiranṣẹ bi eleyi:

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

Ohun elo ijerisi

Lati rii daju pe ohun elo naa ti bẹrẹ, ni akọkọ, jẹ ki a ṣayẹwo boya awọn adirẹsi ti o baamu ti ṣẹda ati pe wọn ṣiṣẹ:

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

Lẹhinna jẹ ki a ṣayẹwo URL ipa ọna ohun elo (kan ṣii adirẹsi yii ni ẹrọ aṣawakiri):

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

Ẹrọ aṣawakiri yẹ ki o fihan pe awọn tikẹti ti ni imudojuiwọn lorekore bi awọn ifiranṣẹ ti firanṣẹ ati gba nipasẹ AMQ Online.

Summing soke

Nitorinaa a kowe ohun elo Quarkus kan ti o lo AMQP fun fifiranṣẹ, tunto ohun elo lati ṣiṣẹ lori pẹpẹ Red Hat OpenShift, ati imuse iṣeto ni ti o da lori iṣeto AMQ Online. Lẹhinna a ṣẹda awọn ifihan ti o nilo lati ṣe ipilẹṣẹ eto fifiranṣẹ fun ohun elo wa.

Eleyi pari awọn jara nipa Quarkus, ṣugbọn nibẹ ni a pupo ti titun ati ki o awon ohun niwaju, duro aifwy!

orisun: www.habr.com

Fi ọrọìwòye kun