แฒกแแแแแ แงแแแแแก! แแ แแก แแ แแก แฉแแแแ แแแแ แแแกแขแ Quarkus-แแก แกแแ แแแจแ! (แกแฎแแแแ แจแแ แแก, แฃแงแฃแ แแ แฉแแแแก แแแแแแแ แก
ะ
0.17.0 แแแ แกแแแแแ,
แแแ แแฃแแแแแ, แ แแ แแฅแแแ แฃแแแ แแแแแแแแกแแ AMQ Online OpenShift แแแแขแคแแ แแแแ (แแฃ แแ แ, แแแจแแ แแฎ.
แแแกแแฌแงแแกแแกแแแแก, แฉแแแ แจแแแฅแแแแ Quarkus-แแก แแแแแแแชแแแก, แ แแแแแแช แแฅแแแแ แจแแแแแแแก แแแแฃแจแแแแแแก แแแ แขแแแ แกแแกแขแแแ แ แแแฅแขแแฃแแ แจแแขแงแแแแแแแแแแก แแแแแงแแแแแแ. แแก แแแแแแแชแแ แแแแชแแแก แจแแแแแแแก แแแแแ แแขแแ แก, แ แแแแแแช แแแแแแแแก แจแแแแแแแแก แจแแขแงแแแแแแแแแแก แ แแแจแ แคแแฅแกแแ แแแฃแแ แแแขแแ แแแแแ, แแกแแแ แจแแแแแแแก แแ แแชแแกแแ แก, แ แแแแแแช แแแแแฃแจแแแแแก แจแแขแงแแแแแแแแแก แ แแแแแแ แแ แแแแแแแฃแจแแแแแก แแแแแกแขแฃแ แแแแแก, แ แแแแแแแช แฎแแแแแแแ แแ แแฃแแแ แจแ.
แแแก แจแแแแแ แ แแช แจแแแฅแแแแ แแแแแแแชแแแก, แฉแแแ แแแฉแแแแแแ, แแฃ แ แแแแ แฃแแแ แฉแแ แแแ แจแแขแงแแแแแแแแแแก แกแแกแขแแแแก แแแแคแแแฃแ แแชแแ แแแแแแแชแแแจแ แแ แแแแแแงแแแแ AMQ Online แกแแกแขแแแแจแ แกแแญแแ แ แ แแกแฃแ แกแแแแก แฃแแ แฃแแแแแกแแงแแคแแ.
Quarkus แแแแแแแชแแ
แฉแแแแ Quarkus แแแแแแแชแแ แแฃแจแแแแก OpenShift-แแ แแ แแ แแก แแ แแแ แแแแก แจแแชแแแแแ แแแ แกแแ
แจแแแแแแแก แแแแแ แแขแแ แ
แแแแแ แแขแแ แ แฃแแ แแแแ แแแแแขแแแฃแ แแ แแแแแแแแก แแแแ แแ แจแแแแแแแก ID-แแแก โแจแแแแแแแแแกโ แแแกแแแแ แแแ แงแแแแ 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, แ แแแแแแช แฌแแแแแแฎแแแก แแแแแแขแแคแแแแชแแแก แแแขแแแก pod-แแก แคแแแแฃแ แ แกแแกแขแแแแแแ:
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 แแแ แขแฃแแแฃแ แ แแแแฅแแแ. แแแขแแแแแแกแแแแก, แแฃ แ แแแแ แฃแแแ แจแแแฅแแแแก แแแ แแแ แแแแกแแแแแก, แแฎแแแแ แจแแกแแแแแแกแ แแแกแขแ แฃแฅแชแแแแ
แจแแแแแ, แแฅ แแแชแแแฃแแ แแแกแขแ แฃแฅแชแแแแแก แจแแแแแ, แแฅแแแ แฃแแแ แฉแแแแขแแแ แแแ แฌแงแแ แ, แแแฌแงแแ แแ แแแแแแแแกแแ แฉแแแแ แแแแแแแชแแ:
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) แแแแฎแแแ แแแแแก แจแแขแงแแแแแแแแแแก แแแแแแแแ แแแแแแขแแก แ แฌแแฃแแแแแแ แกแแแแแแแแก แแแกแแงแแแแแแแ.
แแแกแแแแ แแแแแก แกแแแ แชแ
AddressSpace แแแแแฅแขแ AMQ Online-แจแ แแ แแก แแแกแแแแ แแแแแก แฏแแฃแคแ, แ แแแแแแแช แแแแแ แแแแ แแแแจแแ แแก แแแแ แฌแแ แขแแแแแก แแ แแแแแแขแแคแแแแชแแแกแ แแ แแแขแแ แแแแชแแแก แแแแแขแแแแก. แ แแแแกแแช แแฅแแแ แจแแฅแแแแ แแแกแแแแ แแแ แกแแแ แชแแก, แจแแแแซแแแแ แแแฃแแแแแ, แแฃ แ แแแแ แแแแแฉแแแแแ แจแแขแงแแแแแแแแแแก แกแแแแแแ แฌแแ แขแแแแแ:
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 แกแแแแแแ แฌแแ แขแแแแก แแแคแแ แแแชแแแก แฉแแกแแ แแแแแ, แ แแแ แแ แ แแแ Binding แฃแแแ แแงแแก แแแแแแแแฃแแ:
---
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-แแก แแแแ .
แจแแฏแแแแแ
แแกแ แ แแ, แฉแแแ แแแแฌแแ แแ Quarkus แแแแแแแชแแ, แ แแแแแแช แแงแแแแแก AMQP-แก แจแแขแงแแแแแแแแแแกแแแแก, แแแแแงแแแแ แแแแแแแชแแ Red Hat OpenShift แแแแขแคแแ แแแแ แแแกแแจแแแแแ แแ แแแแแแฎแแ แชแแแแแ แแแกแ แแแแคแแแฃแ แแชแแ AMQ Online แแแแคแแแฃแ แแชแแแก แกแแคแฃแซแแแแแ. แจแแแแแ แฉแแแ แจแแแฅแแแแแ แแแแแคแแกแขแแแ, แ แแแแแแแช แกแแญแแ แแ แฉแแแแ แแแแแแแชแแแกแแแแก แจแแขแงแแแแแแแแแแก แกแแกแขแแแแก แแแแชแแแแแแแชแแแกแแแแก.
แแแแ แแแแแ แแแแ แกแแ แแ Quarkus-แแก แจแแกแแฎแแ, แแแแ แแ แฌแแ แแแแ แ แแฎแแแ แแ แกแแแแขแแ แแกแ แ แแ แแแแแแก, แแแแแ แแแแแแแ!
แฌแงแแ แ: www.habr.com