Chào mọi người! Đây rồi - bài đăng cuối cùng của chúng tôi trong loạt bài Quarkus! (Nhân tiện, hãy xem hội thảo trên web của chúng tôi
В
Kể từ phiên bản 0.17.0,
Giả sử rằng bạn đã triển khai AMQ Online trên nền tảng OpenShift (nếu chưa, hãy xem
Để bắt đầu, chúng tôi sẽ tạo một ứng dụng Quarkus, đây sẽ là một hệ thống xử lý đơn hàng đơn giản bằng cách sử dụng tính năng nhắn tin phản hồi. Ứng dụng này sẽ bao gồm một trình tạo đơn hàng gửi đơn đặt hàng đến hàng đợi tin nhắn theo một khoảng thời gian cố định, cũng như một bộ xử lý đơn hàng sẽ xử lý các tin nhắn từ hàng đợi và tạo các xác nhận có thể xem được trong trình duyệt.
Sau khi tạo xong ứng dụng, chúng tôi sẽ hướng dẫn bạn cách nhúng cấu hình hệ thống nhắn tin vào ứng dụng và sử dụng AMQ Online để cung cấp các tài nguyên chúng tôi cần trên hệ thống.
ứng dụng Quarkus
Ứng dụng Quarkus của chúng tôi chạy trên OpenShift và là phiên bản sửa đổi của chương trình
Trình tạo đơn hàng
Trình tạo chỉ đơn giản gửi ID đơn đặt hàng ngày càng tăng đến địa chỉ “đơn đặt hàng” cứ sau 5 giây.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Bộ xử lý đơn hàng
Trình xử lý đơn hàng thậm chí còn đơn giản hơn, nó chỉ trả về ID xác nhận đến địa chỉ "xác nhận".
@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;
}
}
Tài nguyên xác nhận
Tài nguyên xác nhận là điểm cuối HTTP để liệt kê các xác nhận do ứng dụng của chúng tôi tạo ra.
@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;
}
}
điều chỉnh
Để kết nối với AMQ Online, ứng dụng của chúng tôi sẽ cần một số dữ liệu cấu hình, cụ thể là: cấu hình trình kết nối Quarkus, thông tin điểm cuối AMQP và thông tin xác thực ứng dụng khách. Tất nhiên, tốt hơn là giữ tất cả dữ liệu cấu hình ở một nơi, nhưng chúng tôi sẽ cố tình tách chúng ra để hiển thị các tùy chọn có thể có để định cấu hình ứng dụng Quarkus.
Kết nối
Cấu hình trình kết nối có thể được cung cấp tại thời điểm biên dịch bằng tệp thuộc tính ứng dụng:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Để đơn giản, chúng tôi sẽ chỉ sử dụng hàng đợi tin nhắn cho địa chỉ "đơn đặt hàng". Và địa chỉ “xác nhận” trong ứng dụng của chúng ta sẽ sử dụng hàng đợi trong bộ nhớ.
Điểm cuối AMQP
Tại thời điểm biên dịch, tên máy chủ và số cổng cho điểm cuối AMQP không xác định nên chúng phải được đưa vào. Điểm cuối có thể được đặt trong sơ đồ cấu hình do AMQ Online tạo, vì vậy chúng tôi sẽ xác định chúng thông qua các biến môi trường trong bảng kê khai ứng dụng:
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
Thông tin xác thực
Mã thông báo tài khoản dịch vụ có thể được sử dụng để xác thực ứng dụng của chúng tôi với OpenShift. Để thực hiện việc này, trước tiên bạn phải tạo ConfigSource tùy chỉnh sẽ đọc mã thông báo xác thực từ hệ thống tệp của nhóm:
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);
}
}
Xây dựng và triển khai ứng dụng
Vì ứng dụng phải được biên dịch thành tệp thực thi nên cần có máy ảo GraalVM. Để biết chi tiết về cách thiết lập môi trường cho việc này, hãy xem hướng dẫn tương ứng trong
Sau đó, làm theo hướng dẫn ở đó, bạn cần tải xuống nguồn, xây dựng và triển khai ứng dụng của chúng tôi:
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
Sau các lệnh này, ứng dụng sẽ được triển khai nhưng sẽ không khởi động cho đến khi chúng tôi định cấu hình tài nguyên nhắn tin mà chúng tôi cần trong AMQ Online.
Thiết lập hệ thống nhắn tin
Bây giờ tất cả những gì còn lại là thiết lập các tài nguyên mà ứng dụng của chúng tôi cần trong hệ thống nhắn tin. Để thực hiện việc này, bạn cần tạo: 1) vùng địa chỉ để khởi tạo điểm cuối của hệ thống nhắn tin; 2) địa chỉ để định cấu hình các địa chỉ chúng tôi sử dụng trong ứng dụng; 3) Nhắn tin cho người dùng để đặt thông tin xác thực của khách hàng.
Không gian địa chỉ
Đối tượng Không gian địa chỉ trong AMQ Online là một nhóm địa chỉ chia sẻ điểm cuối kết nối cũng như các chính sách xác thực và ủy quyền. Khi tạo không gian địa chỉ, bạn có thể chỉ định cách hiển thị các điểm cuối nhắn tin:
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
Địa chỉ
Địa chỉ được sử dụng để gửi và nhận tin nhắn. Mỗi địa chỉ có một loại xác định ngữ nghĩa của nó cũng như một gói chỉ định số lượng tài nguyên được dự trữ. Địa chỉ có thể được xác định, ví dụ như thế này:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Người dùng nhắn tin
Để đảm bảo rằng chỉ những ứng dụng đáng tin cậy mới có thể gửi và nhận tin nhắn đến địa chỉ của bạn, bạn phải tạo người dùng trong hệ thống nhắn tin. Đối với các ứng dụng chạy trên một cụm, máy khách có thể được xác thực bằng tài khoản dịch vụ OpenShift. Ví dụ: "serviceaccount" người dùng có thể được xác định như thế này:
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"]
Quyền cấu hình ứng dụng
Để AMQ Online tạo sơ đồ cấu hình mà chúng tôi đã sử dụng để nhúng thông tin điểm cuối AMQP, Vai trò và Ràng buộc vai trò phải được đặt:
---
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
Cách áp dụng cấu hình
Bạn có thể áp dụng cấu hình hệ thống nhắn tin như thế này:
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
Xác minh ứng dụng
Để đảm bảo rằng ứng dụng đã khởi động, trước hết hãy kiểm tra xem các địa chỉ tương ứng đã được tạo và đang hoạt động chưa:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Sau đó, hãy kiểm tra URL tuyến ứng dụng (chỉ cần mở địa chỉ này trong trình duyệt):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Trình duyệt sẽ hiển thị rằng vé được cập nhật định kỳ khi AMQ Online gửi và nhận tin nhắn.
Tổng hợp
Vì vậy, chúng tôi đã viết một ứng dụng Quarkus sử dụng AMQP để nhắn tin, định cấu hình ứng dụng để chạy trên nền tảng Red Hat OpenShift và triển khai cấu hình của nó dựa trên cấu hình AMQ Online. Sau đó, chúng tôi đã tạo các bảng kê khai cần thiết để khởi tạo hệ thống nhắn tin cho ứng dụng của mình.
Phần này kết thúc loạt bài về Quarkus, nhưng còn rất nhiều điều mới mẻ và thú vị phía trước, hãy chú ý theo dõi nhé!
Nguồn: www.habr.com