最近在github上發現了一個國人發起的api gateway項目(https://github.com/apache/apisix),自測下來性能相比於kong(https://docs.konghq.com)在不加載插件4個worker的時候要高1.6倍左右,加載插件後性能高五倍多。
apisix歸根結底還是openresty的擴展,功能以及使用方式和kong類似,支持插件式開發流程,官方介紹:
Apache APISIX 是一個動態、實時、高性能的 API 網關,基於 Nginx 網絡庫和 etcd 實現, 提供負載均衡、動態上遊、灰度發布、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。 可以使用 Apache APISIX 來處理傳統的南北向流量,以及服務間的東西向流量, 也可以當作k8s ingress controller 來使用。
下面主要闡述一下apisix架構設計、結構以及一些API使用總結(如何配置route,service服務發現)
架構圖如下:
APISIX 定義的結構主要有以下幾種:
consumer:
獲取 consumer_id:通過授權認證,即可自然獲取到對應的 Consumer id,它是 Consumer 對象的唯一識別標誌。獲取 Consumer 上綁定的 Plugin 或 Upstream 信息:完成對不同 Consumer 做不同配置的效果。Upstream 是虛擬主機抽象,對給定的多個服務節點按照配置規則進行負載均衡。Upstream 的地址信息可以直接配置到 Route(或 Service) 上,當 Upstream 有重複時,就需要用「引用」方式避免重複了
upstream調度算法:
chash或者wrr可採用type欄位配置
curl http://127.0.0.1:9080/apisix/admin/upstreams/100 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -X PUT -d '
{"type":"roundrobin", ##chash or roundrobin"nodes": {"10.123.16.48:80":1,"127.0.0.2:80":2}, "name": "ups100", "checks":{},"timeout": {"connect":15, "send":15, "read":15} }
其他根據請求header、consumer等可以用hash on進行hash shcedule
"upstream": {"key": "sid","type ": "chash","hash_on ": "cookie","nodes ": {"127.0.0.1:1981": 1}} 示例
還可以配置健康檢查:
"upstream": {"nodes": {"39.97.63.215:80": 1}"type": "roundrobin","retries": 2,"checks": {"active": {"http_path": "/status","host": "foo.com","healthy": {"interval": 2, "successes": 1},"unhealthy": {"interval": 1, "http_failures": 2}}}}
Service
某類 API 的抽象(也可以理解為一組 Route 的抽象)。它通常與上遊服務抽象upstream是一一對應的,Route 與 Service 之間,通常是 N:1 的關係,為什麼有了upstream還需要Service,在我理解是為了解決插件重複設置的問題。
Route 字面意思就是路由,通過定義一些規則來匹配客戶端的請求,然後根據匹配結果加載並執行相應的插件,並把請求轉發給到指定 Upstream。或者說是client直接接觸的API
Route 中主要包含三部分內容:匹配規則(比如 uri、host、remote_addr 等),插件配置(限流限速等)和上遊信息。
apisix配置服務發現流程:
註冊域名服務到consul集群:curl -X PUT -d '{"Datacenter":"wh_test","Node":"server-node03","Address": "192.168.1.48", "Service":{"Service":"web","port":80}}' http://localhost:8500/v1/catalog/registerdig測試服務DNS:dig @consul-IP -p 8600 web.service.consul SRVapisix(consul客戶端)dnsmasq配置consul後綴域名解析server=/consul/consul-IP#8600到/etc/dnsmasq.d/resolv.conf或/etc/dnsmasq.conf;重啟dnsmasq註冊route到apisix:(refer to: https://gist.github.com/moonming/32aed4922ea428db1abfe2edfd730b3a)curl http://127.0.0.1:9080/apisix/admin/routes/8 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '{"uri": "/healthz","upstream": {"type": "roundrobin", "nodes": {"web.service.consul:80": 1}}}'更多配置參考官網或者下面總結(https://blog.csdn.net/l5678go/article/details/108941689), https可以通過新增loader選項至ssl配置,加載其他語言的動態連結庫,如C語言的so可參考aline模塊