Halo sadayana! Ieu - pos ahir urang dina séri Quarkus! (Ku jalan kitu, nonton webinar kami
В
Kusabab versi 0.17.0,
Dianggap yén anjeun parantos nyebarkeun AMQ Online dina platform OpenShift (upami henteu, teras tingali
Pikeun ngamimitian, urang bakal nyiptakeun aplikasi Quarkus anu bakal janten sistem pamrosésan pesenan saderhana nganggo olahtalatah réaktif. Aplikasi ieu bakal kalebet generator pesenan anu ngirim pesenan ka antrian pesen dina interval anu tetep, ogé prosésor pesenan anu bakal ngolah pesen tina antrian sareng ngahasilkeun konfirmasi anu tiasa ditingali dina browser.
Sakali kami nyiptakeun aplikasi, kami bakal nunjukkeun anjeun kumaha cara nyelapkeun konfigurasi sistem olahtalatah kana aplikasi sareng nganggo AMQ Online pikeun nyayogikeun sumber anu kami butuhkeun dina sistem.
aplikasi Quarkus
Aplikasi Quarkus kami dijalankeun dina OpenShift sareng mangrupikeun vérsi program anu dirobih
Generator pesenan
Generator ngan saukur monotonically ngirimkeun ID pesenan ngembang ka alamat "pesenan" unggal 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
Panangan pesenan langkung saderhana, éta ngan ukur ngabalikeun ID konfirmasi ka 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;
}
}
Sumberdaya Konfirmasi
Sumber daya konfirmasi mangrupikeun titik akhir HTTP pikeun daptar konfirmasi anu dihasilkeun ku 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;
}
}
carana ngatur
Pikeun nyambung ka AMQ Online, aplikasi urang peryogi sababaraha data konfigurasi, nyaéta: Konfigurasi konektor Quarkus, inpormasi titik tungtung AMQP sareng kredensial klien. Éta, tangtosna, langkung saé pikeun nyimpen sadaya data konfigurasi dina hiji tempat, tapi urang ngahaja bakal misahkeunana pikeun nunjukkeun pilihan anu mungkin pikeun ngonpigurasikeun aplikasi Quarkus.
Panyambung
Konfigurasi konektor tiasa disayogikeun dina waktos kompilasi nganggo file sipat aplikasi:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Pikeun ngajaga saderhana, urang ngan ukur nganggo antrian pesen pikeun alamat "pesenan". Sareng alamat "konfirmasi" dina aplikasi kami bakal nganggo antrian dina mémori.
AMQP tungtung
Dina waktos kompilasi, hostname sareng nomer port pikeun titik AMQP teu dipikanyaho, janten aranjeunna kedah disuntik. Titik akhirna tiasa disetél dina configmap anu didamel ku AMQ Online, ku kituna urang bakal ngartikeunana ngaliwatan variabel lingkungan dina 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
Kapercayaan
Token akun jasa tiasa dianggo pikeun ngaoténtikasi aplikasi kami ka OpenShift. Jang ngalampahkeun ieu, anjeun mimitina kudu nyieun custom ConfigSource nu bakal maca token auténtikasi tina sistem file pod urang:
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);
}
}
Ngawangun sareng nyebarkeun Aplikasi
Kusabab aplikasina kedah disusun kana file anu tiasa dieksekusi, mesin virtual GraalVM diperyogikeun. Pikeun detil ngeunaan cara nyetél lingkungan pikeun ieu, tingali petunjuk anu aya dina
Teras, nuturkeun pitunjuk anu dipasihkeun di dinya, anjeun kedah ngaunduh sumberna, ngawangun sareng nyebarkeun 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
Saatos paréntah ieu, aplikasi bakal disebarkeun, tapi moal ngamimitian dugi ka urang ngonpigurasikeun sumber olahtalatah anu urang peryogikeun dina AMQ Online.
Nyetél sistem olahtalatah
Ayeuna anu tinggaleun nyaéta nyetél sumber daya anu diperyogikeun aplikasi urang dina sistem olahtalatah. Jang ngalampahkeun ieu, anjeun kudu nyieun: 1) spasi alamat pikeun initialize titik tungtung sistem olahtalatah; 2) alamat pikeun ngonpigurasikeun alamat anu kami anggo dina aplikasi; 3) Olahtalatah pamaké pikeun nyetél Kapercayaan klien.
spasi alamat
Objek AddressSpace dina AMQ Online mangrupikeun grup alamat anu ngabagi titik tungtung sambungan sareng kabijakan auténtikasi sareng otorisasi. Nalika anjeun nyiptakeun rohangan alamat, anjeun tiasa netepkeun kumaha titik tungtung olahtalatah bakal kakeunaan:
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 dipaké pikeun ngirim jeung nampa talatah. Unggal alamat boga tipe, nu nangtukeun semantik na, kitu ogé rencana, nu nangtukeun jumlah sumberdaya pikeun ditangtayungan. Alamatna tiasa ditangtukeun, contona, sapertos kieu:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Pamaké talatah
Pikeun mastikeun yén ngan ukur aplikasi anu dipercaya anu tiasa ngirim sareng nampi pesen ka alamat anjeun, anjeun kedah nyiptakeun pangguna dina sistem olahtalatah. Pikeun aplikasi anu dijalankeun dina klaster, klien tiasa dioténtikasi nganggo akun jasa OpenShift. The pamaké "serviceaccount" bisa dihartikeun, contona, kawas kieu:
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 pikeun ngonpigurasikeun aplikasi
Supados AMQ Online tiasa ngadamel configmap anu biasa kami embed inpormasi titik tungtung AMQP, Peran sareng RoleBinding kedah diatur:
---
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
Kumaha nerapkeun konfigurasi
Anjeun tiasa nerapkeun konfigurasi sistem olahtalatah sapertos kieu:
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
Pikeun mastikeun yén aplikasi parantos ngamimitian, mimitina, hayu urang pariksa naha alamat anu cocog parantos didamel sareng aktip:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Teras hayu urang parios URL rute aplikasi (ngan buka alamat ieu dina browser):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Browser kedah nunjukkeun yén tiket diropéa périodik nalika pesen dikirim sareng ditampi ku AMQ Online.
summing up
Sangkan nulis hiji aplikasi Quarkus anu ngagunakeun AMQP pikeun olahtalatah, ngonpigurasi aplikasi pikeun ngajalankeun on platform Red Hat OpenShift, sarta ngalaksanakeun konfigurasi na dumasar kana konfigurasi AMQ Online. Urang lajeng nyieun manifests diperlukeun pikeun initialize sistem olahtalatah pikeun aplikasi urang.
Ieu menyimpulkan runtuyan ngeunaan Quarkus, tapi aya loba hal anyar jeung metot payun, tetep katala!
sumber: www.habr.com