Ahojte všetci! Tu je - náš posledný príspevok v sérii Quarkus! (Mimochodom, sledujte náš webinár
В
Od verzie 0.17.0,
Predpokladá sa, že ste už AMQ Online nasadili na platformu OpenShift (ak nie, pozri
Na začiatok vytvoríme aplikáciu Quarkus, ktorá bude jednoduchým systémom spracovania objednávok pomocou reaktívnych správ. Táto aplikácia bude obsahovať generátor objednávok, ktorý odosiela objednávky do frontu správ v pevnom intervale, ako aj procesor objednávok, ktorý bude spracovávať správy z frontu a generovať potvrdenia viditeľné v prehliadači.
Po vytvorení aplikácie vám ukážeme, ako vložiť konfiguráciu systému zasielania správ do aplikácie a použiť AMQ Online na poskytovanie zdrojov, ktoré potrebujeme v systéme.
Aplikácia Quarkus
Naša aplikácia Quarkus beží na OpenShift a je upravenou verziou programu
Generátor objednávok
Generátor jednoducho monotónne posiela narastajúce ID objednávok na adresu „objednávky“ každých 5 sekúnd.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Spracovateľ objednávok
Spracovateľ objednávky je ešte jednoduchší, len vráti potvrdzovacie ID na adresu „potvrdenia“.
@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;
}
}
Zdroje potvrdenia
Zdroj potvrdenia je koncový bod HTTP na zoznam potvrdení generovaných našou aplikáciou.
@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;
}
}
nastavenie
Na pripojenie k AMQ Online bude naša aplikácia potrebovať niektoré konfiguračné údaje, konkrétne: konfiguráciu konektora Quarkus, informácie o koncovom bode AMQP a prihlasovacie údaje klienta. Všetky konfiguračné údaje je samozrejme lepšie uchovávať na jednom mieste, no zámerne ich oddelíme, aby sme ukázali možné možnosti konfigurácie aplikácie Quarkus.
Konektory
Konfigurácia konektora môže byť poskytnutá v čase kompilácie pomocou súboru vlastností aplikácie:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Aby sme to zjednodušili, pre adresu „objednávky“ použijeme iba front správ. A adresa „potvrdenia“ v našej aplikácii bude používať front v pamäti.
Koncový bod AMQP
V čase kompilácie sú názov hostiteľa a číslo portu pre koncový bod AMQP neznáme, takže musia byť vložené. Koncový bod je možné nastaviť v konfiguračnej mape, ktorá je vytvorená AMQ Online, takže ich zadefinujeme prostredníctvom premenných prostredia v manifeste aplikácie:
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
poverenia
Token účtu služby možno použiť na overenie našej aplikácie v OpenShift. Ak to chcete urobiť, musíte najprv vytvoriť vlastný zdroj ConfigSource, ktorý načíta autentifikačný token zo systému súborov modulu:
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);
}
}
Zostavte a nasaďte aplikáciu
Keďže aplikácia musí byť skompilovaná do spustiteľného súboru, je potrebný virtuálny stroj GraalVM. Podrobnosti o tom, ako na to nastaviť prostredie, nájdete v príslušných pokynoch v
Potom si podľa uvedených pokynov musíte stiahnuť zdroj, zostaviť a nasadiť našu aplikáciu:
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
Po týchto príkazoch bude aplikácia nasadená, ale nespustí sa, kým nenakonfigurujeme zdroje správ, ktoré potrebujeme v AMQ Online.
Nastavenie systému správ
Teraz už zostáva len nastaviť zdroje, ktoré naša aplikácia potrebuje v systéme správ. Aby ste to dosiahli, musíte vytvoriť: 1) adresný priestor na inicializáciu koncového bodu systému zasielania správ; 2) adresa na konfiguráciu adries, ktoré používame v aplikácii; 3) Používateľovi odosielania správ na nastavenie prihlasovacích údajov klienta.
Adresný priestor
Objekt AddressSpace v AMQ Online je skupina adries, ktoré zdieľajú koncové body pripojenia a politiky autentifikácie a autorizácie. Keď vytvoríte priestor adries, môžete určiť, ako budú vystavené koncové body správ:
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
adresa
Adresy sa používajú na odosielanie a prijímanie správ. Každá adresa má svoj typ, ktorý určuje jej sémantiku, ako aj plán, ktorý určuje počet zdrojov, ktoré sa majú rezervovať. Adresu je možné určiť napríklad takto:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Používateľ správ
Ak chcete zabezpečiť, aby správy na vaše adresy mohli odosielať a prijímať iba dôveryhodné aplikácie, musíte v systéme správ vytvoriť používateľa. Pre aplikácie bežiace na klastri je možné klientov autentifikovať pomocou konta služby OpenShift. Užívateľský "serviceaccount" môže byť definovaný napríklad takto:
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"]
Povolenia pre nastavenia aplikácie
Aby AMQ Online vytvoril konfiguračnú mapu, ktorú sme použili na vloženie informácií o koncovom bode AMQP, musia byť nastavené Role a RoleBinding:
---
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
Ako aplikovať konfigurácie
Konfiguráciu systému správ môžete použiť takto:
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
Overenie aplikácie
Aby ste sa uistili, že sa aplikácia spustila, najskôr skontrolujte, či boli vytvorené a aktívne zodpovedajúce adresy:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Potom skontrolujeme adresu URL trasy aplikácie (stačí otvoriť túto adresu v prehliadači):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Prehliadač by mal ukazovať, že lístky sa pravidelne aktualizujú pri odosielaní a prijímaní správ službou AMQ Online.
Sčítanie
Napísali sme teda aplikáciu Quarkus, ktorá používa AMQP na odosielanie správ, nakonfigurovali sme aplikáciu na spustenie na platforme Red Hat OpenShift a implementovali jej konfiguráciu založenú na konfigurácii AMQ Online. Potom sme vytvorili manifesty potrebné na inicializáciu systému správ pre našu aplikáciu.
Týmto sa séria o Quarkusovi uzatvára, no čaká nás ešte veľa nových a zaujímavých vecí, zostaňte naladení!
Zdroj: hab.com