Бәріңе сәлем! Міне, біздің Quarkus сериясындағы соңғы жазбамыз! (Айтпақшы, вебинарымызды қараңыз
В
0.17.0 нұсқасынан бастап,
Сіз OpenShift платформасында AMQ Online орнатқансыз деп болжанады (егер олай болмаса, қараңыз).
Бастау үшін біз реактивті хабар алмасу арқылы қарапайым тапсырысты өңдеу жүйесі болатын Quarkus қолданбасын жасаймыз. Бұл қолданба тапсырыстарды белгіленген аралықта хабарлама кезегіне жіберетін тапсырыс генераторын, сондай-ақ кезектен хабарларды өңдейтін және браузерде көруге болатын растауларды жасайтын тапсырыс процессорын қамтиды.
Қолданбаны жасағаннан кейін хабар алмасу жүйесінің конфигурациясын қолданбаға қалай енгізу керектігін және жүйеде қажетті ресурстарды қамтамасыз ету үшін AMQ Online қызметін пайдалануды көрсетеміз.
Quarkus қолданбасы
Біздің 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 соңғы нүктесі үшін хост атауы мен порт нөмірі белгісіз, сондықтан оларды енгізу керек. Соңғы нүктені 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) Клиенттің тіркелгі деректерін орнату үшін хабар алмасу пайдаланушысы.
Мекенжай кеңістігі
AMQ Online жүйесіндегі AddressSpace нысаны қосылымның соңғы нүктелерін және аутентификация мен авторизация саясаттарын ортақ пайдаланатын мекенжайлар тобы болып табылады. Мекенжай кеңістігін жасағанда, хабар алмасу соңғы нүктелерінің қалай ашылатынын көрсетуге болады:
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 соңғы нүкте ақпаратын ендіру үшін пайдаланған конфигурация картасын жасауы үшін Рөл және рөлді байланыстыру параметрлері орнатылуы керек:
---
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 арқылы хабарламалар жіберіліп, қабылданатындықтан, билеттер мерзімді түрде жаңартылып тұратынын көрсетуі керек.
Қорытындылау
Сонымен, біз хабар алмасу үшін AMQP қолданатын Quarkus қолданбасын жаздық, қолданбаны Red Hat OpenShift платформасында жұмыс істейтін етіп конфигурацияладық және оның конфигурациясын AMQ Online конфигурациясына негізделген іске асырдық. Содан кейін қолданбамыз үшін хабар алмасу жүйесін инициализациялау үшін қажетті манифесттерді жасадық.
Осымен Кваркус туралы серия аяқталады, бірақ алда көптеген жаңа және қызықты нәрселер бар, бізбен бірге болыңыз!
Ақпарат көзі: www.habr.com