Halo kabeh! Punika - kiriman pungkasan kita ing seri Quarkus! (Oalah, nonton webinar kita
Π
Wiwit versi 0.17.0,
Dianggep sampeyan wis masang AMQ Online ing platform OpenShift (yen ora, banjur deleng
Kanggo miwiti, kita bakal nggawe aplikasi Quarkus sing bakal dadi sistem pangolahan pesenan sing gampang nggunakake olahpesen reaktif. Aplikasi iki bakal kalebu generator pesenan sing ngirim pesenan menyang antrian pesen kanthi interval tetep, uga prosesor pesenan sing bakal ngolah pesen saka antrian lan ngasilake konfirmasi sing bisa dideleng ing browser.
Sawise nggawe aplikasi kasebut, kita bakal nuduhake sampeyan carane masang konfigurasi sistem olahpesen menyang aplikasi lan nggunakake AMQ Online kanggo nyedhiyakake sumber daya sing dibutuhake ing sistem kasebut.
Aplikasi Quarkus
Aplikasi Quarkus kita mlaku ing OpenShift lan minangka versi modifikasi saka program kasebut
Pesen generator
Generator mung kanthi monoton ngirim ID pesenan sing akeh menyang alamat "pesenan" saben 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++);
}
}
Prosesor pesenan
Handler pesenan malah luwih prasaja, mung ngasilake ID konfirmasi menyang 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 konfirmasi minangka titik pungkasan HTTP kanggo nyathet konfirmasi sing digawe dening 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;
}
}
imbuhan
Kanggo nyambung menyang AMQ Online, aplikasi kita mbutuhake sawetara data konfigurasi, yaiku: konfigurasi konektor Quarkus, informasi endpoint AMQP lan kredensial klien. Mesthi, luwih apik kanggo nyimpen kabeh data konfigurasi ing sak panggonan, nanging kita bakal sengaja misahake kanggo nuduhake opsi sing bisa kanggo ngatur aplikasi Quarkus.
Konektor
Konfigurasi konektor bisa diwenehake nalika kompilasi nggunakake file properti aplikasi:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Kanggo tetep prasaja, kita mung bakal nggunakake antrian pesen kanggo alamat "pesenan". Lan alamat "konfirmasi" ing aplikasi kita bakal nggunakake antrian ing memori.
Titik pungkasan AMQP
Ing wektu kompilasi, jeneng host lan nomer port kanggo endpoint AMQP ora dingerteni, mula kudu disuntikake. Titik pungkasan bisa disetel ing configmap sing digawe dening AMQ Online, supaya kita bakal nemtokake dheweke liwat variabel lingkungan ing manifest 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 bisa digunakake kanggo otentikasi aplikasi kita menyang OpenShift. Kanggo nindakake iki, sampeyan kudu nggawe ConfigSource khusus sing bakal maca token otentikasi saka 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);
}
}
Mbangun lan nyebarake Aplikasi
Wiwit aplikasi kudu dikompilasi menyang file eksekusi, mesin virtual GraalVM dibutuhake. Kanggo rincian babagan carane nyiyapake lingkungan kanggo iki, waca pandhuan sing cocog ing
Banjur, miturut pandhuan sing diwenehake ing kana, sampeyan kudu ndownload sumber kasebut, mbangun lan nyebarake 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
Sawise printah kasebut, aplikasi bakal disebarake, nanging ora bakal diwiwiti nganti kita ngatur sumber olahpesen sing dibutuhake ing AMQ Online.
Nyetel sistem olahpesen
Saiki sing isih ana yaiku nyetel sumber daya sing dibutuhake aplikasi ing sistem olahpesen. Kanggo nindakake iki, sampeyan kudu nggawe: 1) papan alamat kanggo miwiti titik pungkasan sistem olahpesen; 2) alamat kanggo ngatur alamat sing digunakake ing aplikasi; 3) Pangguna olahpesen kanggo nyetel kredensial klien.
Papan alamat
Objek AddressSpace ing AMQ Online minangka klompok alamat sing nuduhake titik pungkasan sambungan lan kabijakan otentikasi lan wewenang. Nalika nggawe papan alamat, sampeyan bisa nemtokake cara titik pungkasan olahpesen bakal kapapar:
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 digunakake kanggo ngirim lan nampa pesen. Saben alamat nduweni jinis, sing nemtokake semantik, uga rencana, sing nemtokake jumlah sumber daya sing bakal dilindhungi. Alamat bisa ditemtokake, contone, kaya iki:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Pangguna pesen
Kanggo mesthekake yen mung aplikasi sing dipercaya sing bisa ngirim lan nampa pesen menyang alamat sampeyan, sampeyan kudu nggawe pangguna ing sistem olahpesen. Kanggo aplikasi sing mlaku ing kluster, klien bisa dikonfirmasi nggunakake akun layanan OpenShift. "Akun layanan" pangguna bisa ditetepake, contone, kaya iki:
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"]
Idin kanggo ngatur aplikasi
Supaya AMQ Online bisa nggawe configmap sing digunakake kanggo nampilake informasi endpoint AMQP, Peran lan RoleBinding kudu 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
Carane aplikasi konfigurasi
Sampeyan bisa ngetrapake konfigurasi sistem olahpesen kaya iki:
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
Kanggo mesthekake yen aplikasi wis diwiwiti, dhisik, ayo priksa manawa alamat sing cocog wis digawe lan aktif:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Banjur ayo mriksa URL rute aplikasi (mung mbukak alamat iki ing browser):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Browser kudu nuduhake yen tiket dianyari sacara periodik amarga pesen dikirim lan ditampa dening AMQ Online.
Nyimpul
Dadi, kita nulis aplikasi Quarkus sing nggunakake AMQP kanggo olahpesen, ngatur aplikasi kanggo mbukak ing platform Red Hat OpenShift, lan ngetrapake konfigurasi kasebut adhedhasar konfigurasi AMQ Online. Kita banjur nggawe manifests sing dibutuhake kanggo miwiti sistem olahpesen kanggo aplikasi kita.
Iki nyimpulake seri babagan Quarkus, nanging ana akeh perkara anyar lan menarik ing ngarep, tetep dirungokake!
Source: www.habr.com