Pemesejan asli awan pada platform Red Hat OpenShift menggunakan Quarkus dan AMQ Online

Hai semua! Ini dia - jawatan terakhir kami dalam siri Quarkus! (By the way, tonton webinar kami β€œIni ialah rangka kerja Java asli Quarkus – Kubernetes”. Kami akan menunjukkan kepada anda cara untuk bermula dari awal atau memindahkan penyelesaian siap)

Pemesejan asli awan pada platform Red Hat OpenShift menggunakan Quarkus dan AMQ Online

Π’ sebelumnya Dalam siaran ini, kami melihat alat yang berkaitan yang boleh digunakan untuk mengukur peningkatan yang diperoleh hasil daripada memodenkan aplikasi Java.

Sejak versi 0.17.0, quarkus menyokong penggunaan Protokol Barisan Mesej Lanjutan (AMQP), yang merupakan standard terbuka untuk memindahkan mesej perniagaan antara aplikasi atau organisasi.

Red Hat AMQ Dalam Talian ialah perkhidmatan yang dibina berdasarkan projek sumber terbuka EnMasse dan melaksanakan mekanisme pemesejan berasaskan platform Red Hat OpenShift. Untuk butiran lanjut tentang cara ia berfungsi, lihat di sini (EN). Hari ini kami akan menunjukkan kepada anda cara menggabungkan AMQ Online dan Quarkus untuk membina sistem pemesejan berasaskan OpenShift moden menggunakan dua teknologi pemesejan baharu.

Diandaikan bahawa anda telah menggunakan AMQ Online pada platform OpenShift (jika tidak, lihat panduan pemasangan).

Untuk memulakan, kami akan mencipta aplikasi Quarkus yang akan menjadi sistem pemprosesan pesanan ringkas menggunakan pemesejan reaktif. Aplikasi ini akan menyertakan penjana pesanan yang menghantar pesanan kepada baris gilir mesej pada selang masa tetap, serta pemproses pesanan yang akan memproses mesej daripada baris gilir dan menjana pengesahan yang boleh dilihat dalam penyemak imbas.

Setelah kami membuat aplikasi, kami akan menunjukkan kepada anda cara untuk membenamkan konfigurasi sistem pemesejan ke dalam aplikasi dan menggunakan AMQ Online untuk menyediakan sumber yang kami perlukan pada sistem.

Aplikasi Quarkus

Aplikasi Quarkus kami berjalan pada OpenShift dan merupakan versi program yang diubah suai amqp-mula pantas. Contoh lengkap bahagian pelanggan boleh didapati di sini.

Penjana pesanan

Penjana hanya secara monoton menghantar ID pesanan yang semakin meningkat ke alamat "pesanan" setiap 5 saat.

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

Pemproses Pesanan

Pengendali pesanan adalah lebih mudah, ia hanya mengembalikan ID pengesahan ke alamat "pengesahan".

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

Sumber pengesahan ialah titik akhir HTTP untuk menyenaraikan pengesahan yang dijana oleh 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;
    }
}

pelarasan

Untuk menyambung ke AMQ Online, aplikasi kami memerlukan beberapa data konfigurasi, iaitu: konfigurasi penyambung Quarkus, maklumat titik akhir AMQP dan kelayakan pelanggan. Sudah tentu, adalah lebih baik untuk menyimpan semua data konfigurasi di satu tempat, tetapi kami akan memisahkannya dengan sengaja untuk menunjukkan pilihan yang mungkin untuk mengkonfigurasi aplikasi Quarkus.

Penyambung

Konfigurasi penyambung boleh disediakan pada masa penyusunan menggunakan fail sifat aplikasi:

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

Untuk memastikan perkara mudah, kami hanya akan menggunakan baris gilir mesej untuk alamat "pesanan". Dan alamat "pengesahan" dalam aplikasi kami akan menggunakan baris gilir dalam ingatan.

Titik akhir AMQP

