Hamıya salam! Budur - Quarkus seriyasındakı son yazımız! (Yeri gəlmişkən, vebinarımızı izləyin
В
0.17.0 versiyasından bəri,
Güman edilir ki, siz artıq AMQ Online-ı OpenShift platformasında yerləşdirmisiniz (əgər deyilsə, onda baxın
Başlamaq üçün, reaktiv mesajlaşmadan istifadə edərək sadə sifariş emal sistemi olacaq Quarkus tətbiqi yaradacağıq. Bu proqrama müəyyən intervalda mesaj növbəsinə sifarişlər göndərən sifariş generatoru, həmçinin növbədən gələn mesajları emal edəcək və brauzerdə görünə bilən təsdiqlər yaradan sifariş prosessoru daxil olacaq.
Tətbiqi yaratdıqdan sonra biz sizə mesajlaşma sistemi konfiqurasiyasını proqrama necə yerləşdirməyi və sistemdə ehtiyac duyduğumuz resursları təmin etmək üçün AMQ Online-dan istifadə etməyi göstərəcəyik.
Quarkus proqramı
Quarkus proqramımız OpenShift-də işləyir və proqramın dəyişdirilmiş versiyasıdır
Generator sifariş edin
Generator sadəcə olaraq hər 5 saniyədən bir monoton şəkildə artan sifariş identifikatorlarını “sifarişlər” ünvanına göndərir.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Sifariş prosessoru
Sifariş işləyicisi daha sadədir, o, sadəcə olaraq "təsdiqlər" ünvanına təsdiq identifikatorunu qaytarır.
@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;
}
}
Təsdiq Resursları
Təsdiq resursu tətbiqimiz tərəfindən yaradılan təsdiqlərin siyahısı üçün HTTP son nöqtəsidir.
@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;
}
}
nizamlama
AMQ Online-a qoşulmaq üçün proqramımız bəzi konfiqurasiya məlumatlarına ehtiyac duyacaq, yəni: Quarkus birləşdiricisinin konfiqurasiyası, AMQP son nöqtəsi məlumatı və müştəri etimadnaməsi. Əlbəttə ki, bütün konfiqurasiya məlumatlarını bir yerdə saxlamaq daha yaxşıdır, lakin Quarkus tətbiqini konfiqurasiya etmək üçün mümkün variantları göstərmək üçün onları qəsdən ayıracağıq.
Bağlayıcılar
Konnektor konfiqurasiyası tərtib zamanı proqram xüsusiyyətləri faylından istifadə etməklə təmin edilə bilər:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Hər şeyi sadə saxlamaq üçün biz yalnız "sifarişlər" ünvanı üçün mesaj növbəsindən istifadə edəcəyik. Tətbiqimizdəki "təsdiqlər" ünvanı yaddaşdakı növbədən istifadə edəcəkdir.
AMQP son nöqtəsi
Kompilyasiya zamanı AMQP son nöqtəsi üçün host adı və port nömrəsi bilinmir, ona görə də onlar daxil edilməlidir. Son nöqtə AMQ Online tərəfindən yaradılan konfiqurasiya xəritəsində təyin oluna bilər, ona görə də biz onları tətbiq manifestindəki mühit dəyişənləri vasitəsilə müəyyən edəcəyik:
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
Etimadnamələr
Xidmət hesabı nişanı tətbiqimizi OpenShift-ə autentifikasiya etmək üçün istifadə edilə bilər. Bunu etmək üçün əvvəlcə podun fayl sistemindən autentifikasiya işarəsini oxuyacaq fərdi ConfigSource yaratmalısınız:
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);
}
}
Tətbiqi qurun və yerləşdirin
Tətbiq icra edilə bilən faylda tərtib edilməli olduğundan, GraalVM virtual maşını tələb olunur. Bunun üçün mühitin necə qurulacağına dair təfərrüatlar üçün müvafiq təlimatlara baxın
Sonra, orada verilmiş təlimatlara əməl edərək, mənbəni yükləməli, tətbiqimizi qurmalı və yerləşdirməlisiniz:
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
Bu əmrlərdən sonra proqram yerləşdiriləcək, lakin biz AMQ Online-da bizə lazım olan mesajlaşma resurslarını konfiqurasiya edənə qədər başlamayacaq.
Mesajlaşma sisteminin qurulması
İndi yalnız mesajlaşma sistemində tətbiqimizin ehtiyac duyduğu resursları təyin etmək qalır. Bunun üçün aşağıdakıları yaratmalısınız: 1) mesajlaşma sisteminin son nöqtəsini işə salmaq üçün ünvan sahəsi; 2) tətbiqdə istifadə etdiyimiz ünvanları konfiqurasiya etmək üçün ünvan; 3) Müştəri etimadnaməsini təyin etmək üçün mesajlaşma istifadəçisi.
Ünvan sahəsi
AMQ Online-da AddressSpace obyekti əlaqənin son nöqtələrini, autentifikasiya və avtorizasiya siyasətlərini paylaşan ünvanlar qrupudur. Ünvan sahəsi yaratdığınız zaman mesajlaşma son nöqtələrinin necə ifşa ediləcəyini təyin edə bilərsiniz:
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
Ünvanlar
Ünvanlar mesaj göndərmək və qəbul etmək üçün istifadə olunur. Hər bir ünvanın semantikasını təyin edən bir növü, eləcə də rezerv ediləcək resursların sayını təyin edən planı var. Ünvan, məsələn, belə müəyyən edilə bilər:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Mesajlaşma istifadəçisi
Yalnız etibarlı proqramların ünvanlarınıza mesaj göndərə və qəbul edə bilməsini təmin etmək üçün mesajlaşma sistemində istifadəçi yaratmalısınız. Klasterdə işləyən proqramlar üçün müştərilər OpenShift xidmət hesabından istifadə edərək autentifikasiya oluna bilər. İstifadəçi "xidmət hesabı" müəyyən edilə bilər, məsələn, bu kimi:
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"]
Tətbiqi konfiqurasiya etmək üçün icazələr
AMQ Online-ın AMQP son nöqtə məlumatını daxil etmək üçün istifadə etdiyimiz konfiqurasiya xəritəsini yaratması üçün Rol və Rol Bağlama müəyyən edilməlidir:
---
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
Konfiqurasiyaları necə tətbiq etmək olar
Mesajlaşma sistemi konfiqurasiyasını aşağıdakı kimi tətbiq edə bilərsiniz:
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
Tətbiqin yoxlanılması
Tətbiqin başladığına əmin olmaq üçün, ilk növbədə, müvafiq ünvanların yaradılıb-yaradılmadığını və aktiv olub olmadığını yoxlayaq:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Sonra tətbiq marşrutunun URL-sini yoxlayaq (yalnız bu ünvanı brauzerdə açın):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Brauzer AMQ Online tərəfindən mesajların göndərilməsi və qəbulu zamanı biletlərin vaxtaşırı yeniləndiyini göstərməlidir.
Yekunlaşdıraraq
Beləliklə, biz mesajlaşma üçün AMQP istifadə edən Quarkus tətbiqi yazdıq, tətbiqi Red Hat OpenShift platformasında işləmək üçün konfiqurasiya etdik və AMQ Online konfiqurasiyası əsasında onun konfiqurasiyasını həyata keçirdik. Daha sonra tətbiqimiz üçün mesajlaşma sistemini işə salmaq üçün lazım olan manifestləri yaratdıq.
Bununla Quarkus haqqında serial yekunlaşır, lakin qarşıda çoxlu yeni və maraqlı şeylər var, bizi izləyin!
Mənbə: www.habr.com