Pesen asli awan ing platform Red Hat OpenShift nggunakake Quarkus lan AMQ Online

Halo kabeh! Punika - kiriman pungkasan kita ing seri Quarkus! (Oalah, nonton webinar kita "Iki Quarkus - kerangka kerja Jawa asli Kubernetes". Kita bakal nuduhake sampeyan carane miwiti saka ngeruk utawa nransfer solusi sing wis siap)

Pesen asli awan ing platform Red Hat OpenShift nggunakake Quarkus lan AMQ Online

Π’ sadurunge Ing kirim iki, kita ndeleng alat sing cocog sing bisa digunakake kanggo ngitung dandan sing dipikolehi minangka asil modernisasi aplikasi Java.

Wiwit versi 0.17.0, quarkus ndhukung panggunaan Advanced Message Queuing Protocol (AMQP), yaiku standar mbukak kanggo nransfer pesen bisnis antarane aplikasi utawa organisasi.

Red Hat AMQ Online minangka layanan sing dibangun kanthi basis proyek open source EnMasse lan ngleksanakake mekanisme olahpesen adhedhasar platform Red Hat OpenShift. Kanggo rincian liyane babagan cara kerjane, waca kene (EN). Dina iki kita bakal nuduhake sampeyan carane nggabungake AMQ Online lan Quarkus kanggo mbangun sistem olahpesen berbasis OpenShift modern nggunakake rong teknologi olahpesen anyar.

Dianggep sampeyan wis masang AMQ Online ing platform OpenShift (yen ora, banjur deleng pandhuan instalasi).

Kanggo miwiti, kita bakal nggawe aplikasi Quarkus sing bakal dadi sistem pangolahan pesenan sing gampang nggunakake olahpesen reaktif. Aplikasi iki bakal kalebu generator pesenan sing ngirim pesenan menyang antrian pesen kanthi interval tetep, uga prosesor pesenan sing bakal ngolah pesen saka antrian lan ngasilake konfirmasi sing bisa dideleng ing browser.

Sawise nggawe aplikasi kasebut, kita bakal nuduhake sampeyan carane masang konfigurasi sistem olahpesen menyang aplikasi lan nggunakake AMQ Online kanggo nyedhiyakake sumber daya sing dibutuhake ing sistem kasebut.

Aplikasi Quarkus

Aplikasi Quarkus kita mlaku ing OpenShift lan minangka versi modifikasi saka program kasebut amqp-wiwitan. Conto lengkap saka sisih klien bisa ditemokake kene.

Pesen generator

Generator mung kanthi monoton ngirim ID pesenan sing akeh menyang alamat "pesenan" saben 5 detik.

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

Prosesor pesenan

Handler pesenan malah luwih prasaja, mung ngasilake ID konfirmasi menyang alamat "konfirmasi".

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

Sumber Konfirmasi

Sumber konfirmasi minangka titik pungkasan HTTP kanggo nyathet konfirmasi sing digawe dening aplikasi kita.

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

imbuhan

Kanggo nyambung menyang AMQ Online, aplikasi kita mbutuhake sawetara data konfigurasi, yaiku: konfigurasi konektor Quarkus, informasi endpoint AMQP lan kredensial klien. Mesthi, luwih apik kanggo nyimpen kabeh data konfigurasi ing sak panggonan, nanging kita bakal sengaja misahake kanggo nuduhake opsi sing bisa kanggo ngatur aplikasi Quarkus.

Konektor

Konfigurasi konektor bisa diwenehake nalika kompilasi nggunakake file properti aplikasi:

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

Kanggo tetep prasaja, kita mung bakal nggunakake antrian pesen kanggo alamat "pesenan". Lan alamat "konfirmasi" ing aplikasi kita bakal nggunakake antrian ing memori.

Titik pungkasan AMQP

