Quarkus ۽ AMQ آن لائن استعمال ڪندي Red Hat OpenShift پليٽ فارم تي ڪلائوڊ تي ٻڌل پيغام

هيلو سڀ! هتي اهو آهي - Quarkus سيريز ۾ اسان جي آخري پوسٽ! (رستي سان، اسان جو ويبينار ڏسو "هي ڪوارڪس آهي - ڪبرنيٽس جو اصل جاوا فريم ورڪ". اسان توهان کي ڏيکارينداسين ته ڪيئن شروع کان شروع ڪجي يا تيار ٿيل حلن کي منتقل ڪيو وڃي)

Quarkus ۽ AMQ آن لائن استعمال ڪندي Red Hat OpenShift پليٽ فارم تي ڪلائوڊ تي ٻڌل پيغام

В پويون هن پوسٽ ۾، اسان لاڳاپيل اوزارن تي غور ڪيو جيڪي جاوا ايپليڪيشنن کي جديد ڪرڻ جي نتيجي ۾ حاصل ڪيل سڌارن کي مقدار ڏيڻ لاء استعمال ڪري سگھجن ٿيون.

نسخو 0.17.0 کان وٺي، ڪرڪشس Advanced Message Queuing Protocol (ايم پي پي)، جيڪو ايپليڪيشنن يا تنظيمن جي وچ ۾ ڪاروباري پيغامن جي منتقلي لاء هڪ کليل معيار آهي.

Red Hat AMQ آن لائن هڪ خدمت آهي جيڪا هڪ اوپن سورس پروجيڪٽ جي بنياد تي ٺاهي وئي آهي اين ماس ۽ پليٽ فارم تي ٻڌل ميسيجنگ ميڪانيزم کي لاڳو ڪرڻ ڳاڙھو Hat OpenShift. وڌيڪ تفصيل لاءِ ته اهو ڪيئن ڪم ڪري ٿو، ڏسو هتي (EN). اڄ اسين توهان کي ڏيکارينداسين ته ڪيئن AMQ آن لائن ۽ Quarkus کي گڏ ڪري هڪ جديد OpenShift-based Messaging System ٺاهڻ لاءِ ٻه نيون ميسيجنگ ٽيڪنالاجي استعمال ڪندي.

اهو فرض ڪيو ويو آهي ته توهان اڳ ۾ ئي AMQ آن لائين OpenShift پليٽ فارم تي مقرر ڪيو آهي (جيڪڏهن نه، پوء ڏسو انسٽاليشن ھدايت).

شروع ڪرڻ لاءِ، اسان هڪ Quarkus ايپليڪيشن ٺاهينداسين جيڪا هڪ سادي آرڊر پروسيسنگ سسٽم هوندي جيڪا رد عمل واري پيغام کي استعمال ڪندي. هن ايپليڪيشن ۾ هڪ آرڊر جنريٽر شامل هوندو جيڪو هڪ مقرر وقفي تي پيغام جي قطار ڏانهن آرڊر موڪلي ٿو، انهي سان گڏ هڪ آرڊر پروسيسر جيڪو قطار مان پيغامن کي پروسيس ڪندو ۽ برائوزر ۾ ڏسڻ جي قابل تصديق پيدا ڪندو.

هڪ دفعو اسان ايپليڪيشن ٺاهي ڇڏيو، اسان توهان کي ڏيکارينداسين ته ڪيئن ميسيجنگ سسٽم جي ترتيب کي ايپليڪيشن ۾ لاڳو ڪيو وڃي ۽ AMQ آن لائن استعمال ڪريو وسيلن کي مهيا ڪرڻ لاءِ جيڪي اسان کي سسٽم تي گهربل آهن.

ڪوارڪس ايپ

اسان جي Quarkus ايپليڪيشن OpenShift تي هلندي آهي ۽ پروگرام جو هڪ تبديل ٿيل ورزن آهي amqp- quickstart. ڪلائنٽ جي طرف جو هڪ مڪمل مثال ملي سگهي ٿو هتي.

آرڊر جنريٽر

جنريٽر آسانيءَ سان هر 5 سيڪنڊن ۾ ”آرڊر“ ايڊريس ڏانهن وڌندڙ آرڊر IDs موڪلي ٿو.

@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;
    }
}

adjustment

AMQ آن لائن سان ڳنڍڻ لاءِ، اسان جي ايپليڪيشن کي ڪجھ ڪنفيگريشن ڊيٽا جي ضرورت پوندي، يعني: Quarkus connector configuration، AMQP endpoint information and client credentials. اهو، يقينا، بهتر آهي ته سڀني ترتيبن جي ڊيٽا کي هڪ جڳهه تي رکڻ لاء، پر اسان انهن کي عمدي طور تي الڳ ڪنداسين ته جيئن ڪوارڪس ايپليڪيشن کي ترتيب ڏيڻ لاء ممڪن اختيارن کي ڏيکاري.

