Netty实现简单的HttpProxy(ihai-http-proxy)

第一次使用Netty,简单又复杂,经过一个星期的努力,终于完成了ihai-http-proxy基本能力。

一、目标

为了实现IHai-MicroService中的注册中心及网关,以HttpProxy为切入点学习Netty的架构模式,了解如何处理请求数据及响应数据。
此项目主要是为了验证及学习以下关键点:
1、Netty服务的创建
2、在Netty框架中如何对传入传出数据进行获取
3、HTTP请求在Netty框架中如何获取及修改
4、SSL请求如何支持

二、需求分析过程

对于这个需求有两个分析思考方式
第一种即熟悉HTTP代理协议及HTTP(HTTPS)协议的情况下根据协议规范进行开发即可。
第二种即不熟悉相关协议的情况下通过功能需求思考如何设计实现,在这里我就是通过这种方式。

下边就开始介绍实现HttpProxy时的基本思考过程,通过此过程可以分析确定HttpProxy实现基本功能总体上的流程,但与最终代码的实现逻辑并不完全一致:

1、创建server服务器,接收数据接入

使用Netty创建服务器非常简单:
ServerBootstrap看名字就知道是Netty服务端启动类,通过此启动类绑定端口即可启动监听;
通过group方法设置用来监听的线程(EventLoopGroup)及维护客户端连接的线程,必须设置;
通过channel方法设置通道类型(NioServerSocketChannel),必须设置;
通过childHandler设置对管道中请求数据的处理方法,必须设置。

2、根据请求信息转发请求并将响应回写到浏览器端

Netty中可以通过继承 ChannelInboundHandlerAdapter重写其channelRead( ChannelHandlerContext ctx, Object msg )方法来获取传入的数据,其中msg为传入的数据,默认类型为ByteBuf,可以通过自己的业务逻辑封装成自己需要的数据类型传给其他Handler(此能力在HttpProxy并未自己实现,如需了解请大家查阅Netty文档,后期会抽时间做个例子和大家分享)。
在启动Netty服务时可以通过ServerBootstrap的childHandler方法设置继承自 ChannelInboundHandlerAdapter的类
在HttpProxy实现中会使用到以下几个Handler:
HttpServerCodec:当使用Netty作为服务端时,此Handler会将传入数据转为HttpRequest、HttpResponse或HttpContent
HttpClientCodec:当使用Netty作为客户端时,此Handler会将返回数据转为HttpRequest、HttpResponse或HttpContent
SslHandler:处理SSL连接
ClientRequestHandler:自定义客户端请求处理类,此处为HttpProxy中自己需要实现的主要逻辑。
对于HTTP请求包含以下几点:
(1)获取Request报文
在ClientRequestHandler中重新channelRead方法,通过参数msg即可获得Request报文,由于我们添加了Netty的HttpServerCodec,因此对
于HTTP请求,msg的类型将会是HTTPRequest、HttpResponse或HttpContent。
(2)获取Request地址
当请求类型是HttpRequest时,可从请求头中获取访问地址及端口信息。


(3)创建与request地址间的连接
与ServerBootstrap向对应有一个Bootstrap类,可以用于创建与目标地址之间的连接。

(4)向目标地址发送Request数据
创建与目标地址间的连接管道后,即可将请求数据发送到目标服务器。

(5)获取目标地址返回数据
在创建与目标地址间的连接时,设置了HttpClientCodec用于将响应数据转为HttpRequest、HttpResponse或HttpContent。
(6)向浏览器回写目标地址返回的数据
在创建与目标地址间的连接时,设置了ServerResponseHandler用于将响应数据写回浏览器。
对于HTTPS请求增加以下几点:
(1)判断请求是否是HTTPS请求(在获取Request报文后进行判断)
参考Netty自己的SslUtil.java实现方式:

(2)在Netty中为访问的域名生成证书,在浏览器与Netty间的channel添加SslHandler
其中ctx.pipeline().fireChannelRead(msg)方法是为了让请求信息重新在所有的handler中处理一遍。
(3)在Netty与目标地址间的channel添加SslHandler
ServerResponseHandler:自定义服务端响应处理类,此类主要负责将目标地址相应的数据写回浏览器端。

三、代码设计实现

介绍完分析思考过程及其中部分关键点代码,下边介绍一下代码设计结构:

由于IHai-MicroService框架尚未完成,暂不将源码完全公开,如需源码可私信联系,根据同学们的用途会提供部分源码或代码段,谢谢大家的支持。

【参考命令】
生成CA证书:
openssl genrsa -des3 -out ca.key 2048
openssl pkcs8 -topk8 -nocrypt -inform PEM -outform DER -in ca.key -out ca_private.pem
openssl req -sha256 -new -x509 -days 365 -key ca.key -out ca.crt

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值