Olahtalatah asli awan dina platform Red Hat OpenShift nganggo Quarkus sareng AMQ Online

Halo sadayana! Ieu - pos ahir urang dina séri Quarkus! (Ku jalan kitu, nonton webinar kami "Ieu Quarkus - kerangka Java asli Kubernetes". Kami bakal nunjukkeun anjeun kumaha ngamimitian ti mimiti atanapi nransferkeun solusi anu siap-siap)

Olahtalatah asli awan dina platform Red Hat OpenShift nganggo Quarkus sareng AMQ Online

В saméméhna Dina postingan ieu, urang ningal alat anu relevan anu tiasa dianggo pikeun ngitung perbaikan anu dicandak salaku hasil tina modérnisasi aplikasi Java.

Kusabab versi 0.17.0, quarkus ngarojong pamakéan Advanced Message Queuing Protocol (AMQP), anu mangrupikeun standar terbuka pikeun nransferkeun pesen bisnis antara aplikasi atanapi organisasi.

Beureum Hat AMQ Online nyaéta layanan anu diwangun dina dasar hiji proyék open source EnMasse sareng ngalaksanakeun mékanisme olahtalatah dumasar platform Hat Beureum OpenShift. Kanggo inpo nu langkung lengkep ihwal kumaha gawéna, tingali di dieu (EN). Dinten ieu kami bakal nunjukkeun anjeun kumaha ngagabungkeun AMQ Online sareng Quarkus pikeun ngawangun sistem olahtalatah basis OpenShift modern nganggo dua téknologi olahtalatah anyar.

Dianggap yén anjeun parantos nyebarkeun AMQ Online dina platform OpenShift (upami henteu, teras tingali pituduh instalasi).

Pikeun ngamimitian, urang bakal nyiptakeun aplikasi Quarkus anu bakal janten sistem pamrosésan pesenan saderhana nganggo olahtalatah réaktif. Aplikasi ieu bakal kalebet generator pesenan anu ngirim pesenan ka antrian pesen dina interval anu tetep, ogé prosésor pesenan anu bakal ngolah pesen tina antrian sareng ngahasilkeun konfirmasi anu tiasa ditingali dina browser.

Sakali kami nyiptakeun aplikasi, kami bakal nunjukkeun anjeun kumaha cara nyelapkeun konfigurasi sistem olahtalatah kana aplikasi sareng nganggo AMQ Online pikeun nyayogikeun sumber anu kami butuhkeun dina sistem.

aplikasi Quarkus

Aplikasi Quarkus kami dijalankeun dina OpenShift sareng mangrupikeun vérsi program anu dirobih amqp-ngamimitian gancang. Hiji conto lengkep tina sisi klien bisa kapanggih di dieu.

Generator pesenan

Generator ngan saukur monotonically ngirimkeun ID pesenan ngembang ka alamat "pesenan" unggal 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

Panangan pesenan langkung saderhana, éta ngan ukur ngabalikeun ID konfirmasi ka 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;
    }
}

Sumberdaya Konfirmasi

Sumber daya konfirmasi mangrupikeun titik akhir HTTP pikeun daptar konfirmasi anu dihasilkeun ku aplikasi kami.

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

carana ngatur

Pikeun nyambung ka AMQ Online, aplikasi urang peryogi sababaraha data konfigurasi, nyaéta: Konfigurasi konektor Quarkus, inpormasi titik tungtung AMQP sareng kredensial klien. Éta, tangtosna, langkung saé pikeun nyimpen sadaya data konfigurasi dina hiji tempat, tapi urang ngahaja bakal misahkeunana pikeun nunjukkeun pilihan anu mungkin pikeun ngonpigurasikeun aplikasi Quarkus.

Panyambung

Konfigurasi konektor tiasa disayogikeun dina waktos kompilasi nganggo file sipat aplikasi:

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

Pikeun ngajaga saderhana, urang ngan ukur nganggo antrian pesen pikeun alamat "pesenan". Sareng alamat "konfirmasi" dina aplikasi kami bakal nganggo antrian dina mémori.

AMQP tungtung