Pada masa penyusunan, nama hos dan nombor port untuk titik akhir AMQP tidak diketahui, jadi ia mesti disuntik. Titik akhir boleh ditetapkan dalam peta konfigurasi yang dibuat oleh AMQ Online, jadi kami akan mentakrifkannya melalui pembolehubah persekitaran dalam manifes 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

Kelayakan

Token akaun perkhidmatan boleh digunakan untuk mengesahkan aplikasi kami kepada OpenShift. Untuk melakukan ini, anda mesti membuat ConfigSource tersuai dahulu yang akan membaca token pengesahan daripada sistem fail 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);
    }
}

Bina dan Pasang Aplikasi

Memandangkan aplikasi mesti disusun ke dalam fail boleh laku, mesin maya GraalVM diperlukan. Untuk butiran tentang cara menyediakan persekitaran untuk ini, lihat arahan yang sepadan dalam Panduan Quarkus.

Kemudian, mengikut arahan yang diberikan di sana, anda perlu memuat turun sumber, membina dan menggunakan 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

Selepas arahan ini, aplikasi akan digunakan, tetapi tidak akan bermula sehingga kami mengkonfigurasi sumber pemesejan yang kami perlukan dalam AMQ Online.

Menyediakan sistem pemesejan

Kini yang tinggal hanyalah untuk menetapkan sumber yang diperlukan oleh aplikasi kami dalam sistem pemesejan. Untuk melakukan ini, anda perlu mencipta: 1) ruang alamat untuk memulakan titik akhir sistem pemesejan; 2) alamat untuk mengkonfigurasi alamat yang kami gunakan dalam aplikasi; 3) Pemesejan pengguna untuk menetapkan kelayakan pelanggan.

Ruang alamat

Objek AddressSpace dalam AMQ Online ialah sekumpulan alamat yang berkongsi titik akhir sambungan dan dasar pengesahan dan kebenaran. Apabila anda membuat ruang alamat, anda boleh menentukan cara titik akhir pemesejan akan didedahkan:

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 digunakan untuk menghantar dan menerima mesej. Setiap alamat mempunyai jenis, yang menentukan semantiknya, serta rancangan, yang menentukan bilangan sumber yang akan ditempah. Alamat boleh ditentukan, contohnya, seperti ini:

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

Pengguna pemesejan

Untuk memastikan bahawa hanya aplikasi yang dipercayai boleh menghantar dan menerima mesej ke alamat anda, anda mesti mencipta pengguna dalam sistem pemesejan. Untuk aplikasi yang dijalankan pada kluster, pelanggan boleh disahkan menggunakan akaun perkhidmatan OpenShift. "Akaun perkhidmatan" pengguna boleh ditakrifkan, contohnya, seperti ini:

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

Kebenaran untuk mengkonfigurasi aplikasi

Agar AMQ Online mencipta peta konfigurasi yang kami gunakan untuk membenamkan maklumat titik akhir AMQP, Peranan dan Pengikatan Peranan mesti ditetapkan:

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

Cara menggunakan konfigurasi

Anda boleh menggunakan konfigurasi sistem pemesejan seperti ini:

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

Pengesahan permohonan

Untuk memastikan bahawa aplikasi telah dimulakan, pertama sekali, mari kita semak sama ada alamat yang sepadan telah dibuat dan aktif:

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

Kemudian mari kita semak URL laluan aplikasi (buka sahaja alamat ini dalam penyemak imbas):

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

Penyemak imbas harus menunjukkan bahawa tiket dikemas kini secara berkala kerana mesej dihantar dan diterima oleh AMQ Online.

Merumuskan

Jadi kami menulis aplikasi Quarkus yang menggunakan AMQP untuk pemesejan, mengkonfigurasi aplikasi untuk dijalankan pada platform Red Hat OpenShift dan melaksanakan konfigurasinya berdasarkan konfigurasi AMQ Online. Kami kemudian mencipta manifes yang diperlukan untuk memulakan sistem pemesejan untuk aplikasi kami.

Ini menyimpulkan siri tentang Quarkus, tetapi terdapat banyak perkara baharu dan menarik di hadapan, nantikan!

Sumber: www.habr.com

Tambah komen