Halo semua! Ini dia - postingan terakhir kami di seri Quarkus! (Omong-omong, tonton webinar kami
Π
Sejak versi 0.17.0,
Diasumsikan bahwa Anda telah menerapkan AMQ Online pada platform OpenShift (jika belum, lihat
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
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
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