Hai semuanya! Ini dia – postingan terakhir kami di seri Quarkus! (Ngomong-ngomong, lihat webinar kami . Kami akan menunjukkan cara memulai dari awal atau mentransfer solusi yang sudah jadi)

В Dalam postingan ini, kita melihat sejumlah alat relevan yang dapat digunakan untuk mengukur peningkatan yang dicapai melalui pemutakhiran aplikasi Java.
Sejak versi 0.17.0, mendukung penggunaan Protokol Antrean Pesan Lanjutan (), yang merupakan standar terbuka untuk mengirimkan pesan bisnis antar aplikasi atau organisasi.
– adalah layanan yang dibangun pada proyek sumber terbuka dan menerapkan mekanisme pengiriman pesan berdasarkan platform Untuk informasi lebih lanjut tentang cara kerjanya, lihat Hari ini, kami akan menunjukkan cara menggabungkan AMQ Online dan Quarkus untuk membangun sistem pengiriman pesan modern di OpenShift menggunakan dua teknologi pemrosesan pesan baru.
Artikel ini mengasumsikan Anda telah menerapkan AMQ Online pada platform OpenShift (jika belum, lihat ).
Untuk memulai, kita akan membuat aplikasi Quarkus, sebuah sistem pemrosesan pesanan sederhana menggunakan pesan reaktif. Aplikasi ini akan mencakup generator pesanan, yang mengirimkan pesanan ke antrean pesan pada interval tertentu, dan pemroses pesanan, yang akan memproses pesan dari antrean dan menghasilkan konfirmasi yang dapat dilihat di peramban.
Setelah membuat aplikasi, kami akan menunjukkan kepada Anda cara menerapkan konfigurasi sistem perpesanan ke dalamnya dan menggunakan AMQ Online untuk menginisialisasi sumber daya yang kami perlukan pada sistem tersebut.
Aplikasi Quarkus
Aplikasi Quarkus kami berjalan pada OpenShift dan merupakan versi modifikasi dari program Contoh sisi klien yang lengkap dapat ditemukan .
Pembuat pesanan
Generator hanya secara monoton mengirimkan ID pesanan yang meningkat 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
Penanganan 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 pernyataan adalah titik akhir HTTP untuk mencantumkan pernyataan 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 titik akhir AMQP, dan kredensial klien. Meskipun sebaiknya semua data konfigurasi disimpan di satu tempat, kita akan memisahkannya untuk mengilustrasikan kemungkinan opsi konfigurasi untuk aplikasi Quarkus.
Konektor
Konfigurasi konektor dapat disediakan pada waktu kompilasi menggunakan berkas properti aplikasi:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Untuk menyederhanakannya, kita akan menggunakan antrean pesan hanya untuk alamat "pesanan". Alamat "konfirmasi" di aplikasi kita akan menggunakan antrean dalam memori.
Titik akhir AMQP
Pada waktu kompilasi, nama host dan nomor port untuk titik akhir AMQP tidak diketahui, sehingga perlu disuntikkan. Titik akhir dapat ditentukan dalam configmap yang dihasilkan oleh AMQ Online, jadi kita akan mendefinisikannya menggunakan 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 di OpenShift. Untuk melakukannya, pertama-tama kita perlu membuat ConfigSource khusus yang akan membaca token autentikasi dari sistem berkas 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 perlu dikompilasi menjadi berkas yang dapat dieksekusi, diperlukan mesin virtual GraalVM. Untuk informasi lebih lanjut tentang pengaturan lingkungan ini, lihat petunjuk terkait di .
Kemudian, dengan mengikuti petunjuk yang disediakan di sana, Anda perlu mengunduh kode sumber, membangunnya, dan menerapkan 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
Setelah perintah ini, aplikasi akan diterapkan, tetapi tidak akan dimulai sampai kita mengonfigurasi sumber daya pengiriman pesan yang kita perlukan di AMQ Online.
Menyiapkan sistem pesan
Sekarang kita hanya perlu menentukan sumber daya yang dibutuhkan aplikasi kita dalam sistem perpesanan. Untuk melakukannya, kita perlu membuat: 1) ruang alamat untuk menginisialisasi titik akhir sistem perpesanan; 2) alamat untuk mengonfigurasi alamat yang kita gunakan dalam aplikasi; 3) pengguna sistem perpesanan 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 membuat ruang alamat, Anda dapat menentukan bagaimana titik akhir pengiriman pesan akan disediakan:
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, dan paket, yang menentukan jumlah sumber daya yang akan dipesan. Sebuah alamat dapat didefinisikan, misalnya, seperti ini:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Pengguna sistem pesan
Untuk memastikan bahwa hanya aplikasi tepercaya yang dapat mengirim dan menerima pesan ke alamat Anda, Anda perlu membuat pengguna di sistem pengiriman pesan. Untuk aplikasi yang berjalan di klaster, klien dapat diautentikasi menggunakan akun layanan OpenShift. Pengguna "serviceaccount" dapat didefinisikan, misalnya, sebagai berikut:
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 penyesuaian aplikasi
Agar AMQ Online dapat membuat peta konfigurasi yang kami gunakan untuk menyuntikkan detail titik akhir AMQP, Anda perlu mengatur Peran dan Pengikatan Peran:
---
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 perpesanan 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 aplikasi telah diluncurkan, pertama-tama periksa apakah alamat terkait telah dibuat dan aktif:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Selanjutnya, mari kita periksa URL rute aplikasi (cukup buka alamat ini di browser):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Di peramban, Anda akan melihat 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, mengonfigurasinya agar berjalan di platform Red Hat OpenShift, dan mengimplementasikan konfigurasinya berdasarkan konfigurasi AMQ Online. Selanjutnya, kami membuat manifes yang diperlukan untuk menginisialisasi sistem pengiriman pesan untuk aplikasi kami.
Ini mengakhiri seri kami tentang Quarkus, tetapi masih banyak lagi yang akan datang, jadi tetaplah simak!
Sumber: www.habr.com