ڳنڍيندڙ

ڪنيڪٽر جي ٺاھ جوڙ کي ترتيب ڏيڻ وقت مهيا ڪري سگھجي ٿو ايپليڪيشن پراپرٽي فائل استعمال ڪندي:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

شين کي سادو رکڻ لاءِ، اسان صرف ”آرڊر“ ايڊريس لاءِ پيغام جي قطار استعمال ڪنداسين. ۽ اسان جي ايپليڪيشن ۾ "تصديق" ايڊريس ياداشت ۾ قطار استعمال ڪندو.

AMQP آخري پوائنٽ

گڏ ڪرڻ وقت، AMQP جي آخري پوائنٽ لاء ميزبان نالو ۽ پورٽ نمبر اڻڄاتل آھن، تنھنڪري انھن کي انجيل ڪيو وڃي. آخري پوائنٽ ترتيب واري نقشي ۾ سيٽ ڪري سگھجي ٿو جيڪا AMQ آن لائن پاران ٺاھي وئي آھي، تنھنڪري اسين انھن کي ايپليڪيشن مينيفيسٽ ۾ ماحولياتي متغيرن جي ذريعي بيان ڪنداسين:

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. هن کي ڪرڻ لاءِ، توهان کي پهريان هڪ ڪسٽم ڪنفيگسورس ٺاهڻ گهرجي جيڪو پوڊ جي فائيل سسٽم مان تصديق واري ٽوڪن کي پڙهندو:

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 آن لائن ۾ گهربل آهن.

پيغام رسائيندڙ سسٽم کي ترتيب ڏيڻ

ھاڻي اھو رھيو آھي انھن وسيلن کي سيٽ ڪرڻ لاءِ جيڪي اسان جي ايپليڪيشن کي ميسيجنگ سسٽم ۾ گهربل آھن. هن کي ڪرڻ لاء، توهان کي ٺاهڻ جي ضرورت آهي: 1) هڪ ايڊريس اسپيس جيڪو پيغام رسائيندڙ سسٽم جي آخري پوائنٽ کي شروع ڪرڻ لاء. 2) پتي کي ترتيب ڏيڻ لاء پتو جيڪو اسان ايپليڪيشن ۾ استعمال ڪندا آهيون؛ 3) پيغام رسائيندڙ صارف کي ڪلائنٽ سندون سيٽ ڪرڻ لاء.

ائڊريس اسپيس

AMQ آن لائن ۾ هڪ ايڊريس اسپيس اعتراض پتي جو هڪ گروپ آهي جيڪو ڪنيڪشن جي آخري پوائنٽ ۽ تصديق ۽ اختيار جي پاليسين کي حصيداري ڪري ٿو. جڏهن توهان هڪ ايڊريس اسپيس ٺاهيندا آهيو، توهان وضاحت ڪري سگهو ٿا ته ڪيئن پيغام رسائيندڙ پوائنٽون بي نقاب ٿينديون:

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 سروس اڪائونٽ استعمال ڪندي تصديق ڪري سگهجي ٿو. استعمال ڪندڙ "service account" وضاحت ڪري سگهجي ٿو، مثال طور، هن طرح:

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 آن لائن لاءِ ترتيب ڏيڻ جو نقشو ٺاھڻ لاءِ جيڪو اسان AMQP جي آخري پوائنٽ جي معلومات کي شامل ڪرڻ لاءِ استعمال ڪيو آھي، ڪردار ۽ رول بائنڊنگ مقرر ٿيڻ گھرجي:

---
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 آن لائن.

ويٺو آهي

تنهن ڪري اسان هڪ Quarkus ايپليڪيشن لکي آهي جيڪا AMQP کي پيغام ڏيڻ لاءِ استعمال ڪري ٿي، ريڊ Hat OpenShift پليٽ فارم تي هلائڻ لاءِ ايپليڪيشن کي ترتيب ڏني، ۽ ان جي ترتيب کي AMQ آن لائن ترتيب جي بنياد تي لاڳو ڪيو. اسان پوءِ منشور ٺاھيو جيڪي اسان جي ايپليڪيشن لاءِ پيغام رسائيندڙ سسٽم کي شروع ڪرڻ لاءِ گهربل آھن.

اهو Quarkus بابت سيريز کي ختم ڪري ٿو، پر اتي تمام گهڻو نيون ۽ دلچسپ شيون آهن، ڏسندا رهو!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو