基于netty的微服务网关

Netflix Karyon提供了一个干净的框架来创建可用于云的微服务。 在您的组织中,如果您使用包含Eureka的Netflix OSS堆栈进行服务注册和发现,使用Archaius进行资产管理,那么很可能会使用Karyon创建微服务。

Karyon最近发生了很多变化,我的目的是使用新版本的Karyon记录一个好的样本。 旧的细胞核(称之为Karyon1)是基于JAX-RS 1.0规格与新泽西的实施,细胞核(Karyon2)的新版本仍然支持球衣也鼓励使用RX-的Netty这是一个定制版本的Netty用支持Rx-java 。

话虽如此,让我跳入一个样本。 我对这个样本的目标是创建一个“乒乓”微服务,该服务接受一个“ POST”消息并返回一个“ Acknowledgement”

以下是一个示例请求:

{
"id": "id",
"payload":"Ping"
}

和预期的响应:

{"id":"id","received":"Ping","payload":"Pong"}

第一步是创建一个RequestHandler ,顾名思义,它是一个RX-Netty组件,用于处理传入的请求:

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;}@Overridepublic 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 Lambda表达式也有助于使代码简洁。 您将在这里看到的一个问题是路由逻辑(控制器的哪个uri)与实际的控制器逻辑混合在一起,我认为这已得到解决 。

有了此RequestHandler,就可以使用原始的RX-Netty在独立的Java程序中启动服务器,本质上就是这样,将在端口8080处启动一个端点来处理请求:

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,主程序中的启动看起来有点不同:

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创建微服务的方式。

翻译自: https://www.javacodegeeks.com/2015/06/rx-netty-and-karyon2-based-cloud-ready-microservice.html

基于netty的微服务网关

基于netty的微服务网关_基于Rx-netty和Karyon2的云就绪微服务相关推荐

  1. 基于Rx-netty和Karyon2的云就绪微服务

    Netflix Karyon提供了一个干净的框架来创建可用于云的微服务. 在您的组织中,如果您使用包含Eureka的Netflix OSS堆栈进行服务注册和发现,使用Archaius进行资产管理,那么 ...

  2. python微服务监控_基于网络抓包实现kubernetes中微服务的应用级监控

    微服务是什么? 此话题不是本文重点,如你还不知道.请谷歌一波,会有遍地的解释.引用下图说明下微服务可能呈现的形态: 微服务监控的挑战 监控的目的是为了让集群中所有的服务组件,不管是HTTP服务,数据库 ...

  3. python 微服务 网关_微服务中的 API 网关(API Gateway)

    我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api ...

  4. python 微服务 网关_微服务网关

    微服务网关作用: API网关:跨一个或多个内部API提供单个统一的API入口点.通常还包括限制访问速率和有关安全性等特点.API网关可以为外部消费者提供统一的入口点,而与内部微服务的数量和组成无关. ...

  5. c# 微服务学习_资深架构师学习笔记:什么是微服务?

    们先来看看为什么要考虑使用微服务. 构建单体应用 我们假设,您开始开发一个打车应用,打算与 Uber 和 Hailo 竞争.经过初步交流和需求收集,您开始手动或者使用类似 Rails.Spring B ...

  6. 杨波 微服务技术专家_专家称,这些是最有效的微服务测试策略

    杨波 微服务技术专家 by Jake Lumetta 杰克·卢米塔(Jake Lumetta) 专家称,这些是最有效的微服务测试策略 (These are the most effective mic ...

  7. go 微服务框架_清晰架构(Clean Architecture)的Go微服务

    更新 我最进对这个框架进行了重大升级,虽然所做的改动不大,但成效显著.这次更新修复了旧框架中的所有主要问题,尽管它的的主要项目结构和接口都没有改变,具体改动内容请参见清晰架构(Clean Archit ...

  8. 基于cnn的短文本分类_基于时频分布和CNN的信号调制识别分类方法

    文章来源:IET Radar, Sonar & Navigation, 2018, Vol. 12, Iss. 2, pp. 244-249. 作者:Juan Zhang1, Yong Li2 ...

  9. 基于python的入侵检测系统毕设_基于时空特征融合的入侵检测系统模型

    期刊:COMPUTERS & SECURITY 期刊信息:JCR分区Q1:中科院分区2区:引用因子4.85 摘要: 入侵检测系统可以通过分析网络流量的特征来区分正常流量和攻击流量.近年来,神经 ...

最新文章

  1. CVPR2020:三维实例分割与目标检测
  2. 【Java实现】栈和队列就是这么简单
  3. python arp脚本_Python scapy 实现一个简易 arp 攻击脚本
  4. 编写高质量代码改善C#程序的157个建议——建议133:用camelCasing命名私有字段和局部变量...
  5. java redis使用卡死_记一次找因 redis 使用不当导致应用卡死 bug 的过程
  6. Nginx系列--01基本架构及其安装
  7. 【干货】从0到1打造企业数字化运营闭环白皮书.pdf(附下载链接)
  8. 181008有道扇贝每日一句
  9. 计算机机房kvm系统配件,KVM设备在机房管理改造中的解决方案
  10. hdoopHA的文件配置和安装hadoop和安装zookeeper
  11. 如何定制支持用户自定义boot参数的基于debian os的live cd
  12. 微信小程序开发01 双线程模型:为什么小程序不用浏览器的线程模型?
  13. clickhouse--Window Functions 窗口函数概念讲解及实际使用示例
  14. SQL Server故障处理合集
  15. 判断一维对象数组的对象时间属性值是未来、今天、昨天、一周内、30天内、30天以前,并将该数组按照时间分类组成二维数组用于分时间段渲染
  16. 如何防御DDoS攻击和CC攻击
  17. xs128 D-Flash读写
  18. 【Distributed】分布式任务调度平台
  19. 【国产加密算法-java实现SM3】
  20. 离散数学:计算主析取范式(基于真值表)

热门文章

  1. P3891-[GDOI2014]采集资源【背包,dp】
  2. nssl1143,jzoj3493-三角形【排序,数学,几何】
  3. [CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)
  4. P3327 约数的个数和 [约数函数性质,数论分块]
  5. 10、oracle下PL/SQL编程基础
  6. 2017年秋招美团Java程序员开发,看我如何拿到offer
  7. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
  8. Java 并发实践 — ConcurrentHashMap 与 CAS
  9. Java提升篇-事务隔离级别和传播机制
  10. MyBatis 思维导图,让 MyBatis 不再难懂(一)