apisix源码分析-前言(0)
apisix 是什么
Apache APISIX® – Cloud-Native API Gateway
apisix 是一个动态、实时、高性能的 API 网关。
发展
当使用 nginx 做网关、代理、均衡负载时。想要对 nginx 添加一些需求。
tengine
: 使用 nginx 的插件方式来实现原生扩展。
openresty
: 实现了 nginx lua 的扩展: openresty/lua-nginx-module ,使用 lua 来扩展 nginx 功能。
openresty 的出现让我们能够方便快捷的扩展 nginx 的功能。tengine 也通过添加 lua-nginx-module 扩展实现了相关能力。
在学习 apisix 之前,先要了解 openresty 的执行阶段,如下图:
初始化
init
和 init_worker
阶段分别对应到 nginx 的 master 进程和 worker 进程的初始化。
请求
ssl_certificate
对应到证书认证阶段,当使用 https 访问时会最先进入到这个阶段。
set_by_lua
变量设置阶段,可以在 nginx.conf 里设置一些变量,在这个阶段生效后,在之后的阶段通过 ngx.var. 访问
rewrite
重写阶段,在 ngx_http_rewrite_module 运行后执行。
access
访问阶段,在 ngx_http_access_module 运行后执行。
响应
content
内容处理
balancer
均衡负载
header_filter
返回 header 处理
body_filter
返回 body 处理
日志
log
在写日志之前运行
通过 openresty 对 nginx 功能进行扩展,可以对不同的阶段进行介入,实现需求。 当在各个阶段实功能不断迭代时,功能的边界会越来越模糊,导致代码混乱,无法管理。
所以我们提出了需求来解决问题:
- 不同的功能要有清晰的边界(插件化)
- 对不同的路由能够启用不同的功能(路由管理)
- 能够动态的管理后端服务 (动态化)
- 能够对证书管理
- ……
apisix
和 kong
就是基于 lua-nginx-module 实现的框架,将 route、 server 、plugin 、ssl 等等,能够动态的管理起来。 以下是我认为的 apisix 和 kong 最大的区别点:
apisix | kong | |
---|---|---|
配置同步 | 使用 etcd 存储配置,通过 watch 同步配置,毫秒级变更配置。 | 使用配置文件或数据库(postgres),定期轮询同步配置,5秒同步一次 |
路由匹配 | 使用 radixtree 存储路由,高性能。 | 前缀匹配,性能一般 |
插件 | 队列或有向无环图 | 队列 |
apisix源码分析-前言(0)