Ing wektu kompilasi, jeneng host lan nomer port kanggo endpoint AMQP ora dingerteni, mula kudu disuntikake. Titik pungkasan bisa disetel ing configmap sing digawe dening AMQ Online, supaya kita bakal nemtokake dheweke liwat variabel lingkungan ing manifest aplikasi:

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

Kredensial

Token akun layanan bisa digunakake kanggo otentikasi aplikasi kita menyang OpenShift. Kanggo nindakake iki, sampeyan kudu nggawe ConfigSource khusus sing bakal maca token otentikasi saka sistem file 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);
    }
}

Mbangun lan nyebarake Aplikasi

Wiwit aplikasi kudu dikompilasi menyang file eksekusi, mesin virtual GraalVM dibutuhake. Kanggo rincian babagan carane nyiyapake lingkungan kanggo iki, waca pandhuan sing cocog ing Pandhuan Quarkus.

Banjur, miturut pandhuan sing diwenehake ing kana, sampeyan kudu ndownload sumber kasebut, mbangun lan nyebarake aplikasi kita:

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

Sawise printah kasebut, aplikasi bakal disebarake, nanging ora bakal diwiwiti nganti kita ngatur sumber olahpesen sing dibutuhake ing AMQ Online.

Nyetel sistem olahpesen

Saiki sing isih ana yaiku nyetel sumber daya sing dibutuhake aplikasi ing sistem olahpesen. Kanggo nindakake iki, sampeyan kudu nggawe: 1) papan alamat kanggo miwiti titik pungkasan sistem olahpesen; 2) alamat kanggo ngatur alamat sing digunakake ing aplikasi; 3) Pangguna olahpesen kanggo nyetel kredensial klien.

Papan alamat

Objek AddressSpace ing AMQ Online minangka klompok alamat sing nuduhake titik pungkasan sambungan lan kabijakan otentikasi lan wewenang. Nalika nggawe papan alamat, sampeyan bisa nemtokake cara titik pungkasan olahpesen bakal kapapar:

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

Alamat

Alamat digunakake kanggo ngirim lan nampa pesen. Saben alamat nduweni jinis, sing nemtokake semantik, uga rencana, sing nemtokake jumlah sumber daya sing bakal dilindhungi. Alamat bisa ditemtokake, contone, kaya iki:

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

Pangguna pesen

Kanggo mesthekake yen mung aplikasi sing dipercaya sing bisa ngirim lan nampa pesen menyang alamat sampeyan, sampeyan kudu nggawe pangguna ing sistem olahpesen. Kanggo aplikasi sing mlaku ing kluster, klien bisa dikonfirmasi nggunakake akun layanan OpenShift. "Akun layanan" pangguna bisa ditetepake, contone, kaya iki:

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

Idin kanggo ngatur aplikasi

Supaya AMQ Online bisa nggawe configmap sing digunakake kanggo nampilake informasi endpoint AMQP, Peran lan RoleBinding kudu disetel:

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

Carane aplikasi konfigurasi

Sampeyan bisa ngetrapake konfigurasi sistem olahpesen kaya iki:

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

Verifikasi aplikasi

Kanggo mesthekake yen aplikasi wis diwiwiti, dhisik, ayo priksa manawa alamat sing cocog wis digawe lan aktif:

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

Banjur ayo mriksa URL rute aplikasi (mung mbukak alamat iki ing browser):

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

Browser kudu nuduhake yen tiket dianyari sacara periodik amarga pesen dikirim lan ditampa dening AMQ Online.

Nyimpul

Dadi, kita nulis aplikasi Quarkus sing nggunakake AMQP kanggo olahpesen, ngatur aplikasi kanggo mbukak ing platform Red Hat OpenShift, lan ngetrapake konfigurasi kasebut adhedhasar konfigurasi AMQ Online. Kita banjur nggawe manifests sing dibutuhake kanggo miwiti sistem olahpesen kanggo aplikasi kita.

Iki nyimpulake seri babagan Quarkus, nanging ana akeh perkara anyar lan menarik ing ngarep, tetep dirungokake!

Source: www.habr.com

Add a comment