Quarkus жана AMQ Online аркылуу Red Hat OpenShift платформасында булутка негизделген билдирүүлөр

Баарына салам! Бул жерде - Quarkus сериясындагы акыркы постубуз! (Баса, биздин вебинарды көрүңүз "Бул Quarkus - Kubernetes жергиликтүү Java негизи". Биз сизге кантип нөлдөн баштоону же даяр чечимдерди өткөрүп берүүнү көрсөтөбүз)

Quarkus жана AMQ Online аркылуу Red Hat OpenShift платформасында булутка негизделген билдирүүлөр

В мурунку Бул постто биз Java тиркемелерин модернизациялоонун натыйжасында алынган жакшыртуулардын санын аныктоо үчүн колдонула турган тиешелүү куралдарды карап чыктык.

0.17.0 версиясынан бери, кваркус Advanced Message Queuing Protocol колдонууну колдойт (AMQP), бул тиркемелер же уюмдар ортосунда бизнес билдирүүлөрдү өткөрүү үчүн ачык стандарт.

Red Hat AMQ Online ачык булак долбоорунун негизинде курулган кызмат болуп саналат EnMasse жана платформага негизделген билдирүү механизмин ишке ашыруу RedHat OpenShift. Анын кантип иштээри жөнүндө көбүрөөк маалымат алуу үчүн караңыз бул жерде (EN). Бүгүн биз эки жаңы билдирүү технологиясын колдонуу менен заманбап OpenShift негизиндеги билдирүү системасын куруу үчүн AMQ Online менен Quarkus кантип айкалыштырууну көрсөтөбүз.

Сиз буга чейин OpenShift платформасында AMQ Online орноттуңуз деп болжолдонууда (эгер андай болбосо, анда караңыз орнотуу көрсөтмөсү).

Баштоо үчүн, биз Quarkus тиркемесин түзөбүз, ал реактивдүү билдирүүлөрдү колдонуу менен жөнөкөй заказдарды иштетүү тутуму болот. Бул колдонмо белгиленген аралыкта билдирүү кезегине буйрутмаларды жөнөтүүчү буйрутма генераторун, ошондой эле кезектеги билдирүүлөрдү иштетип, браузерде көрүүгө мүмкүн болгон ырастоолорду жаратуучу заказ процессорун камтыйт.

Тиркемени жараткандан кийин, биз сизге билдирүүлөр тутумунун конфигурациясын тиркемеге кантип киргизүүнү жана системада керектүү ресурстарды камсыздоо үчүн AMQ Online'ду кантип колдонууну көрсөтөбүз.

Quarkus колдонмосу

Биздин Quarkus тиркемеси OpenShiftте иштейт жана программанын өзгөртүлгөн версиясы amqp-тез баштоо. Кардар тараптын толук мисалын тапса болот бул жерде.

Заказ генератор

Генератор жөн гана монотондуу түрдө ар бир 5 секунд сайын "буйрутмалар" дарегине өсүп буйрутма идентификаторлорун жөнөтөт.

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable<Integer> generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

Заказ процессору

Буйрутма иштетүүчү дагы жөнөкөй, ал жөн гана "расмийациялар" дарегине ырастоо ID кайтарат.

@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 виртуалдык машинасы талап кылынат. Бул үчүн чөйрөнү кантип түзүү керектиги боюнча чоо-жайын билүү үчүн, тиешелүү нускамаларды караңыз Quarkus Guide.

Андан кийин, ал жерде берилген көрсөтмөлөрдү аткарып, сиз булакты жүктөп алып, биздин тиркемени куруп, жайылтышыңыз керек:

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 акыркы чекит маалыматын кыстаруу үчүн колдонгон конфигмапаны түзүшү үчүн, 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 тарабынан билдирүүлөр жөнөтүлүп жана кабыл алынып жаткандыктан, билеттер мезгил-мезгили менен жаңырылып турганын көрсөтүшү керек.

кошуу жолу менен

Ошентип, биз кабарлашуу үчүн AMQP колдонгон Quarkus тиркемесин жаздык, тиркемени Red Hat OpenShift платформасында иштөө үчүн конфигурацияладык жана анын конфигурациясын AMQ Online конфигурациясынын негизинде ишке ашырдык. Андан кийин биз колдонмобуз үчүн билдирүү системасын инициализациялоо үчүн керектүү манифесттерди түздүк.

Ушуну менен Кваркус жөнүндөгү серия аяктайт, бирок алдыда көптөгөн жаңы жана кызыктуу нерселер бар, биз менен болуңуз!

Source: www.habr.com

Комментарий кошуу