Quarkus اور AMQ آن لائن کا استعمال کرتے ہوئے Red Hat OpenShift پلیٹ فارم پر کلاؤڈ مقامی پیغام رسانی

سب کو سلام! یہ رہا - Quarkus سیریز میں ہماری آخری پوسٹ! (ویسے، ہمارا ویبینار دیکھیں "یہ Quarkus ہے - Kubernetes مقامی جاوا فریم ورک". ہم آپ کو دکھائیں گے کہ کس طرح شروع سے شروع کیا جائے یا ریڈی میڈ حل منتقل کیا جائے)

Quarkus اور AMQ آن لائن کا استعمال کرتے ہوئے Red Hat OpenShift پلیٹ فارم پر کلاؤڈ مقامی پیغام رسانی

В پچھلے اس پوسٹ میں، ہم نے متعلقہ ٹولز کو دیکھا جن کا استعمال جاوا ایپلی کیشنز کو جدید بنانے کے نتیجے میں حاصل ہونے والی بہتریوں کو درست کرنے کے لیے کیا جا سکتا ہے۔

ورژن 0.17.0 کے بعد سے، کوارکوس ایڈوانسڈ میسج کیوئنگ پروٹوکول کے استعمال کی حمایت کرتا ہے (AMQP۔)، جو ایپلی کیشنز یا تنظیموں کے درمیان کاروباری پیغامات کی منتقلی کے لیے ایک کھلا معیار ہے۔

ریڈ ہیٹ AMQ آن لائن ایک خدمت ہے جو اوپن سورس پروجیکٹ کی بنیاد پر بنائی گئی ہے۔ EnMasse اور پلیٹ فارم پر مبنی پیغام رسانی کے طریقہ کار کو نافذ کرنا ریڈ ہاٹ اوپن شفٹ. یہ کیسے کام کرتا ہے اس بارے میں مزید تفصیلات کے لیے، دیکھیں یہاں (EN). آج ہم آپ کو دکھائیں گے کہ AMQ Online اور Quarkus کو ملا کر دو نئی میسجنگ ٹیکنالوجیز کا استعمال کرتے ہوئے ایک جدید OpenShift پر مبنی پیغام رسانی کا نظام کیسے بنایا جائے۔

یہ فرض کیا جاتا ہے کہ آپ نے پہلے ہی اوپن شفٹ پلیٹ فارم پر AMQ آن لائن تعینات کر دیا ہے (اگر نہیں، تو دیکھیں تنصیب گائیڈ).

شروع کرنے کے لیے، ہم ایک Quarkus ایپلی کیشن بنائیں گے جو کہ رد عمل والے پیغام رسانی کا استعمال کرتے ہوئے ایک سادہ آرڈر پروسیسنگ سسٹم ہو گا۔ اس ایپلیکیشن میں ایک آرڈر جنریٹر شامل ہوگا جو ایک مقررہ وقفہ پر پیغام کی قطار کو آرڈر بھیجتا ہے، ساتھ ہی ایک آرڈر پروسیسر بھی شامل ہوگا جو قطار سے آنے والے پیغامات پر کارروائی کرے گا اور براؤزر میں دیکھے جانے کے قابل تصدیقات پیدا کرے گا۔

ایپلیکیشن بنانے کے بعد، ہم آپ کو دکھائیں گے کہ کس طرح میسجنگ سسٹم کنفیگریشن کو ایپلی کیشن میں سرایت کرنا ہے اور سسٹم پر ہمیں درکار وسائل کی فراہمی کے لیے AMQ آن لائن کا استعمال کرنا ہے۔

کوارکس ایپ

ہماری Quarkus ایپلیکیشن OpenShift پر چلتی ہے اور پروگرام کا ایک ترمیم شدہ ورژن ہے۔ amqp-quickstart. کلائنٹ سائیڈ کی ایک مکمل مثال مل سکتی ہے۔ یہاں.

آرڈر جنریٹر

جنریٹر آسانی سے ہر 5 سیکنڈ میں بڑھتے ہوئے آرڈر آئی ڈیز کو "آرڈرز" ایڈریس پر بھیجتا ہے۔

@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 آن لائن سے جڑنے کے لیے، ہماری درخواست کو کچھ کنفیگریشن ڈیٹا کی ضرورت ہوگی، یعنی: Quarkus کنیکٹر کنفیگریشن، AMQP اینڈ پوائنٹ کی معلومات اور کلائنٹ کی اسناد۔ بلاشبہ بہتر ہے کہ تمام کنفیگریشن ڈیٹا کو ایک جگہ پر رکھا جائے، لیکن ہم جان بوجھ کر انہیں الگ کر دیں گے تاکہ Quarkus ایپلی کیشن کو کنفیگر کرنے کے ممکنہ آپشنز دکھا سکیں۔

کنیکٹرز

کنیکٹر کنفیگریشن کو کمپائل کے وقت ایپلی کیشن پراپرٹیز فائل کا استعمال کرتے ہوئے فراہم کیا جا سکتا ہے:

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 سروس اکاؤنٹ کے ذریعے تصدیق کی جا سکتی ہے۔ صارف "سروس اکاؤنٹ" کی تعریف کی جا سکتی ہے، مثال کے طور پر، اس طرح:

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

پھر آئیے ایپلیکیشن روٹ یو آر ایل کو چیک کریں (صرف اس ایڈریس کو براؤزر میں کھولیں):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

براؤزر کو یہ دکھانا چاہیے کہ ٹکٹوں کو وقتاً فوقتاً اپ ڈیٹ کیا جاتا ہے کیونکہ AMQ آن لائن کے ذریعے پیغامات بھیجے اور موصول ہوتے ہیں۔

اپ میزانی

لہذا ہم نے ایک Quarkus ایپلی کیشن لکھی جو AMQP کو پیغام رسانی کے لیے استعمال کرتی ہے، ایپلیکیشن کو Red Hat OpenShift پلیٹ فارم پر چلانے کے لیے کنفیگر کیا، اور AMQ آن لائن کنفیگریشن کی بنیاد پر اس کی ترتیب کو نافذ کیا۔ اس کے بعد ہم نے اپنی درخواست کے لیے پیغام رسانی کے نظام کو شروع کرنے کے لیے ضروری مینی فیسٹ بنائے۔

یہ Quarkus کے بارے میں سیریز کا اختتام کرتا ہے، لیکن آگے بہت سی نئی اور دلچسپ چیزیں ہیں، دیکھتے رہیں!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں