рдирдорд╕реНрддреЗ! рдпрд╣ рдпрд╣рд╛рдБ рд╣реИ - рдХреНрд╡рд╛рд░реНрдХрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣рдорд╛рд░реА рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ! (рд╡реИрд╕реЗ, рд╣рдорд╛рд░рд╛ рд╡реЗрдмрд┐рдирд╛рд░ рджреЗрдЦреЗрдВ
╨Т
рд╕рдВрд╕реНрдХрд░рдг 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;
}
}
рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рдВрд╕рд╛рдзрди
рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рдВрд╕рд╛рдзрди рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдкреБрд╖реНрдЯрд┐рдХрд░рдгреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ 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;
}
}
рд╕рдорд╛рдпреЛрдЬрди
рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЕрд░реНрдерд╛рддреН: рдХреНрд╡рд╛рд░реНрдХрд╕ рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдПрдПрдордХреНрдпреВрдкреА рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ред рдмреЗрд╢рдХ, рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░ рджреЗрдВрдЧреЗред
рдХрдиреЗрдХреНрдЯрд░реНрд╕
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЧреБрдг рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
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
рд╕рд╛рдЦ
рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдХрд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд╕реЛрд░реНрд╕ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкреЙрдб рдХреЗ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди рдХреЛ рдкрдврд╝реЗрдЧрд╛:
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
рдЗрди рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рд╣рдо рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд▓реЗрддреЗред
рд╕рдВрджреЗрд╢ рдкреНрд░рдгрд╛рд▓реА рдХреА рд╕реНрдерд╛рдкрдирд╛
рдЕрдм рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рдирдХреА рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: 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
рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реА рдЖрдкрдХреЗ рдкрддреЗ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ 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"]
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐рдпрд╛рдВ
рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд┐рдЧрдореИрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдПрдПрдордХреНрдпреВрдкреА рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛, рднреВрдорд┐рдХрд╛ рдФрд░ рд░реЛрд▓рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП:
---
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"
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЯрд┐рдХрдЯ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджреЗрд╢ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЙрдкрд╕рдВрд╣рд╛рд░
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрд╛ рдЬреЛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдПрдордХреНрдпреВрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реЗрдб рд╣реИрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛, рдФрд░ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХреАред рдлрд┐рд░ рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдмрдирд╛рдПред
рдпрд╣ рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдмрд╣реБрдд рд╕реА рдирдИ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдмрдиреЗ рд░рд╣реЗрдВ!
рд╕реНрд░реЛрдд: www.habr.com