Dina waktos kompilasi, hostname sareng nomer port pikeun titik AMQP teu dipikanyaho, janten aranjeunna kedah disuntik. Titik akhirna tiasa disetél dina configmap anu didamel ku AMQ Online, ku kituna urang bakal ngartikeunana ngaliwatan variabel lingkungan dina 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

Kapercayaan

Token akun jasa tiasa dianggo pikeun ngaoténtikasi aplikasi kami ka OpenShift. Jang ngalampahkeun ieu, anjeun mimitina kudu nyieun custom ConfigSource nu bakal maca token auténtikasi tina sistem file pod urang:

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

Ngawangun sareng nyebarkeun Aplikasi

Kusabab aplikasina kedah disusun kana file anu tiasa dieksekusi, mesin virtual GraalVM diperyogikeun. Pikeun detil ngeunaan cara nyetél lingkungan pikeun ieu, tingali petunjuk anu aya dina Panungtun Quarkus.

Teras, nuturkeun pitunjuk anu dipasihkeun di dinya, anjeun kedah ngaunduh sumberna, ngawangun sareng nyebarkeun aplikasi kami:

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

Saatos paréntah ieu, aplikasi bakal disebarkeun, tapi moal ngamimitian dugi ka urang ngonpigurasikeun sumber olahtalatah anu urang peryogikeun dina AMQ Online.

Nyetél sistem olahtalatah

Ayeuna anu tinggaleun nyaéta nyetél sumber daya anu diperyogikeun aplikasi urang dina sistem olahtalatah. Jang ngalampahkeun ieu, anjeun kudu nyieun: 1) spasi alamat pikeun initialize titik tungtung sistem olahtalatah; 2) alamat pikeun ngonpigurasikeun alamat anu kami anggo dina aplikasi; 3) Olahtalatah pamaké pikeun nyetél Kapercayaan klien.

spasi alamat

Objek AddressSpace dina AMQ Online mangrupikeun grup alamat anu ngabagi titik tungtung sambungan sareng kabijakan auténtikasi sareng otorisasi. Nalika anjeun nyiptakeun rohangan alamat, anjeun tiasa netepkeun kumaha titik tungtung olahtalatah bakal kakeunaan:

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 dipaké pikeun ngirim jeung nampa talatah. Unggal alamat boga tipe, nu nangtukeun semantik na, kitu ogé rencana, nu nangtukeun jumlah sumberdaya pikeun ditangtayungan. Alamatna tiasa ditangtukeun, contona, sapertos kieu:

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

Pamaké talatah

Pikeun mastikeun yén ngan ukur aplikasi anu dipercaya anu tiasa ngirim sareng nampi pesen ka alamat anjeun, anjeun kedah nyiptakeun pangguna dina sistem olahtalatah. Pikeun aplikasi anu dijalankeun dina klaster, klien tiasa dioténtikasi nganggo akun jasa OpenShift. The pamaké "serviceaccount" bisa dihartikeun, contona, kawas kieu:

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 pikeun ngonpigurasikeun aplikasi

Supados AMQ Online tiasa ngadamel configmap anu biasa kami embed inpormasi titik tungtung AMQP, Peran sareng RoleBinding kedah diatur:

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

Kumaha nerapkeun konfigurasi

Anjeun tiasa nerapkeun konfigurasi sistem olahtalatah sapertos kieu:

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

Pikeun mastikeun yén aplikasi parantos ngamimitian, mimitina, hayu urang pariksa naha alamat anu cocog parantos didamel sareng aktip:

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

Teras hayu urang parios URL rute aplikasi (ngan buka alamat ieu dina browser):

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

Browser kedah nunjukkeun yén tiket diropéa périodik nalika pesen dikirim sareng ditampi ku AMQ Online.

summing up

Sangkan nulis hiji aplikasi Quarkus anu ngagunakeun AMQP pikeun olahtalatah, ngonpigurasi aplikasi pikeun ngajalankeun on platform Red Hat OpenShift, sarta ngalaksanakeun konfigurasi na dumasar kana konfigurasi AMQ Online. Urang lajeng nyieun manifests diperlukeun pikeun initialize sistem olahtalatah pikeun aplikasi urang.

Ieu menyimpulkan runtuyan ngeunaan Quarkus, tapi aya loba hal anyar jeung metot payun, tetep katala!

sumber: www.habr.com

Tambahkeun komentar