Quarkus болон AMQ Online-г ашиглан Red Hat OpenShift платформ дээрх үүлэн мессеж

Сайн уу! Энд байна - Quarkus цувралын бидний сүүлчийн нийтлэл! (Дашрамд хэлэхэд манай вебинарыг үзээрэй "Энэ бол Quarkus - Kubernetes-ийн эх Java хүрээ". Бид танд хэрхэн эхнээс нь эхлэх эсвэл бэлэн шийдлүүдийг шилжүүлэхийг харуулах болно)

Quarkus болон AMQ Online-г ашиглан Red Hat OpenShift платформ дээрх үүлэн мессеж

В өмнөх Энэ нийтлэлд бид Java програмуудыг шинэчилсний үр дүнд олж авсан сайжруулалтыг тооцоолоход ашиглаж болох холбогдох хэрэгслүүдийг авч үзсэн.

0.17.0 хувилбараас хойш, Кваркус Нарийвчилсан Message Queuing Protocol-ийн хэрэглээг дэмждэг (AMQP), энэ нь програмууд эсвэл байгууллагуудын хооронд бизнесийн мессеж дамжуулах нээлттэй стандарт юм.

Red Hat AMQ Онлайн нээлттэй эхийн төслийн үндсэн дээр бүтээгдсэн үйлчилгээ юм EnMasse платформд суурилсан мессежийн механизмыг хэрэгжүүлэх RedHat OpenShift. Энэ нь хэрхэн ажилладаг талаар дэлгэрэнгүй мэдээллийг үзнэ үү энд (EN). Өнөөдөр бид танд AMQ Online болон Quarkus-ийг хэрхэн нэгтгэж, хоёр шинэ мессежийн технологи ашиглан орчин үеийн OpenShift-д суурилсан мессежийн системийг бүтээхийг харуулах болно.

Та OpenShift платформ дээр AMQ Online-г аль хэдийн суулгасан гэж үзэж байна (хэрэв байхгүй бол үзнэ үү. суулгах гарын авлага).

Эхлэхийн тулд бид реактив мессеж ашиглан энгийн захиалга боловсруулах систем болох Quarkus програмыг бий болгоно. Энэ аппликейшн нь захиасын дараалалд захиалгыг тогтмол хугацаанд илгээдэг захиалга үүсгэгч, мөн дарааллаас ирсэн мессежийг боловсруулж, хөтөч дээр харах боломжтой баталгаажуулалтыг үүсгэх захиалгын процессорыг багтаах болно.

Бид аппликешныг үүсгэсний дараа мессежийн системийн тохиргоог програмд ​​хэрхэн оруулах, AMQ Online-г ашиглан системд хэрэгтэй нөөцөө хэрхэн бүрдүүлэхийг харуулах болно.

Quarkus програм

Манай Quarkus програм нь OpenShift дээр ажилладаг бөгөөд програмын өөрчлөгдсөн хувилбар юм amqp-хурдан эхлүүлэх. Үйлчлүүлэгч талын бүрэн жишээг олж болно энд.

Захиалга үүсгэгч

Генератор нь 5 секунд тутамд өсөн нэмэгдэж буй захиалгын ID-г "захиалга" хаяг руу илгээдэг.

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable<Integer> generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

Захиалгын процессор

Захиалга зохицуулагч нь бүр ч энгийн бөгөөд энэ нь баталгаажуулах ID-г "баталгаажуулалт" хаяг руу буцаадаг.

@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 төгсгөлийн цэгийн хостын нэр болон портын дугаар тодорхойгүй тул тэдгээрийг оруулах шаардлагатай. Төгсгөлийн цэгийг 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 руу баталгаажуулахад ашиглаж болно. Үүнийг хийхийн тулд та эхлээд pod-ийн файлын системээс таних тэмдгийг унших тусгай ConfigSource үүсгэх ёстой.

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) Үйлчлүүлэгчийн итгэмжлэлийг тохируулахын тулд мессеж илгээх хэрэглэгч.

Хаягийн зай

AMQ Online дахь AddressSpace объект нь холболтын төгсгөлийн цэгүүд болон баталгаажуулалт, зөвшөөрлийн бодлогыг хуваалцдаг хаягуудын бүлэг юм. Та хаягийн орон зай үүсгэх үед мессежийн төгсгөлийн цэгүүд хэрхэн ил гарахыг зааж өгч болно:

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-д бидний 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-аас мессеж илгээж, хүлээн авах үед тасалбарууд үе үе шинэчлэгдэж байгааг харуулах ёстой.

Дуусгах

Тиймээс бид мессеж бичихдээ AMQP ашигладаг Quarkus программ бичиж, Red Hat OpenShift платформ дээр ажиллахаар тохируулж, AMQ Online тохиргоонд тулгуурлан тохиргоог нь хэрэгжүүлсэн. Дараа нь бид програмынхаа мессежийн системийг эхлүүлэхэд шаардлагатай манифестуудыг үүсгэсэн.

Үүгээр Кваркусын тухай цуврал дуусч байгаа ч өмнө нь маш олон шинэ, сонирхолтой зүйлс хүлээж байгаа тул бидэнтэй хамт байгаарай!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх