首页 存档 技术 查看内容

netty5 HTTP协议栈浅析与实践

2018-3-30 13:00 |来自: 互联网 329 0

摘要: 来自:cyfonly - 博客园 链接:www.cnblogs.com/cyfonly/p/5616493.html(点击尾部阅读原文前往) 一、说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端、移动端和 WEB端)将视频 ...

来自:cyfonly - 博客园

链接:www.cnblogs.com/cyfonly/p/5616493.html(点击尾部阅读原文前往)


一、说在前面的话


前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端、移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析、分拣后从不同的维度做实时和离线分析。(ps:这种活儿本该由统计部门去做的,但由于各种原因落在了我头上,具体原因略过不讲……)


先用个“概念图”来描绘下整个系统的架构:


  


嗯,这个是真正的“概念图”,因为我已经把大部分细节都屏蔽了,别笑,因为本文的重点只是整个架构中的一小部分,就是上图中红框内的 http server。 


也许你会问,这不就是个 HTTP 服务器吗,而且是只处理一个请求的 HTTP 服务器,搞个java web 项目在 Tomcat 中一启动不就完事儿了,有啥好讲的呀?。莫慌,且听=慢慢道来为啥要用 netty HTTP 协议栈来实现这个接收转发服务。


  • 首先,接入服务需要支持10W tps,而 netty 的多线程模型和异步非阻塞的特性让人很自然就会将它和高并发联系起来。

  • 其次,接入服务虽然使用 HTTP 协议,但显然这并不是个 WEB 应用,无需运行在相对较重的 Tomcat 这种 WEB 容器上。

  • 接着,在提供同等服务的情况下对比 netty HTTP 协议栈和 Tomcat HTTP 服务,发现使用 netty 时在机器资源占用(如CPU使用率、内存占用及上下文切换等)方面要优于 Tomcat。

  • 最后,netty 一直在说对 HTTP 协议提供了非常好的支持,因此想乘机检验一下是否属实。


基于以上几点原因,就决定使用 netty HTTP 协议栈开干啦~


本文并非纯理论或纯技术类文章,而是结合理论进而实践(虽然没有特别深入的实践),浅析 netty 的 HTTP 协议栈,并着重聊聊实践中遇到的问题及解决方案。越往后越精彩哦!


1.1 关于netty example


netty 官方提供了关于 HTTP 的例子,大伙儿可以在 netty 项目中查看。


https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/http

https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/http2


1.2 关于github项目


本人在网上使用 “netty HTTP” 的关键字搜索了下,发现大部分都是原搬照抄 netty 项目中的 example,很少有“原创性”的实践,也几乎没有看到实现一个相对完整的 HTTP 服务器的项目(比如如何解析GET/POST请求、自定义 HTTP decoder、对 HTTP 长短连接的思考等等……),因此就自己整理了一个相对完整一点的项目,项目地址

https://github.com/cyfonly/netty-http,该项目实现了基于 netty5 的 HTTP 服务端,暂时实现以下功能:


  • HTTP GET 请求解析与响应

  • HTTP POST 请求解析与响应,提供 application/json、application/x-www-form-urlencoded、multipart/form-data 三种常见 Content-Type 的 message body 解析示例

  • HTTP decoder实现,提供 POST 请求 message body 解码器的 HttpJsonDecoder 及 HttpProtobufDecoder 实现示例

  • 作为服务端接收浏览器文件上传及保存


将来可能会继续实现的功能有:


  • 命名空间

  • uri路由

  • chunked 传输编码


如果你也打算使用 netty 来实现 HTTP 服务器,相信这个项目和本文对你是有较大帮助的!


好了,闲话不多说,下面正式进入正题。

二、HTTP 协议知多少


要通过 netty 实现 HTTP 服务端(或者客户端),首先你得了解 HTTP 协议【1】。


HTTP 协议是请求/响应式的协议,客户端需要发送一个请求,服务器才会返回响应内容。例如在浏览器上输入一个网址按下 Enter,或者提交一个 Form 表单,浏览器就会发送一个请求到服务器,而打开的网页的内容,就是服务器返回的响应。


下面讲下 HTTP 请求和响应包含的内容。


HTTP 请求有很多种 method,最常用的就是 GET 和 POST,每种 method 的请求之间会有细微的区别。下面分别分析一下 GET 和 POST 请求。


2.1 GET请求


下面是浏览器对 http://localhost:8081/test?name=XXG

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部