Размена порука заснована на Цлоуд-у на платформи Ред Хат ОпенСхифт користећи Куаркус и АМК Онлине

Здраво свима! Ево га - наш последњи пост у серији Куаркус! (Успут, погледајте наш вебинар „Ово је Куаркус – Кубернетес изворни Јава оквир“. Показаћемо вам како да почнете од нуле или да пренесете готова решења)

Размена порука заснована на Цлоуд-у на платформи Ред Хат ОпенСхифт користећи Куаркус и АМК Онлине

В Претходна У овом посту погледали смо релевантне алате који се могу користити за квантификацију побољшања добијених као резултат модернизације Јава апликација.

Од верзије 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"

Прегледач треба да покаже да се карте периодично ажурирају како АМК Онлине шаље и прима поруке.

Резиме

Тако смо написали Куаркус апликацију која користи АМКП за размену порука, конфигурисали апликацију да ради на Ред Хат ОпенСхифт платформи и имплементирали њену конфигурацију на основу АМК Онлине конфигурације. Затим смо креирали манифесте потребне за иницијализацију система за размену порука за нашу апликацију.

Овим је серијал о Кваркусу завршен, али предстоји много нових и занимљивих ствари, останите са нама!

Извор: ввв.хабр.цом

Додај коментар