سب کو سلام! یہ رہا - Quarkus سیریز میں ہماری آخری پوسٹ! (ویسے، ہمارا ویبینار دیکھیں
В
ورژن 0.17.0 کے بعد سے،
یہ فرض کیا جاتا ہے کہ آپ نے پہلے ہی اوپن شفٹ پلیٹ فارم پر AMQ آن لائن تعینات کر دیا ہے (اگر نہیں، تو دیکھیں
شروع کرنے کے لیے، ہم ایک Quarkus ایپلی کیشن بنائیں گے جو کہ رد عمل والے پیغام رسانی کا استعمال کرتے ہوئے ایک سادہ آرڈر پروسیسنگ سسٹم ہو گا۔ اس ایپلیکیشن میں ایک آرڈر جنریٹر شامل ہوگا جو ایک مقررہ وقفہ پر پیغام کی قطار کو آرڈر بھیجتا ہے، ساتھ ہی ایک آرڈر پروسیسر بھی شامل ہوگا جو قطار سے آنے والے پیغامات پر کارروائی کرے گا اور براؤزر میں دیکھے جانے کے قابل تصدیقات پیدا کرے گا۔
ایپلیکیشن بنانے کے بعد، ہم آپ کو دکھائیں گے کہ کس طرح میسجنگ سسٹم کنفیگریشن کو ایپلی کیشن میں سرایت کرنا ہے اور سسٹم پر ہمیں درکار وسائل کی فراہمی کے لیے AMQ آن لائن کا استعمال کرنا ہے۔
کوارکس ایپ
ہماری 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++);
}
}
آرڈر پروسیسر
آرڈر ہینڈلر اور بھی آسان ہے، یہ صرف "تصدیقات" پتے پر ایک تصدیقی 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