Netflix Karyon предоставляет чистую платформу для создания облачных микросервисов. В вашей организации, если вы используете стек Netflix OSS, состоящий из Eureka для регистрации и обнаружения услуг , Archaius для управления имуществом, то весьма вероятно, что вы используете Karyon для создания своих микросервисов.
В последнее время Кэрион претерпел довольно много изменений, и моя цель здесь состоит в том, чтобы задокументировать хороший образец с использованием более новой версии Кэриона. Старый Karyon (назовите его Karyon1) был основан на спецификациях JAX-RS 1.0 с Джерси в качестве реализации, более новая версия Karyon (Karyon2) все еще поддерживает Джерси, но также поощряет использование RX-Netty, который является настроенной версией Netty с поддержка Rx-Java .
С учетом сказанного, позвольте мне перейти к образцу. Моя цель в этом примере — создать микросервис «pong», который принимает сообщение «POST» и возвращает «Подтверждение».
Ниже приведен пример запроса:
1
2
3
4
|
{ "id" : "id" , "payload" : "Ping" } |
И ожидаемый ответ:
1
|
{ "id" : "id" , "received" : "Ping" , "payload" : "Pong" } |
Первым шагом является создание RequestHandler, который, как следует из названия, является компонентом RX-Netty, отвечающим за маршрутизацию входящего запроса:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
package org.bk.samplepong.app; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.buffer.ByteBuf; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpResponseStatus; import io.reactivex.netty.protocol.http.server.HttpServerRequest; import io.reactivex.netty.protocol.http.server.HttpServerResponse; import io.reactivex.netty.protocol.http.server.RequestHandler; import netflix.karyon.transport.http.health.HealthCheckEndpoint; import org.bk.samplepong.domain.Message; import org.bk.samplepong.domain.MessageAcknowledgement; import rx.Observable; import java.io.IOException; import java.nio.charset.Charset; public class RxNettyHandler implements RequestHandler<ByteBuf, ByteBuf> { private final String healthCheckUri; private final HealthCheckEndpoint healthCheckEndpoint; private final ObjectMapper objectMapper = new ObjectMapper(); public RxNettyHandler(String healthCheckUri, HealthCheckEndpoint healthCheckEndpoint) { this .healthCheckUri = healthCheckUri; this .healthCheckEndpoint = healthCheckEndpoint; } @Override public Observable<Void> handle(HttpServerRequest<ByteBuf> request, HttpServerResponse<ByteBuf> response) { if (request.getUri().startsWith(healthCheckUri)) { return healthCheckEndpoint.handle(request, response); } else if (request.getUri().startsWith( "/message" ) && request.getHttpMethod().equals(HttpMethod.POST)) { return request.getContent().map(byteBuf -> byteBuf.toString(Charset.forName( "UTF-8" ))) .map(s -> { try { Message m = objectMapper.readValue(s, Message. class ); return m; } catch (IOException e) { throw new RuntimeException(e); } }) .map(m -> new MessageAcknowledgement(m.getId(), m.getPayload(), "Pong" )) .flatMap(ack -> { try { return response.writeStringAndFlush(objectMapper.writeValueAsString(ack)); } catch (Exception e) { response.setStatus(HttpResponseStatus.BAD_REQUEST); return response.close(); } } ); } else { response.setStatus(HttpResponseStatus.NOT_FOUND); return response.close(); } } } |
Этот поток полностью асинхронный и внутренне управляется библиотеками RX-java, лямбда-выражения Java 8 также помогают сделать код лаконичным. Единственная проблема, которую вы видите здесь, заключается в том, что логика маршрутизации (от того, к какому контроллеру) смешана с реальной логикой контроллера, и я считаю, что это решается .
Принимая во внимание этот RequestHandler, сервер может быть запущен в автономной Java-программе, используя сырую RX-Netty таким образом, это по сути, конечная точка будет установлена на порту 8080 для обработки запросов:
1
2
3
4
5
6
7
8
9
|
public final class RxNettyExample { public static void main(String... args) throws Exception { final ObjectMapper objectMapper = new ObjectMapper(); RxNettyHandler handler = new RxNettyHandler(); HttpServer<ByteBuf, ByteBuf> server = RxNetty.createHttpServer( 8080 , handler); server.start(); |
Это, однако, является родным способом Rx-netty: для готового к работе в облаке микросервиса должно произойти несколько вещей: служба должна зарегистрироваться в Eureka и должна отвечать на проверки работоспособности обратно из Eureka и должна иметь возможность загружать свойства с помощью Archaius. ,
Так что с Karyon2 запуск в основной программе выглядит немного иначе:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package org.bk.samplepong.app; import netflix.adminresources.resources.KaryonWebAdminModule; import netflix.karyon.Karyon; import netflix.karyon.KaryonBootstrapModule; import netflix.karyon.ShutdownModule; import netflix.karyon.archaius.ArchaiusBootstrapModule; import netflix.karyon.eureka.KaryonEurekaModule; import netflix.karyon.servo.KaryonServoModule; import netflix.karyon.transport.http.health.HealthCheckEndpoint; import org.bk.samplepong.resource.HealthCheck; public class SamplePongApp { public static void main(String[] args) { HealthCheck healthCheckHandler = new HealthCheck(); Karyon.forRequestHandler( 8888 , new RxNettyHandler( "/healthcheck" , new HealthCheckEndpoint(healthCheckHandler)), new KaryonBootstrapModule(healthCheckHandler), new ArchaiusBootstrapModule( "sample-pong" ), KaryonEurekaModule.asBootstrapModule(), Karyon.toBootstrapModule(KaryonWebAdminModule. class ), ShutdownModule.asBootstrapModule(), KaryonServoModule.asBootstrapModule() ).startAndWaitTillShutdown(); } } |
Теперь она по существу готова к работе в облаке, эта версия программы при запуске будет корректно регистрироваться в Eureka и предоставлять конечную точку проверки работоспособности. Это дополнительно предоставляет аккуратный набор оконечных точек администратора в порту 8077.
Вывод
Я надеюсь, что это дает хорошее представление об использовании Karyon2 для разработки на основе Netflix OSS. Весь образец доступен в моем репозитории github здесь : https://github.com/bijukunjummen/sample-ping-pong-netflixoss/tree/master/sample-pong. В качестве продолжения я покажу, как можно разработать один и тот же сервис с использованием Spring -Cloud, который является способом Spring для создания микро-сервисов.
Ссылка: | Микросервис на основе Rx-netty и Karyon2 от нашего партнера JCG Биджу Кунджуммена из блога all and sundry. |