Pesan cloud-native pada platform Red Hat OpenShift menggunakan Quarkus dan AMQ Online

Halo semua! Ini dia - postingan terakhir kami di seri Quarkus! (Omong-omong, tonton webinar kami β€œIni adalah Quarkus – kerangka Java asli Kubernetes”. Kami akan menunjukkan cara memulai dari awal atau mentransfer solusi yang sudah jadi)

Pesan cloud-native pada platform Red Hat OpenShift menggunakan Quarkus dan AMQ Online

Π’ sebelumnya Dalam postingan ini, kita melihat alat relevan yang dapat digunakan untuk mengukur peningkatan yang diperoleh dari modernisasi aplikasi Java.

Sejak versi 0.17.0, kuarkus mendukung penggunaan Protokol Antrian Pesan Tingkat Lanjut (AMQP), yang merupakan standar terbuka untuk mentransfer pesan bisnis antar aplikasi atau organisasi.

Topi Merah AMQ Online adalah layanan yang dibangun berdasarkan proyek sumber terbuka EnMasse dan menerapkan mekanisme pengiriman pesan berbasis platform Red Hat OpenShift. Untuk detail lebih lanjut tentang cara kerjanya, lihat di sini (ID). Hari ini kami akan menunjukkan cara menggabungkan AMQ Online dan Quarkus untuk membangun sistem perpesanan modern berbasis OpenShift menggunakan dua teknologi perpesanan baru.

Diasumsikan bahwa Anda telah menerapkan AMQ Online pada platform OpenShift (jika belum, lihat petunjuk pemasangan).

Untuk memulai, kita akan membuat aplikasi Quarkus yang akan menjadi sistem pemrosesan pesanan sederhana menggunakan pesan reaktif. Aplikasi ini akan mencakup generator pesanan yang mengirimkan pesanan ke antrian pesan pada interval tetap, serta pemroses pesanan yang akan memproses pesan dari antrian dan menghasilkan konfirmasi yang dapat dilihat di browser.

Setelah kami membuat aplikasi, kami akan menunjukkan kepada Anda cara menyematkan konfigurasi sistem pesan ke dalam aplikasi dan menggunakan AMQ Online untuk menyediakan sumber daya yang kami perlukan pada sistem.

Aplikasi Quarkus

Aplikasi Quarkus kami berjalan pada OpenShift dan merupakan versi program yang dimodifikasi amqp-mulai cepat. Contoh lengkap dari sisi klien dapat ditemukan di sini.

Pembuat pesanan

Generator secara monoton mengirimkan ID pesanan yang terus bertambah ke alamat β€œpesanan” setiap 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++);
    }
}

Pemroses Pesanan

Pengendali pesanan bahkan lebih sederhana, ia hanya mengembalikan ID konfirmasi ke 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 daya konfirmasi adalah titik akhir HTTP untuk mencantumkan konfirmasi yang dihasilkan oleh 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;
    }
}

pengaturan

Untuk terhubung ke AMQ Online, aplikasi kita memerlukan beberapa data konfigurasi, yaitu: konfigurasi konektor Quarkus, informasi endpoint AMQP, dan kredensial klien. Tentu saja, lebih baik menyimpan semua data konfigurasi di satu tempat, tetapi kami akan sengaja memisahkannya untuk menunjukkan opsi yang memungkinkan untuk mengonfigurasi aplikasi Quarkus.

Konektor

Konfigurasi konektor dapat disediakan pada waktu kompilasi menggunakan file properti aplikasi:

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

Untuk menyederhanakannya, kami hanya akan menggunakan antrian pesan untuk alamat "pesanan". Dan alamat β€œkonfirmasi” di aplikasi kita akan menggunakan antrian di memori.

Titik akhir AMQP

Pada waktu kompilasi, nama host dan nomor port untuk titik akhir AMQP tidak diketahui, sehingga harus dimasukkan. Titik akhir dapat diatur dalam configmap yang dibuat oleh AMQ Online, jadi kami akan mendefinisikannya melalui variabel lingkungan 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

Kredensial

Token akun layanan dapat digunakan untuk mengautentikasi aplikasi kita ke OpenShift. Untuk melakukan hal ini, Anda harus terlebih dahulu membuat ConfigSource khusus yang akan membaca token autentikasi dari 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);
    }
}

Membangun dan Menyebarkan Aplikasi

Karena aplikasi harus dikompilasi menjadi file yang dapat dieksekusi, diperlukan mesin virtual GraalVM. Untuk detail tentang cara menyiapkan lingkungan untuk ini, lihat petunjuk terkait di Panduan Quarkus.

Kemudian, dengan mengikuti petunjuk yang diberikan di sana, Anda perlu mengunduh sumbernya, membangun dan menerapkan 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

Setelah perintah ini, aplikasi akan diterapkan, tetapi tidak akan dimulai sampai kita mengonfigurasi sumber daya perpesanan yang kita perlukan di AMQ Online.

Menyiapkan sistem pesan

Sekarang yang tersisa hanyalah mengatur sumber daya yang dibutuhkan aplikasi kita di sistem pesan. Untuk melakukan ini, Anda perlu membuat: 1) ruang alamat untuk menginisialisasi titik akhir sistem pesan; 2) alamat untuk mengkonfigurasi alamat yang kami gunakan dalam aplikasi; 3) Mengirim pesan kepada pengguna untuk mengatur kredensial klien.

Ruang alamat

Objek AddressSpace di AMQ Online adalah sekelompok alamat yang berbagi titik akhir koneksi serta kebijakan autentikasi dan otorisasi. Saat Anda membuat ruang alamat, Anda dapat menentukan bagaimana titik akhir pesan akan diekspos:

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 mengirim dan menerima pesan. Setiap alamat memiliki tipe, yang menentukan semantiknya, serta rencana, yang menentukan jumlah sumber daya yang akan dicadangkan. Alamatnya bisa ditentukan misalnya seperti ini:

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

Pengguna pesan

Untuk memastikan bahwa hanya aplikasi tepercaya yang dapat mengirim dan menerima pesan ke alamat Anda, Anda harus membuat pengguna di sistem pesan. Untuk aplikasi yang berjalan di cluster, klien dapat diautentikasi menggunakan akun layanan OpenShift. Pengguna "akun layanan" dapat didefinisikan, misalnya, 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"]

Izin untuk mengkonfigurasi aplikasi

Agar AMQ Online dapat membuat configmap yang kita gunakan untuk menyematkan informasi endpoint AMQP, Role dan RoleBinding harus 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

Cara menerapkan konfigurasi

Anda dapat menerapkan konfigurasi sistem pesan 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

Verifikasi aplikasi

Untuk memastikan bahwa aplikasi telah dimulai, pertama-tama, mari kita periksa apakah alamat yang sesuai telah dibuat dan aktif:

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

Lalu mari kita periksa URL rute aplikasi (buka saja alamat ini di browser):

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

Browser harus menunjukkan bahwa tiket diperbarui secara berkala saat pesan dikirim dan diterima oleh AMQ Online.

Menyimpulkan

Jadi kami menulis aplikasi Quarkus yang menggunakan AMQP untuk pengiriman pesan, mengonfigurasi aplikasi agar berjalan pada platform Red Hat OpenShift, dan mengimplementasikan konfigurasinya berdasarkan konfigurasi AMQ Online. Kami kemudian membuat manifes yang diperlukan untuk menginisialisasi sistem pesan untuk aplikasi kami.

Sekianlah seri tentang Quarkus, namun masih banyak hal baru dan menarik kedepannya, stay tuned!

Sumber: www.habr.com

Tambah komentar