Saƙon asalin gajimare akan dandalin Red Hat OpenShift ta amfani da Quarkus da AMQ Online

Sannu duka! Ga shi - post ɗinmu na ƙarshe a cikin jerin Quarkus! (Af, kalli webinar mu "Wannan shine Quarkus - Kubernetes tsarin Java na asali". Za mu nuna muku yadda ake farawa daga karce ko canja wurin shirye-shiryen da aka yi)

Saƙon asalin gajimare akan dandalin Red Hat OpenShift ta amfani da Quarkus da AMQ Online

В baya A cikin wannan sakon, mun kalli kayan aikin da suka dace waɗanda za a iya amfani da su don ƙididdige abubuwan ingantawa da aka samu sakamakon sabunta aikace-aikacen Java.

Tun daga sigar 0.17.0, kwarkus yana goyan bayan amfani da Advanced Message Queuing Protocol (AMQP), wanda shine buɗaɗɗen ma'auni don canja wurin saƙonnin kasuwanci tsakanin aikace-aikace ko ƙungiyoyi.

Red Hat AMQ Online sabis ne da aka gina akan tushen aikin buɗaɗɗen tushe EnMasse da aiwatar da tsarin saƙon da ya dogara da dandamali Red Hat OpenShift. Don ƙarin bayani kan yadda yake aiki, duba nan (EN). A yau za mu nuna muku yadda ake haɗa AMQ Online da Quarkus don gina tsarin saƙon zamani na tushen OpenShift ta amfani da sabbin fasahohin saƙo guda biyu.

Ana ɗauka cewa kun riga kun tura AMQ Online akan dandalin OpenShift (idan ba haka ba, to duba jagorar shigarwa).

Don farawa, za mu ƙirƙiri aikace-aikacen Quarkus wanda zai zama tsarin sarrafa tsari mai sauƙi ta amfani da saƙon amsawa. Wannan aikace-aikacen zai ƙunshi janareta na oda wanda ke aika oda zuwa layin saƙo a ƙayyadaddun tazara, da kuma na'ura mai sarrafa oda wanda zai sarrafa saƙon daga layin kuma ya samar da tabbacin da za a iya gani a cikin mashigar.

Da zarar mun ƙirƙiri aikace-aikacen, za mu nuna muku yadda ake shigar da tsarin tsarin saƙo a cikin aikace-aikacen kuma amfani da AMQ Online don samar da albarkatun da muke buƙata akan tsarin.

Quarkus app

Aikace-aikacen mu na Quarkus yana gudana akan OpenShift kuma ingantaccen sigar shirin ne amqp-sauri. Ana iya samun cikakken misali na gefen abokin ciniki a nan.

Oda janareta

Janareta kawai yana aika ID ɗin oda mai girma zuwa adireshin “oda” kowane sakan 5.

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

Mai sarrafa oda

Mai sarrafa oda ya fi sauƙi, kawai yana mayar da ID na tabbatarwa zuwa adireshin "tabbatacce".

@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;
    }
}

Abubuwan Tabbatarwa

Tushen tabbatarwa shine ƙarshen HTTP don jera abubuwan tabbatarwa ta aikace-aikacenmu.

@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;
    }
}

gyara

Don haɗi zuwa AMQ akan layi, aikace-aikacen mu zai buƙaci wasu bayanan daidaitawa, wato: Ƙirar haɗin haɗin Quarkus, bayanan ƙarshen AMQP da takaddun shaidar abokin ciniki. Yana da, ba shakka, mafi kyau a ajiye duk bayanan sanyi a wuri ɗaya, amma za mu raba su da gangan don nuna yiwuwar zaɓuɓɓuka don daidaita aikace-aikacen Quarkus.

Masu haɗawa

Ana iya samar da tsarin haɗin haɗin kai a lokacin tattarawa ta amfani da fayil ɗin kaddarorin aikace-aikacen:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

Don sauƙaƙe abubuwa, za mu yi amfani da layin saƙo kawai don adireshin "umarni". Kuma adireshin "tabbatattun" a cikin aikace-aikacen mu zai yi amfani da layi a cikin ƙwaƙwalwar ajiya.

AMQP karshen

