Здраво свима! Ево га - наш последњи пост у серији Куаркус! (Успут, погледајте наш вебинар
В
Од верзије 0.17.0,
Претпоставља се да сте већ применили АМК Онлине на ОпенСхифт платформи (ако нисте, погледајте
За почетак, направићемо Куаркус апликацију која ће бити једноставан систем за обраду наруџби користећи реактивну размену порука. Ова апликација ће укључивати генератор налога који шаље наруџбине у ред порука у фиксном интервалу, као и процесор налога који ће обрадити поруке из реда и генерисати потврде које се могу видети у претраживачу.
Када креирамо апликацију, показаћемо вам како да уградите конфигурацију система за размену порука у апликацију и користите АМК Онлине да обезбедите ресурсе који су нам потребни у систему.
Апликација Куаркус
Наша Куаркус апликација ради на ОпенСхифт-у и модификована је верзија програма
Генератор наруџби
Генератор једноставно монотоно шаље растуће ИД-ове налога на адресу „поруџбина“ сваких 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;
}
}
Ресурси за потврду
Ресурс за потврду је ХТТП крајња тачка за навођење потврда које генерише наша апликација.
@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;
}
}
подешавање
За повезивање са АМК Онлине, нашој апликацији ће бити потребни неки конфигурациони подаци, и то: конфигурација Куаркус конектора, информације о крајњој тачки АМКП и акредитиви клијента. Наравно, боље је држати све конфигурационе податке на једном месту, али ћемо их намерно раздвојити да бисмо приказали могуће опције за конфигурисање апликације Куаркус.
Конектори
Конфигурација конектора се може обезбедити у време компајлирања помоћу датотеке са својствима апликације:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Да би ствари биле једноставне, користићемо само ред порука за адресу „поруџбина“. А адреса „потврде“ у нашој апликацији ће користити ред у меморији.
АМКП крајња тачка
У време компајлирања, име хоста и број порта за АМКП крајњу тачку су непознати, па се морају убацити. Крајња тачка се може поставити у конфигурационој мапи коју креира АМК Онлине, тако да ћемо је дефинисати кроз променљиве окружења у манифесту апликације:
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
Akreditivi
Токен налога услуге се може користити за аутентификацију наше апликације на ОпенСхифт. Да бисте то урадили, прво морате да креирате прилагођени ЦонфигСоурце који ће читати токен за аутентификацију из система датотека модула:
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);
}
}
Направите и примените апликацију
Пошто се апликација мора компајлирати у извршну датотеку, потребна је ГраалВМ виртуелна машина. За детаље о томе како да подесите окружење за ово, погледајте одговарајућа упутства у
Затим, пратећи упутства која су тамо дата, потребно је да преузмете извор, направите и примените нашу апликацију:
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
Након ових команди, апликација ће бити распоређена, али се неће покренути док не конфигуришемо ресурсе за размену порука које су нам потребне у АМК Онлине-у.
Подешавање система за размену порука
Сада остаје само да подесимо ресурсе који су потребни нашој апликацији у систему за размену порука. Да бисте то урадили, потребно је да креирате: 1) адресни простор за иницијализацију крајње тачке система за размену порука; 2) адресу за конфигурисање адреса које користимо у апликацији; 3) Корисник за размену порука да подеси акредитиве клијента.
Адресни простор
АддрессСпаце објекат у АМК Онлине је група адреса које деле крајње тачке везе и смернице за аутентификацију и ауторизацију. Када креирате адресни простор, можете одредити како ће крајње тачке за размену порука бити изложене:
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
Корисник за размену порука
Да бисте били сигурни да само поуздане апликације могу слати и примати поруке на ваше адресе, морате креирати корисника у систему за размену порука. За апликације које се покрећу на кластеру, клијенти се могу аутентификовати помоћу налога услуге ОпенСхифт. Кориснички „сервисни налог“ се може дефинисати, на пример, овако:
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"]
Дозволе за конфигурисање апликације
Да би АМК Онлине креирао конфигурациону мапу коју смо користили за уградњу информација о крајњој тачки АМКП, морамо да подесимо улогу и везу за улоге:
---
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"
Прегледач треба да покаже да се карте периодично ажурирају како АМК Онлине шаље и прима поруке.
Резиме
Тако смо написали Куаркус апликацију која користи АМКП за размену порука, конфигурисали апликацију да ради на Ред Хат ОпенСхифт платформи и имплементирали њену конфигурацију на основу АМК Онлине конфигурације. Затим смо креирали манифесте потребне за иницијализацију система за размену порука за нашу апликацију.
Овим је серијал о Кваркусу завршен, али предстоји много нових и занимљивих ствари, останите са нама!
Извор: ввв.хабр.цом