邓维佳
邓维佳
hi,感谢作者的实现。为了方便纯java同学的使用和定制,我将本项目翻译为java纯java代码。 在此基础之上做了下面的优化: 1. 序列化和反序列化 2. Leb128 3. 二级缓存(初始化加速 非首次启动6.5秒,首次20s) 4. 更好的编辑和升级离线数据包 https://github.com/virjar/geoLibChina
1. 使用netty的buffer重写InputStream和OutputStream的缓存buffer组件,这样避免了内存分配,同时netty保证了cursor和流状态的逻辑正确 2. OutputStream在close的时候,最后一个HttpLastContent需要待flush,否则可能偶发http响应hangup几秒时间 3. 支持了文件上传,并且使用netty的decoder同时处理post form 4. 在获取servlet.getServerName的时候,直接解析request的Host header,而不能调用NetAddress的getHostName方法,否则可能发起DNS解析请求,在低端服务器上,可能带来长达几秒的延时 5. 所有的请求,在完成完整http请求的解析后,再交给工作线程(springboot)进行dispatch,实际上无论是json、xml、fileupload,form-data在springboot都是获得完整的http request之后才会进入到controller中。否则需要自行处理input data的加锁和状态同步,受限于netty的单线程eventLoop机制,单线程加锁很容易出现死锁。同时,极限情况容易遇到tcp请求中途死链(即tcp关闭但没有rst,比如请求服务器突然关机掉电,tcp链接来不及回收),此时dispatch将会被无限hangup(Linux默认配置是8小时回收没有rst也没有流量的fd)。 本次提交完成了多种http服务器功能的生产测试,包括静态资源服务器(html网站)、内嵌servlet(swagger)、大文件上传、大文件下载、json等,对接口耗时进行了长期观测(带mysql查询的接口,大约在100ms,静态资源大约30ms)解决了所有遇到的偶发接口稳定性尖刺问题,同时进行了netty的内存泄漏监测工具测试,确保正确链路没有存在netty的内存泄漏。此版本已经具备生产使用条件(对于使用springboot进行websocket编程的场景可能会有问题,但是websocket更加建议在netty层面处理,不要打到springboot)。
非常感谢作者开源的项目,由于我比较重度的时候springboot+netty,很长一段时间都是使用sbnetty作为web服务器。 长期使用过程发现servlet规范实在是有点复杂,在生产环境还是会经常发现某个特性实现和http协议、servlet规范没对齐,以及存在一些不确定的代码延迟、性能抖动等情况。 偶然间我发现著名的webServer undertow就有尝试将他的底层切换为netty(undertow3.x),这和作者大大的项目功能一致,不过undertow3.x只是一个尝试性工作,undertow官方在尝试切换netty后有五年没有继续推进其更新迭代。所以我将undertow3.x的代码拿过来进行了一些修改,支持了springboot的集成,提供了一些基于spring的扩展点。 由于undertow是完整的servlet4.0规范实现,应该不会缺少功能支持特性,并且按理来说应该绝大部分功能都能正常使用,所以在这里借此推荐给大家。希望对和我有同样场景和需求的同学有一些帮助: [https://github.com/virjar/undertow-gateway](https://github.com/virjar/undertow-gateway)