A lua web network framework.
httpc
与httpd
库增加的gzip
头部支持, 用于优化网络与数据传输效率.
httpd
库增加注册中文(utf8)路由支持, 用于特殊一些场景.
httpc
库增加basic
与jwt
方法, 用于构造常用的头部.
优化对底层库增加预分配机制, 提升效率与可读性.
优化大部分网络协议的解析效率, 提升解析效率.
httpd
库取消默认超时限制, 如果有需要可以自行调用相关接口增加.
更新了大部分cloud
库内相关API, 有兴趣自行查看不再单独介绍.
修复qiniu
库的认证bug
.
修复class
与logging
的引用问题.
修复admin
库的cookie异常与admin.view
的一些问题.
修复httpd
库上传文件.
修复了一些错别字.
当Web App需要返回大数据集的时候, 这通常不是一个很好的设计. 这在服务端渲染模板的情况下很常见, 框架的设计无法弥补这一缺陷的.
我们知道任何一个模板文件都能轻易达到>1K
的程度, 更有同时还会包含更多一些业务数据. 这种情况通常无法避免, 我们只能思考更好的解决方案.
之前有开发者提出过对gzip
的支持. 但是当时框架正处于功能开发阶段, 无法分出心来对特性、优化、性能进行定制开发. 好在现在这个阶段已经度过.
目前已经对httpd
与httpc
库增加了gzip
的compress
与uncompress
支持. 在某些测试代码中已经证明, 传输字节的消耗至少减少了50%-80%
.
在httpd
库中我们提供了httpd:enable_gzip
方法. 在客户端支持压缩的情况下, 我们会对相关路由的返回值进行压缩. 开发者无需关心数据格式.
在httpc
中是会增加Accept-Encoding: gzip
头部请求压缩. 这在用户与开发者角度是不会感知的, 通常内部已经自动识别完成转换.
从大部分测试中发现, http客户端都已经支持Connection: keep-alive
. 框架默认增加连接超时机制对开发者来说不够友好.
相信大部分Web开发者都会为Web App框架提供的负载均衡器, 同时负载均衡器会对大部分后端Web App提供的socket
连接提供连接池机制.
大部分负载均衡器都能完成连接超时功能, 所以框架的超时机制反而对连接池的建立与回收有稳定性上的隐患. 并且隐患通常开发者很难知晓与排查.
而Web框架运行在一个对连接复用性需求比较高的场景下, 所以将默认设置为无超时限制. 这样能让框架隐藏在负载均衡器后的时候运行的更加稳定.
当然! 如果开发者对此有异议, 并且不希望cfadmin
运行在负载均衡器后面并且要提供超时机制. 从当前版本开始, 只需要在启动的时候设置超时时间即可.
众所周知! 市面上绝大部分Web开发框架都提供了unix sock
机制. 但是对其应用场景与实际效果却了解甚少. 这是因为一些开发者很少接触到服务器部署.
我们通常只可能部署一台负载均衡器与后端多个Web App应用程序进行通信达到负载均衡的目的. 但是这也许满足不了一些特殊的开发者, 他们的环境有特殊的要求.
当负载均衡算法已经不是问题的时候, 减少内部连接消耗与效率则变成了我们关注的重点. 有限的连接池与端口范围成为制约我们的瓶颈. 我们需要更好的解决办法.
Unix Domain Socket
是一种进程间通讯机制, 它在工作起来更像是Pipe
与SocketPair
. 比起基于internet
的socket
连接有有更少的消耗.
Unix Domain Socket
两端通信没有端口的概念, 因此也就没有端口范围的限制. 通常您只会在某些代理、负载均衡器中看到它的应用. 例如: Nginx
.
我们完全可以假设单台服务器硬件配置足够高的情况下, 运行N个Web App实例进程. 让负载均衡器通过Unix Domain Socket
与其进行通信.
例如: 在一个16核心64G内存的服务器上启动10个cfadmin
进程. 通过让负载均衡器占用4~6
核心与10~20G
内存来维护上万的连接是轻而易举的.
每个cfadmin
进程对CPU与内存的利用率都非常高. 当其他Web框架需要占用G
单位大小的内存时, cfadmin
可能只需要1/10
的内存.
有理由预计当每个cfadmin
需要占用4G
以上内存的时候, 您可能才需要考虑单台服务器设计是否需要进行横向扩展.
Pre-allocation
仅在Lua
语言中有效, 并且这也是一种针对性的优化. 我们在大部分场景中测试到一些数据结构的操作会进行rehash
与resize
.
Pre-allocation
的目的是减少频繁resize
/rehash
的问题, 让基础数据结构运行的更加平滑, 最大程度利用数据结构缓存. 这在框架内部使用很频繁.
同时考虑到了开发者对一些对象的调整与扩展优化了数据初始化的大小. 所以在对象建立(例如: Websocket
)的时候, 也会预先分配一定的基础内存.
而底层基础内存结构在使用完毕后, 会被框架清理后进入缓存列表内. 等待下一次使用时候复用即可. 这也是为什么框架无需定制内存分配器也能工作的很好.
就上述调整与优化, 我们在实际测试中提高了5%-10%
的效率.
优化编译脚本输出, 并且更容易排查编译错误.
优化一些错误的拼写, 便于出错时更容易阅读错误信息.
优化内置dns
库的一些实现流程, 优化dns cache
生成与查询速度.
优化一些测试代码, 完善测试流程与增加测试覆盖率.
cfadmin
可执行文件新增命令行-e
参数, 可以用来指定入口文件.
csv
库新增writefile
方法, 根据指定规则生成csv
文件.
cloud
库新增paypal
支付SDK实现与腾讯位置服务
SDK.
新增快速上传文件示例, 具体查看script/test_upload.lua
.
项目首页增加更为详细的安装、编译流程图.
cf
框架一直以来都没有考虑改写入口文件
的支持, 这对熟悉文档的用户来说是一件好事(无歧义性).
但是在多项目部署与测试的时候就会出现一系列问题, 一些开发者也经常会遇到这样的需求(包括作者).
直到某个匿名小伙伴私信说项目部署/测试都很麻烦的时候, 作为作者的我才意识到这方面限制了它.
现在, 使用者可以用./cfadmin -d -e script/XXX.lua
来指定入口文件. 参数-d
与-e
的顺序并不重要且不会影响.
lua
读/写csv
文件并不难(甚至可以说很简单), 但是框架在之前只实现了读取.
这次我们增加接口writefile
, 它可以帮你将规范的数据dump
到csv
中.
目前来说paypal
与腾讯位置服务
的SDK已经可以尝试使用了, 这类接口在某些业务场景中会很还用. 欢迎大家对它进行使用.
其它, 例如: qiniu
的接口. 目前无法定位问题所在(因为同样都代码一会好一会坏), 我会继续尝试各种形式的问题定位.
如果实在不行, 这类问题接口将会最终被移除. 毕竟, 一些无法使用并且不稳定的代码不适合存在于项目中.
新增admin
库的一些特殊处理方法;
新增webhook
库并集成了dingtalk
机器人API相关接口与测试文件, 主要适用于国内一些特殊开发场景;
新增qrcode.js
/echarts.js
等库到static
目录下, 可以自行决定是否保留(内部无依赖);
新增httpd
库都内置MIME
集, 适用于一些特殊场景;
新增跨平台的sendfile
方法支持, 提升httpd
库的静态资源发送效率;
新增httpc
库的get
/post
方法对args
/body
强制转义.
修复httpc.json
的引用错误的问题;
修复一个命名错误的歧义性问题与upvalue
未加local
修饰符的问题;
修复浏览器对特殊字符进行编码处理后, 导致的文件查找失败的问题;
修复admin
库sql
的创建语句不规范的问题与登录逻辑未判断用户名是否非法的情况;
修复admin
库的session
清空无法直接跳转登录页的问题与退出登录未强制删除token
的冗余问题;
修复admin
库的常见xss
隐患与断网情况下无法本地引用jquery
与echarts.js
的问题;
admin
库的首页布局、登录页加logo
、phone
与email
调用本地程序、长按回车的一些体验问题;优化admin库的一些实现代码与SQL语句;
优化包括login
、dashboard
、user
、role
、menu
、header
、profile
的一些布局与显示问题;
修复crypt
在使用频繁情况下的tohex
性能问题;
修复导入数据后字段描述的comment
乱码的问题;
修复在docker
内运行mysql:8
的连接问题(详情看yaml
文件);
现在提供了clean
与build
脚本用来简化编译难度, 脚本内部注释描述了如何使用与依赖库.
框架根据lua5.4beta版本API提供了兼容, 可自行编译测试.
已经提供了完整的在线文档
修复httpc
的timeout
字段错误的问题.
修复getsockopt
在windows
平台的莫名其妙段错误.
修复了MacOSX
默认不使用kqueue
的问题.
优化now
函数的实现方法, 使用更加简单的函数实现.
优化了core.c
对各种后端选择的优先级判断.
优化一大部分C代码, 更加清晰的代码流程管理.
优化crypt库代码, 增加md5、hmac_md5、sha512、hmac_512等算法.
分离出一个win32的分支仅用于支持windows
系统原生进行开发与调试, 编译代码支持windows 7或更高版本.
它并非VSC
或MinGW
编译器原生编译, 而是通过msys2
的兼容层cygwin
进行编译. 目前仅对windows 7
或更高版本提供支持.
虽然说引入兼容层能让cf
运行在windows
平台, 但是还有引起一些问题:
定时器不精准.
dns
库不能根据系统dns进行自动调整(虽然这个问题使用者一般不会感知).
更多详细介绍可以参考这里.
优化代码编译流程, 增加rpath
运行时查找路径.
优化makefile
, 更直观的编译流程.
优化异步日志打印频率.
优化HTTP.lua协议文件.
优化mail
库发送流程, 分离协议文件与应用库文件.
优化websocket
关闭与发送流程, 减少内存占用.
修复httpc.multi_request
返回false的问题.
修复conf.d
不存在的问题.
修复静态文件PATH判断的问题.
修复crypt
库的被隐藏的错误.
修复logging
库的毫秒显示问题.
增加adimin
库的get_files
方法判断是否有上传文件.
增加build.sh
文件用来展示如何快速编译依赖库.
增加大部分crypt
库的hex
参数用来转换16位可读、可打印字符, 增加了test_crypt.lua
示例文件.
增加csv
库用来读取解析csv文件, 使用方法查看test_csv.lua
.
更新了dockerfile
文件.
增加了httpd
的启动日志打印提示.