A lokacin tattarawa, sunan mai masauki da lambar tashar jiragen ruwa don ƙarshen AMQP ba a san su ba, don haka dole ne a yi musu allura. Za a iya saita ƙarshen ƙarshen a cikin taswirar saiti wanda AMQ Online ya ƙirƙira, don haka za mu ayyana su ta hanyar masu canjin yanayi a cikin bayanan aikace-aikacen:

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

Takaddun shaida

Ana iya amfani da alamar asusun sabis don tabbatar da aikace-aikacen mu zuwa OpenShift. Don yin wannan, dole ne ka fara ƙirƙirar ConfigSource na al'ada wanda zai karanta alamar tabbatarwa daga tsarin fayil ɗin pods:

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);
    }
}

Gina kuma Sanya Aikace-aikacen

Tunda dole ne a haɗa aikace-aikacen cikin fayil ɗin da za a iya aiwatarwa, ana buƙatar injin kama-da-wane na GraalVM. Don cikakkun bayanai kan yadda ake saita yanayi don wannan, duba umarni masu dacewa a ciki Jagoran Quarkus.

Bayan haka, bin umarnin da aka bayar a wurin, kuna buƙatar zazzage tushen, ginawa da tura aikace-aikacen mu:

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

Bayan waɗannan umarni, za a tura aikace-aikacen, amma ba za a fara ba har sai mun saita albarkatun saƙon da muke buƙata a AMQ Online.

Saita tsarin saƙon

Yanzu abin da ya rage shine saita albarkatun da aikace-aikacenmu ke buƙata a cikin tsarin saƙon. Don yin wannan, kuna buƙatar ƙirƙirar: 1) sararin adireshi don fara ƙarshen tsarin saƙon; 2) adireshin don daidaita adiresoshin da muke amfani da su a cikin aikace-aikacen; 3) Mai amfani da saƙo don saita bayanan abokin ciniki.

Wurin adireshi

Abun AddressSpace a cikin AMQ Online rukuni ne na adiresoshin da ke raba maƙasudin ƙarshen haɗin gwiwa da tabbatarwa da manufofin izini. Lokacin da ka ƙirƙiri sararin adireshi, za ka iya ƙayyade yadda za a fallasa wuraren ƙarshen saƙo:

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

Adireshin

Ana amfani da adireshi don aikawa da karɓar saƙonni. Kowane adireshi yana da nau'i, wanda ke ƙayyade ma'anarsa, da kuma tsari, wanda ke ƙayyade adadin albarkatun da za a adana. Ana iya tantance adireshin, misali, kamar haka:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

Mai amfani da saƙo

Don tabbatar da cewa amintattun aikace-aikace ne kawai za su iya aikawa da karɓar saƙonni zuwa adiresoshin ku, dole ne ku ƙirƙiri mai amfani a cikin tsarin saƙon. Don aikace-aikacen da ke gudana akan gungu, ana iya tantance abokan ciniki ta amfani da asusun sabis na OpenShift. Ana iya ayyana "account ɗin sabis" mai amfani, misali, kamar haka:

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"]

Izinin saita aikace-aikacen

Domin AMQ Online ya ƙirƙiri taswirar tsarin da muka yi amfani da shi don shigar da bayanan ƙarshen AMQP, Role da RoleBinding dole ne a saita:

---
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

Yadda ake amfani da saitunan

Kuna iya amfani da tsarin tsarin saƙo kamar haka:

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

Tabbatar da aikace-aikacen

Don tabbatar da cewa aikace-aikacen ya fara, da farko, bari mu bincika ko an ƙirƙiri adireshin daidai kuma suna aiki:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

Sannan bari mu duba hanyar aikace-aikacen URL (kawai buɗe wannan adireshin a cikin mai binciken):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

Mai binciken ya kamata ya nuna cewa ana sabunta tikiti lokaci-lokaci kamar yadda ake aika saƙonni da karɓa ta AMQ Online.

Girgawa sama

Don haka mun rubuta aikace-aikacen Quarkus wanda ke amfani da AMQP don aika saƙon, saita aikace-aikacen don aiki akan dandamalin Red Hat OpenShift, kuma mun aiwatar da tsarin sa bisa tsarin AMQ akan layi. Sannan mun ƙirƙiri bayanan da ake buƙata don fara tsarin saƙon aikace-aikacen mu.

Wannan ya ƙare jerin game da Quarkus, amma akwai sababbin abubuwa masu ban sha'awa da yawa a gaba, zauna a hankali!

source: www.habr.com

Add a comment