Cloud-native μηνύματα στην πλατφόρμα Red Hat OpenShift χρησιμοποιώντας Quarkus και AMQ Online

Γεια σε όλους! Εδώ είναι - η τελευταία μας ανάρτηση στη σειρά Quarkus! (Παρεμπιπτόντως, παρακολουθήστε το διαδικτυακό μας σεμινάριο "Αυτό είναι το εγγενές πλαίσιο Java Quarkus – Kubernetes". Θα σας δείξουμε πώς να ξεκινήσετε από το μηδέν ή να μεταφέρετε έτοιμες λύσεις)

Cloud-native μηνύματα στην πλατφόρμα Red Hat OpenShift χρησιμοποιώντας Quarkus και AMQ Online

В προηγούμενος Σε αυτήν την ανάρτηση, εξετάσαμε τα σχετικά εργαλεία που μπορούν να χρησιμοποιηθούν για την ποσοτικοποίηση των βελτιώσεων που επιτυγχάνονται ως αποτέλεσμα του εκσυγχρονισμού των εφαρμογών Java.

Από την έκδοση 0.17.0, Κουάρκος υποστηρίζει τη χρήση του Advanced Message Queuing Protocol (AMQP), το οποίο είναι ένα ανοιχτό πρότυπο για τη μεταφορά επιχειρηματικών μηνυμάτων μεταξύ εφαρμογών ή οργανισμών.

Red Hat AMQ Online είναι μια υπηρεσία που βασίζεται σε έργο ανοιχτού κώδικα EnMasse και την εφαρμογή ενός μηχανισμού ανταλλαγής μηνυμάτων που βασίζεται σε πλατφόρμα Red Hat OpenShift. Για περισσότερες λεπτομέρειες σχετικά με το πώς λειτουργεί, βλ εδώ (EN). Σήμερα θα σας δείξουμε πώς να συνδυάσετε το AMQ Online και το Quarkus για να δημιουργήσετε ένα σύγχρονο σύστημα ανταλλαγής μηνυμάτων που βασίζεται στο OpenShift χρησιμοποιώντας δύο νέες τεχνολογίες ανταλλαγής μηνυμάτων.

Υποτίθεται ότι έχετε ήδη αναπτύξει το AMQ Online στην πλατφόρμα OpenShift (αν όχι, τότε βλ. οδηγός εγκατάστασης).

Για να ξεκινήσουμε, θα δημιουργήσουμε μια εφαρμογή Quarkus που θα είναι ένα απλό σύστημα επεξεργασίας παραγγελιών χρησιμοποιώντας αντιδραστικά μηνύματα. Αυτή η εφαρμογή θα περιλαμβάνει ένα πρόγραμμα δημιουργίας παραγγελιών που στέλνει παραγγελίες σε μια ουρά μηνυμάτων σε σταθερό διάστημα, καθώς και έναν επεξεργαστή παραγγελιών που θα επεξεργάζεται μηνύματα από την ουρά και θα δημιουργεί επιβεβαιώσεις με δυνατότητα προβολής στο πρόγραμμα περιήγησης.

Μόλις δημιουργήσουμε την εφαρμογή, θα σας δείξουμε πώς να ενσωματώσετε τη διαμόρφωση του συστήματος ανταλλαγής μηνυμάτων στην εφαρμογή και να χρησιμοποιήσετε το AMQ Online για να παρέχετε τους πόρους που χρειαζόμαστε στο σύστημα.

Εφαρμογή Quarkus

Η εφαρμογή μας Quarkus τρέχει στο OpenShift και είναι μια τροποποιημένη έκδοση του προγράμματος amqp-γρήγορη εκκίνηση. Μπορείτε να βρείτε ένα πλήρες παράδειγμα της πλευράς του πελάτη εδώ.

Γεννήτρια παραγγελιών

Η γεννήτρια απλά στέλνει μονοτονικά αναγνωριστικά αυξανόμενων παραγγελιών στη διεύθυνση "παραγγελίες" κάθε 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. Για λεπτομέρειες σχετικά με τον τρόπο ρύθμισης ενός περιβάλλοντος για αυτό, ανατρέξτε στις αντίστοιχες οδηγίες στο Οδηγός Quarkus.

Στη συνέχεια, ακολουθώντας τις οδηγίες που δίνονται εκεί, πρέπει να κατεβάσετε την πηγή, να δημιουργήσετε και να αναπτύξετε την εφαρμογή μας:

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

Προσθέστε ένα σχόλιο