Hai semua! Ini dia - jawatan terakhir kami dalam siri Quarkus! (By the way, tonton webinar kami
Π
Sejak versi 0.17.0,
Diandaikan bahawa anda telah menggunakan AMQ Online pada platform OpenShift (jika tidak, lihat
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
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
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