Mhoroi mose! Hezvinoi - yedu yekupedzisira positi muQuarkus nhevedzano! (Nenzira, tarisa webinar yedu
Π
Kubva vhezheni 0.17.0,
Zvinofungidzirwa kuti wakatoisa AMQ Online pane OpenShift papuratifomu (kana zvisiri, wobva waona
Kutanga, isu tichagadzira Quarkus application inova yakapusa odha yekugadzirisa system uchishandisa reactive messaging. Ichi chishandiso chinosanganisa jenareta reodha inotumira maodha kumutsara wemeseji panguva yakatarwa, pamwe neodha processor iyo inogadzirisa mameseji kubva pamutsetse uye kugadzira zvisimbiso zvinoonekwa mubrowser.
Kana tangogadzira application, tinokuratidza nzira yekumisikidza iyo messaging system mukushandisa uye shandisa AMQ Online kupa zviwanikwa zvatinoda pane system.
Quarks app
Yedu Quarkus application inomhanya paOpenShift uye ishanduro yakagadziridzwa yechirongwa
Order jenareta
Jenareta inongotumira monotonically inokura maID ID kune "maodha" kero masekonzi mashanu ega ega.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Order processor
Iyo yekuodha inobata yakatonyanya kupusa, inongodzosera ID yekusimbisa kune "zvisimbiso" kero.
@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;
}
}
Kusimbisa Zviwanikwa
Iyo yekusimbisa sosi ndeye HTTP yekupedzisira yekunyora zvisimbiso zvinogadzirwa neapp yedu.
@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;
}
}
kuchinja
Kuti ubatanidze ku AMQ Online, application yedu inoda imwe data yekumisikidza, inoti: Quarkus connector configuration, AMQP endpoint information uye client credentials. Izvo, hongu, zviri nani kuchengetedza data rese rekugadzirisa munzvimbo imwechete, asi isu tichavapatsanura nemaune kuratidza sarudzo dzinogoneka dzekugadzirisa iyo Quarkus application.
Connectors
Connector kumisikidza inogona kupihwa panguva yekuunganidza uchishandisa application zvivakwa faira:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Kuti zvinhu zvive nyore, tichangoshandisa mutsara wemeseji yekero ye "maodha". Uye kero "yekusimbisa" mukushandisa kwedu inoshandisa mutsara mundangariro.
AMQP yekupedzisira
Panguva yekubatanidza, zita rekutambira uye nhamba yechiteshi cheiyo AMQP endpoint hazvizivikanwe, saka dzinofanirwa kubaiwa. Iyo yekupedzisira inogona kusetwa mune iyo configmap inogadzirwa ne AMQ Online, saka isu tichavatsanangura kuburikidza nemamiriro ekunze akasiyana mune application manifest:
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
Zvinyorwa
Iyo sevhisi account tokeni inogona kushandiswa kusimbisa application yedu kuOpenShift. Kuti uite izvi, unofanira kutanga wagadzira tsika yeConfigSource iyo inoverenga chiratidzo chechokwadi kubva kune pod's file system:
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);
}
}
Gadzira uye shandisa iyo application
Sezvo application yacho ichifanirwa kuunganidzwa kuita faira rinogoneka, GraalVM virtual muchina inodiwa. Kuti uwane ruzivo rwekugadzirisa nharaunda yeizvi, ona mirairo inoenderana mu
Zvadaro, uchitevera mirairo yakapihwa ipapo, iwe unofanirwa kudhawunirodha sosi, kuvaka uye kutumira application yedu:
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
Mushure memirairo iyi, application ichaiswa, asi haizotanga kudzamara tagadzirisa mameseji ekushandisa atinoda mu AMQ Online.
Kugadzira iyo messaging system
Ikozvino chasara kuseta zviwanikwa zvinodiwa neapplication yedu muhurongwa hwekutumira mameseji. Kuti uite izvi, unofanirwa kugadzira: 1) kero nzvimbo yekutanga messaging system yekupedzisira; 2) kero kugadzirisa kero dzatinoshandisa mukushandisa; 3) Kutumira meseji mushandisi kuseta magwaro emutengi.
Kero nzvimbo
Kero yenzvimbo mu AMQ Online iboka remakero anogovera mapeji ekubatanidza uye echokwadi uye mvumo. Paunogadzira nzvimbo yekero, unogona kutsanangura kuti mameseji ekupedzisira achaburitswa sei:
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
Mazita
Kero dzinoshandiswa kutumira uye kugamuchira mameseji. Kero imwe neimwe ine mhando, iyo inosarudza semantics yayo, pamwe nehurongwa, iyo inotsanangura huwandu hwezviwanikwa zvinofanirwa kuchengetwa. Kero inogona kutsanangurwa, semuenzaniso, seizvi:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Mushandisi wemeseji
Kuti uve nechokwadi chekuti maapplication akavimbika chete anogona kutumira uye kugamuchira mameseji kumakero ako, unofanirwa kugadzira mushandisi muhurongwa hwekutumira mameseji. Kune maapplication ari kushanda pachikwata, vatengi vanogona kutenderwa vachishandisa OpenShift service account. Mushandisi "serviceaccount" inogona kutsanangurwa, semuenzaniso, seizvi:
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"]
Mvumo yekugadzira application
Kuti AMQ Online igadzire iyo configmap yatakashandisa kumisa iyo AMQP endpoint ruzivo, Role uye RoleBinding inofanira kusetwa:
---
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
Maitiro ekushandisa magadzirirwo
Iwe unogona kushandisa iyo messaging system kumisikidza seizvi:
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
App verification
Kuti uve nechokwadi chekuti application yatanga, chekutanga, ngatitarisei kana kero dzinoenderana dzakagadzirwa uye dziri kushanda:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Zvadaro ngatitarisei nzira yekushandisa URL (ingovhura kero iyi mubrowser):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Iyo bhurawuza inofanirwa kuratidza kuti matikiti anogadziridzwa nguva nenguva sezvo mameseji achitumirwa uye nekugamuchirwa ne AMQ Online.
Summing up
Saka isu takanyora Quarkus application inoshandisa AMQP yekutumira mameseji, yakagadzirisa application kuti imhanye paRed Hat OpenShift papuratifomu, uye ikaita kumisikidzwa kwayo zvichienderana neiyo AMQ Online kumisikidza. Isu takazogadzira ma manifests anodiwa kuti titange messaging system yekushandisa yedu.
Izvi zvinopedzisa nhevedzano yeQuarkus, asi kune zvakawanda zvezvinhu zvitsva uye zvinonakidza zviri pamberi, gara wakatarisa!
Source: www.habr.com