سلام به همه! اینجاست - آخرین پست ما در سری Quarkus! (به هر حال، وبینار ما را تماشا کنید
В
از نسخه 0.17.0،
فرض بر این است که شما قبلاً AMQ Online را در پلتفرم OpenShift مستقر کرده اید (اگر نه، پس ببینید
برای شروع، ما یک برنامه Quarkus ایجاد می کنیم که یک سیستم پردازش سفارش ساده با استفاده از پیام های واکنشی خواهد بود. این برنامه شامل یک تولید کننده سفارش است که سفارش ها را در یک بازه زمانی ثابت به صف پیام ارسال می کند، و همچنین یک پردازشگر سفارش که پیام ها را از صف پردازش می کند و تأییدیه های قابل مشاهده در مرورگر را ایجاد می کند.
هنگامی که برنامه را ایجاد کردیم، به شما نشان خواهیم داد که چگونه پیکربندی سیستم پیام رسانی را در برنامه جاسازی کنید و از AMQ Online برای تهیه منابع مورد نیاز در سیستم استفاده کنید.
اپلیکیشن کوارکوس
برنامه 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++);
}
}
پردازشگر سفارش
کنترل کننده سفارش حتی ساده تر است، فقط یک شناسه تأیید را به آدرس "تأییدات" برمی گرداند.
@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 سفارشی ایجاد کنید که نشانه احراز هویت را از سیستم فایل پاد بخواند:
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) پیام رسانی به کاربر برای تنظیم اعتبار مشتری.
فضای آدرس
یک شی 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 نقشه پیکربندی را ایجاد کند که ما برای جاسازی اطلاعات نقطه پایانی 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 پیاده سازی کردیم. سپس مانیفست های مورد نیاز برای مقداردهی اولیه سیستم پیام رسانی را برای برنامه خود ایجاد کردیم.
این سریال در مورد کوارکوس به پایان می رسد، اما چیزهای جدید و جالب زیادی در پیش است، با ما همراه باشید!
منبع: www.habr.com