Hej alla! HĂ€r Ă€r det â vĂ„rt sista inlĂ€gg i serien om Quarkus! (Förresten, kolla in vĂ„rt webbinarie . Vi visar hur man börjar «frĂ„n grunden» eller flyttar befintliga lösningar)

I i detta inlÀgg kommer vi att titta pÄ relevanta verktyg som kan anvÀndas för att kvantitativt utvÀrdera förbÀttringar som gjorts genom modernisering av Java-applikationer.
FrÄn och med version 0.17.0, stöder anvÀndningen av Advanced Message Queuing Protocol (), vilket Àr en öppen standard för överföring av affÀrsmeddelanden mellan applikationer eller organisationer.
Àr en tjÀnst byggd pÄ den öppna projektet och implementerar en meddelandeutbytesmekanism baserad pÄ plattformen . För mer information om hur den Àr uppbyggd, se. . Idag visar vi hur man kombinerar AMQ Online och Quarkus för att bygga ett modernt meddelandeutbyten-system pÄ OpenShift med hjÀlp av tvÄ nya teknologier relaterade till meddelandehantering.
Det förutsÀtts att du redan har implementerat AMQ Online pÄ OpenShift-plattformen (om inte, se. ).
Först kommer vi att skapa en Quarkus-applikation som kommer att vara ett enkelt system för orderhantering med reaktiv meddelandeutbyte. Denna applikation kommer att inkludera en ordergenerator som skickar bestÀllningar till meddelandekön med fast intervall, samt en orderhanterare som kommer att behandla meddelanden frÄn kön och skapa bekrÀftelser som Àr tillgÀngliga för visning i webblÀsaren.
Efter att applikationen har skapats kommer vi att visa hur man implementerar meddelandeutbyteskonfigurationen och anvÀnder AMQ Online för att initiera de resurser vi behöver pÄ detta system.
Quarkus-applikationen
VÄr Quarkus-applikation körs pÄ OpenShift och Àr en modifierad version av programmet . Ett komplett exempel pÄ klientsidan kan hittas .
Ordergeneratorn
Generatorn skickar varor med vÀxande order-ID var femte sekund till adressen 'orders'.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Orderhanteraren
Orderhanteraren Àr Ànnu enklare; den returnerar bara bekrÀftelse-ID:t till adressen 'confirmations'.
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Bekräftelse-ID är dubbelt så stort som order-ID <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
return order * 2;
}
}
BekrÀftelseresurser
BekrÀftelsepunkten Àr en HTTP-slutpunkt för att lista de bekrÀftelser som genereras av vÄr applikation.
@Path("/confirmations")
public class ConfirmationResource {
@Inject
@Stream("confirmations") Publisher orders;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
@GET
@Path("/stream")
@Produces(MediaType.SERVER_SENT_EVENTS)
public Publisher stream() {
return orders;
}
}
InstÀllning
För att ansluta till AMQ Online behöver vÄr applikation viss konfigurationsdata, nÀmligen: konfiguration av Quarkus-anslutning, information om AMQP-slutpunkten och klientcredentialer. Det Àr bÀst att hÄlla all konfigurationsdata pÄ ett stÀlle, men vi kommer avsiktligt att dela upp dem för att visa möjliga alternativ för att konfigurera Quarkus-applikationen.
Anslutningar
Konfigurationen av anslutningen kan ges vid kompileringstiden med hjÀlp av en applikationsegenskaper fil:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
För att underlÀtta kommer vi att anvÀnda en meddelandekö endast för adressen "orders". Adressen "confirmations" i vÄr applikation kommer att anvÀnda en minneskö.
AMQP Slutpunkt
Vid kompilering Àr vÀrdnamnet och portnumret för AMQP-slutpunkten okÀnda, sÄ de mÄste injiceras. Slutpunkten kan definieras i en configmap som skapas av AMQ Online, sÄ vi kommer att definiera dem genom miljövariabler i applikationens manifest:
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
Credentialer
En tjÀnstkonto-token kan anvÀndas för att autentisera vÄr applikation i OpenShift. För detta mÄste vi först skapa en anpassad ConfigSource som lÀser autentiseringstoken frÄn podden filsystem:
public class MessagingCredentialsConfigSource implements ConfigSource {
private static final Set propertyNames;
static {
propertyNames = new HashSet();
propertyNames.add("amqp-username");
propertyNames.add("amqp-password");
}
@Override
public Set getPropertyNames() {
return propertyNames;
}
@Override
public Map getProperties() {
try {
Map 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);
}
}
Byggande och distribution av applikationen
Eftersom applikationen mÄste kompileras till en körbar fil, behövs en virtuell maskin av GraalVM. För mer information om hur du konfigurerar miljön för detta, se relevanta instruktioner i .
Följ sedan instruktionerna dÀr för att ladda ner kÀllkoden, bygga och distribuera vÄr applikation:
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
Efter dessa kommandon kommer applikationen att vara distribuerad, men den kommer inte att starta förrÀn vi har konfigurerat de nödvÀndiga resurserna för meddelandehantering i AMQ Online.
Konfiguration av meddelandesystem
Nu ÄterstÄr det att specificera de resurser som vÄrt applikation behöver i meddelandesystemet. För detta mÄste du skapa: 1) ett adressutrymme för att initiera en slutpunkt för meddelandesystemet; 2) en adress för att konfigurera adresserna vi anvÀnder i applikationen; 3) en anvÀndare för meddelandesystemet för att ange klientens autentiseringsuppgifter.
Adressutrymme
Objektet AddressSpace i AMQ Online Àr en grupp adresser som gemensamt anvÀnder slutpunkterna för anslutning samt autentiserings- och auktoriseringspolicyer. NÀr du skapar ett adressutrymme kan du specificera hur slutpunkterna för meddelandesystemet kommer att tillhandahÄllas:
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
Adresser
Adresser anvÀnds för att skicka och ta emot meddelanden. Varje adress har en typ som definierar dess betydelse samt en plan som anger mÀngden reserverade resurser. En adress kan definieras sÄ hÀr:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
AnvÀndare i meddelandesystemet
För att endast betrodda applikationer ska kunna skicka och ta emot meddelanden pÄ dina adresser, mÄste en anvÀndare skapas i meddelandesystemet. För applikationer som körs pÄ klustret kan kunder autentiseras med hjÀlp av ett OpenShift-tjÀnstekonto. AnvÀndaren "serviceaccount" kan definieras sÄ hÀr:
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"]
Behörigheter för att konfigurera applikationen
För att AMQ Online ska kunna skapa en configmap, som vi anvÀnde för att införa uppgifter om AMQP-endpunkten, mÄste en roll och en rollbindning (Role och RoleBinding) definieras:
---
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
Hur man tillÀmpar konfigurationer
Konfigurationen av meddelandesystemet kan tillÀmpas sÄ hÀr:
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
Verifiering av applikationen
För att sÀkerstÀlla att applikationen har startat, lÄt oss först kontrollera om respektive adresser har skapats och Àr aktiva:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Inte redo Àn"; sleep 5; done
DÀrefter kontrollerar vi URL:en för applikationens rutt (vi öppnar helt enkelt denna adress i webblÀsaren):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
I webblÀsaren ska man kunna se att biljetterna uppdateras regelbundet i takt med att meddelanden skickas och tas emot av AMQ Online.
Sammanfattning
SÄ, vi har skrivit en Quarkus-applikation som anvÀnder AMQP för meddelandeutbyte, stÀllt in denna applikation för att fungera pÄ Red Hat OpenShift-plattformen, samt implementerat dess konfiguration baserat pÄ AMQ Online-konfigurationen. Vi har sedan skapat de manifest som behövs för att initiera meddelandesystemet för vÄr applikation.
Med detta avslutar vi serien om Quarkus, men det ligger mycket nytt och intressant framför oss, stanna kvar med oss!
KĂ€lla: habr.com
