Γεια σε όλους! Εδώ είναι - η τελευταία μας ανάρτηση στη σειρά Quarkus! (Παρεμπιπτόντως, παρακολουθήστε το διαδικτυακό μας σεμινάριο
В
Από την έκδοση 0.17.0,
Υποτίθεται ότι έχετε ήδη αναπτύξει το AMQ Online στην πλατφόρμα OpenShift (αν όχι, τότε βλ.
Για να ξεκινήσουμε, θα δημιουργήσουμε μια εφαρμογή Quarkus που θα είναι ένα απλό σύστημα επεξεργασίας παραγγελιών χρησιμοποιώντας αντιδραστικά μηνύματα. Αυτή η εφαρμογή θα περιλαμβάνει ένα πρόγραμμα δημιουργίας παραγγελιών που στέλνει παραγγελίες σε μια ουρά μηνυμάτων σε σταθερό διάστημα, καθώς και έναν επεξεργαστή παραγγελιών που θα επεξεργάζεται μηνύματα από την ουρά και θα δημιουργεί επιβεβαιώσεις με δυνατότητα προβολής στο πρόγραμμα περιήγησης.
Μόλις δημιουργήσουμε την εφαρμογή, θα σας δείξουμε πώς να ενσωματώσετε τη διαμόρφωση του συστήματος ανταλλαγής μηνυμάτων στην εφαρμογή και να χρησιμοποιήσετε το AMQ Online για να παρέχετε τους πόρους που χρειαζόμαστε στο σύστημα.
Εφαρμογή Quarkus
Η εφαρμογή μας Quarkus τρέχει στο OpenShift και είναι μια τροποποιημένη έκδοση του προγράμματος
Γεννήτρια παραγγελιών
Η γεννήτρια απλά στέλνει μονοτονικά αναγνωριστικά αυξανόμενων παραγγελιών στη διεύθυνση "παραγγελίες" κάθε 5 δευτερόλεπτα.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Επεξεργαστής Παραγγελιών
Ο χειριστής παραγγελιών είναι ακόμα πιο απλός, απλώς επιστρέφει ένα αναγνωριστικό επιβεβαίωσης στη διεύθυνση "επιβεβαιώσεις".
@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;
}
}
Πόροι επιβεβαίωσης
Ο πόρος επιβεβαίωσης είναι ένα τελικό σημείο HTTP για την καταχώριση των επιβεβαιώσεων που δημιουργούνται από την εφαρμογή μας.
@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;
}
}
προσαρμογή
Για να συνδεθεί στο AMQ Online, η εφαρμογή μας θα χρειαστεί ορισμένα δεδομένα διαμόρφωσης, συγκεκριμένα: διαμόρφωση σύνδεσης Quarkus, πληροφορίες τελικού σημείου AMQP και διαπιστευτήρια πελάτη. Είναι, φυσικά, καλύτερο να διατηρούνται όλα τα δεδομένα διαμόρφωσης σε ένα μέρος, αλλά θα τα διαχωρίσουμε σκόπιμα για να δείξουμε τις πιθανές επιλογές για τη διαμόρφωση της εφαρμογής Quarkus.
Συνδέσεις
Η διαμόρφωση της εφαρμογής σύνδεσης μπορεί να παρέχεται κατά τη στιγμή της μεταγλώττισης χρησιμοποιώντας ένα αρχείο ιδιοτήτων εφαρμογής:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Για να παραμείνουμε απλά τα πράγματα, θα χρησιμοποιήσουμε μόνο μια ουρά μηνυμάτων για τη διεύθυνση "παραγγελίες". Και η διεύθυνση "επιβεβαιώσεις" στην εφαρμογή μας θα χρησιμοποιεί μια ουρά στη μνήμη.
Τελικό σημείο AMQP
Κατά τη στιγμή της μεταγλώττισης, το όνομα κεντρικού υπολογιστή και ο αριθμός θύρας για το τελικό σημείο AMQP είναι άγνωστα, επομένως πρέπει να εισαχθούν. Το τελικό σημείο μπορεί να οριστεί στο configmap που δημιουργείται από το AMQ Online, επομένως θα το ορίσουμε μέσω μεταβλητών περιβάλλοντος στο μανιφέστο εφαρμογής:
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
Διαπιστευτήρια
Το διακριτικό λογαριασμού υπηρεσίας μπορεί να χρησιμοποιηθεί για τον έλεγχο ταυτότητας της εφαρμογής μας στο OpenShift. Για να το κάνετε αυτό, πρέπει πρώτα να δημιουργήσετε ένα προσαρμοσμένο ConfigSource που θα διαβάζει το διακριτικό ελέγχου ταυτότητας από το σύστημα αρχείων του pod:
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);
}
}
Δημιουργία και ανάπτυξη της Εφαρμογής
Εφόσον η εφαρμογή πρέπει να μεταγλωττιστεί σε ένα εκτελέσιμο αρχείο, απαιτείται μια εικονική μηχανή GraalVM. Για λεπτομέρειες σχετικά με τον τρόπο ρύθμισης ενός περιβάλλοντος για αυτό, ανατρέξτε στις αντίστοιχες οδηγίες στο
Στη συνέχεια, ακολουθώντας τις οδηγίες που δίνονται εκεί, πρέπει να κατεβάσετε την πηγή, να δημιουργήσετε και να αναπτύξετε την εφαρμογή μας:
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
Μετά από αυτές τις εντολές, η εφαρμογή θα αναπτυχθεί, αλλά δεν θα ξεκινήσει μέχρι να διαμορφώσουμε τους πόρους ανταλλαγής μηνυμάτων που χρειαζόμαστε στο AMQ Online.
Ρύθμιση του συστήματος ανταλλαγής μηνυμάτων
Τώρα το μόνο που μένει είναι να ορίσουμε τους πόρους που χρειάζεται η εφαρμογή μας στο σύστημα ανταλλαγής μηνυμάτων. Για να το κάνετε αυτό, πρέπει να δημιουργήσετε: 1) έναν χώρο διευθύνσεων για να αρχικοποιήσετε το τελικό σημείο του συστήματος ανταλλαγής μηνυμάτων. 2) διεύθυνση για να διαμορφώσουμε τις διευθύνσεις που χρησιμοποιούμε στην εφαρμογή. 3) Αποστολή μηνυμάτων χρήστη για ορισμό διαπιστευτηρίων πελάτη.
Χώρος διευθύνσεων
Ένα αντικείμενο AddressSpace στο AMQ Online είναι μια ομάδα διευθύνσεων που μοιράζονται τελικά σημεία σύνδεσης και πολιτικές ελέγχου ταυτότητας και εξουσιοδότησης. Όταν δημιουργείτε έναν χώρο διευθύνσεων, μπορείτε να καθορίσετε πώς θα εκτίθενται τα τελικά σημεία ανταλλαγής μηνυμάτων:
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
Διεύθυνση
Οι διευθύνσεις χρησιμοποιούνται για την αποστολή και λήψη μηνυμάτων. Κάθε διεύθυνση έχει έναν τύπο, ο οποίος καθορίζει τη σημασιολογία της, καθώς και ένα σχέδιο, το οποίο καθορίζει τον αριθμό των πόρων που θα δεσμευτούν. Η διεύθυνση μπορεί να προσδιοριστεί, για παράδειγμα, ως εξής:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Χρήστης ανταλλαγής μηνυμάτων
Για να διασφαλίσετε ότι μόνο αξιόπιστες εφαρμογές μπορούν να στέλνουν και να λαμβάνουν μηνύματα στις διευθύνσεις σας, πρέπει να δημιουργήσετε έναν χρήστη στο σύστημα ανταλλαγής μηνυμάτων. Για εφαρμογές που εκτελούνται σε ένα σύμπλεγμα, οι πελάτες μπορούν να ελεγχθούν χρησιμοποιώντας έναν λογαριασμό υπηρεσίας OpenShift. Ο "λογαριασμός υπηρεσίας" χρήστη μπορεί να οριστεί, για παράδειγμα, ως εξής:
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"]
Δικαιώματα για τη διαμόρφωση της εφαρμογής
Για να δημιουργήσει το AMQ Online το configmap που χρησιμοποιήσαμε για την ενσωμάτωση των πληροφοριών τελικού σημείου AMQP, πρέπει να ορίσουμε το Role και το 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
Πώς να εφαρμόσετε διαμορφώσεις
Μπορείτε να εφαρμόσετε τη διαμόρφωση του συστήματος ανταλλαγής μηνυμάτων ως εξής:
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
Επαλήθευση εφαρμογής
Για να βεβαιωθούμε ότι η εφαρμογή έχει ξεκινήσει, ας ελέγξουμε πρώτα αν οι αντίστοιχες διευθύνσεις έχουν δημιουργηθεί και είναι ενεργές:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Στη συνέχεια, ας ελέγξουμε τη διεύθυνση URL της διαδρομής της εφαρμογής (απλώς ανοίξτε αυτήν τη διεύθυνση στο πρόγραμμα περιήγησης):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Το πρόγραμμα περιήγησης θα πρέπει να δείχνει ότι τα εισιτήρια ενημερώνονται περιοδικά καθώς αποστέλλονται και λαμβάνονται μηνύματα από το AMQ Online.
Ανακεφαλαίωση
Έτσι, γράψαμε μια εφαρμογή Quarkus που χρησιμοποιεί AMQP για ανταλλαγή μηνυμάτων, διαμορφώσαμε την εφαρμογή ώστε να εκτελείται στην πλατφόρμα Red Hat OpenShift και υλοποιήσαμε τη διαμόρφωσή της με βάση τη διαμόρφωση AMQ Online. Στη συνέχεια δημιουργήσαμε τα μανιφέστα που απαιτούνται για την προετοιμασία του συστήματος ανταλλαγής μηνυμάτων για την εφαρμογή μας.
Αυτό ολοκληρώνει τη σειρά για το Quarkus, αλλά υπάρχουν πολλά νέα και ενδιαφέροντα πράγματα μπροστά, μείνετε συντονισμένοι!
Πηγή: www.habr.com