Hei kaikki! Tässä se on - viimeinen postauksemme Quarkus-sarjassa! (Katso muuten webinaarimme
В
Versiosta 0.17.0 lähtien,
Oletetaan, että olet jo ottanut AMQ Onlinen käyttöön OpenShift-alustalla (jos ei, katso
Aluksi luomme Quarkus-sovelluksen, joka on yksinkertainen tilausten käsittelyjärjestelmä, joka käyttää reaktiivista viestintää. Tämä sovellus sisältää tilausgeneraattorin, joka lähettää tilaukset sanomajonoon tietyin väliajoin, sekä tilausprosessorin, joka käsittelee jonosta tulevat viestit ja luo selaimessa näkyvät vahvistukset.
Kun olemme luoneet sovelluksen, näytämme sinulle, kuinka voit upottaa viestintäjärjestelmän kokoonpanon sovellukseen ja käyttää AMQ Onlinea tarvittavien resurssien tarjoamiseen järjestelmässä.
Quarkus sovellus
Quarkus-sovelluksemme toimii OpenShiftillä ja on ohjelman muokattu versio
Tilausgeneraattori
Generaattori yksinkertaisesti lähettää monotonisesti kasvavat tilaustunnukset "tilaus"-osoitteeseen 5 sekunnin välein.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Tilausten käsittelijä
Tilausten käsittelijä on vielä yksinkertaisempi, se palauttaa vain vahvistustunnuksen "vahvistus"-osoitteeseen.
@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;
}
}
Vahvistusresurssit
Vahvistusresurssi on HTTP-päätepiste sovelluksemme luomien vahvistusten luetteloimiseksi.
@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;
}
}
säätö
Yhteyden muodostamiseksi AMQ Onlineen sovelluksemme tarvitsee joitain määritystietoja, nimittäin: Quarkus-liittimen kokoonpano, AMQP-päätepistetiedot ja asiakkaan tunnistetiedot. On tietysti parempi säilyttää kaikki konfigurointitiedot yhdessä paikassa, mutta erottelemme ne tarkoituksella näyttääksemme mahdolliset Quarkus-sovelluksen konfigurointivaihtoehdot.
Liittimet
Liittimen määritykset voidaan antaa käännösvaiheessa käyttämällä sovelluksen ominaisuustiedostoa:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Yksinkertaisuuden vuoksi käytämme vain viestijonoa "tilaus"-osoitteelle. Ja "vahvistus"-osoite sovelluksessamme käyttää jonoa muistissa.
AMQP-päätepiste
Käännöshetkellä AMQP-päätepisteen isäntänimi ja portin numero ovat tuntemattomia, joten ne on lisättävä. Päätepiste voidaan asettaa AMQ Onlinen luomassa konfiguraatiokartassa, joten määritämme ne ympäristömuuttujien kautta sovellusluettelossa:
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
Valtuustiedot
Palvelutilitunnusta voidaan käyttää sovelluksemme todentamiseen OpenShiftille. Tätä varten sinun on ensin luotava mukautettu ConfigSource, joka lukee todennustunnuksen podin tiedostojärjestelmästä:
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);
}
}
Rakenna ja ota sovellus käyttöön
Koska sovellus on käännettävä suoritettavaksi tiedostoksi, tarvitaan GraalVM-virtuaalikone. Katso lisätietoja ympäristön määrittämisestä tätä varten vastaavista ohjeista
Sitten sinun on ladattava lähde, laadittava ja otettava käyttöön sovelluksemme noudattamalla siellä annettuja ohjeita:
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
Näiden komentojen jälkeen sovellus otetaan käyttöön, mutta se ei käynnisty ennen kuin määritämme tarvitsemamme viestiresurssit AMQ Onlinessa.
Viestijärjestelmän määrittäminen
Nyt on enää jäljellä sovelluksemme tarvitsemien resurssien asettaminen viestintäjärjestelmään. Tätä varten sinun on luotava: 1) osoiteavaruus viestinvälitysjärjestelmän päätepisteen alustamiseksi; 2) osoite sovelluksessa käyttämiemme osoitteiden määrittämiseksi; 3) Viestintäkäyttäjä asettaa asiakkaan tunnistetiedot.
Osoitetila
AMQ Onlinen AddressSpace-objekti on ryhmä osoitteita, jotka jakavat yhteyden päätepisteet sekä todennus- ja valtuutuskäytännöt. Kun luot osoiteavaruuden, voit määrittää, kuinka viestien päätepisteet paljastetaan:
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
osoite
Osoitteita käytetään viestien lähettämiseen ja vastaanottamiseen. Jokaisella osoitteella on tyyppi, joka määrittää sen semantiikan, sekä suunnitelma, joka määrittää varattavien resurssien määrän. Osoite voidaan määrittää esimerkiksi näin:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Viestintäkäyttäjä
Varmistaaksesi, että vain luotetut sovellukset voivat lähettää ja vastaanottaa viestejä osoitteisiin, sinun on luotava käyttäjä viestijärjestelmään. Klusterissa toimivien sovellusten asiakkaat voidaan todentaa OpenShift-palvelutilin avulla. Käyttäjä "palvelutili" voidaan määritellä esimerkiksi näin:
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"]
Sovelluksen määritysoikeudet
Jotta AMQ Online voi luoda konfiguraatiokartan, jota käytimme AMQP-päätepistetietojen upottamiseen, Role ja RoleBinding on asetettava:
---
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
Kuinka konfiguraatioita käytetään
Voit käyttää viestintäjärjestelmän kokoonpanoa seuraavasti:
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
Sovelluksen vahvistus
Varmistaaksesi, että sovellus on käynnistynyt, tarkista ensin, onko vastaavat osoitteet luotu ja aktiivisia:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Tarkastetaan sitten sovelluksen reitin URL-osoite (avaa tämä osoite selaimessa):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Selaimen tulee näyttää, että lippuja päivitetään säännöllisesti, kun AMQ Online lähettää ja vastaanottaa viestejä.
Yhteenvetona
Joten kirjoitimme Quarkus-sovelluksen, joka käyttää AMQP:tä viestintään, määritimme sovelluksen toimimaan Red Hat OpenShift -alustalla ja toteutimme sen konfiguroinnin AMQ Online -kokoonpanon perusteella. Loimme sitten luettelot, joita tarvitaan sovelluksemme viestintäjärjestelmän alustamiseen.
Tähän päättyy Quarkusta käsittelevä sarja, mutta paljon uutta ja mielenkiintoista on luvassa, pysy kuulolla!
Lähde: will.com