一、Apisix簡介
APISIX是一個微服務(wù)API網(wǎng)關(guān),具有高性能、可擴展性等優(yōu)點。它基于nginx(openresty)、Lua、etcd實現(xiàn)功能,借鑒了Kong的思路。和傳統(tǒng)的API網(wǎng)關(guān)相比,APISIX具有較高的性能和較低的資源消耗,并且具有豐富的插件,也方便自己進行插件擴展。
二、網(wǎng)關(guān)搭建
Docker安裝方式
2.1 下載apisix-docker倉庫
git clone https://github.com/apache/apisix-docker.git
cd apisix-docker/example
2.2 docker-compose啟用APISIX
docker-compose -p docker-apisix up -d
2.3 RPM安裝方式
1. 通過在線RPM 倉庫安裝
sudo yum install -y
https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
sudo yum install apisix
2. 通過離線RPM包安裝
sudo mkdir -p apisix
sudo yum install -y
https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
sudo yum clean all && yum makecache
sudo yum install -y --downloadonly --downloaddir=./apisix apisix
apisix init #配置初始化
apisix start #啟動網(wǎng)關(guān)
三、路由配置
3.1 重點概念:
路由(Route):通過定義一些規(guī)則來匹配客戶端的請求,然后根據(jù)匹配結(jié)果加載并執(zhí)行相應(yīng)的插件,并把請求轉(zhuǎn)發(fā)給到指定Upstream。主要包含三部分內(nèi)容:匹配規(guī)則(比如uri、host、remote_addr等),插件配置(限流限速等)和上游信息。請看下圖示例,是一些Route規(guī)則的實例,當某些屬性值相同時,圖中用相同顏色標識。
消費方(Consumer):對于API網(wǎng)關(guān)通常可以用請求域名、客戶端IP地址等字段識別到某類請求方,然后進行插件過濾并轉(zhuǎn)發(fā)請求到指定上游,通過抽象出消費方,可通過插件聚合創(chuàng)建出消費方,通過在設(shè)置路由規(guī)則時綁定和啟用。
上游(Upstream):是虛擬主機抽象,對給定的多個服務(wù)節(jié)點按照配置規(guī)則進行負載均衡。Upstream的地址信息可以直接配置到Route(或Service)上,當Upstream有重復時,就需要用“引用”方式避免重復了。
服務(wù)(Service):是某類API的抽象(也可以理解為一組Route的抽象)。它通常與上游服務(wù)抽象是一一對應(yīng)的,Route與Service之間,通常是N:1的關(guān)系。不同Route規(guī)則同時綁定到一個Service上,這些Route將具有相同的上游和插件配置,減少冗余配置。
Script(腳本):表示將在 HTTP 請求/響應(yīng)生命周期期間執(zhí)行的腳本。配置可直接綁定在 Route 上。Script 與 Plugin 互斥,且優(yōu)先執(zhí)行 Script ,這意味著配置 Script 后,Route 上配置的 Plugin 將不被執(zhí)行。Script 也有執(zhí)行階段概念,支持 access、header_filter、body_filter 和 log 階段。系統(tǒng)會在相應(yīng)階段中自動執(zhí)行 Script 腳本中對應(yīng)階段的代碼。
{
...
"script": "local _M = {} \n function _M.access(api_ctx) \n ngx.log(ngx.INFO,\"hit access phase\") \n end \nreturn _M"
}
3.2 基于Apisix Dashboard的路由配置
開放控制臺訪問:
修改/usr/local/apisix/conf/config.yaml配置文件,增加允許訪問的遠程 IP 地址
allow_admin:
- 127.0.0.0/24 # If we don't set any IP list, then any IP access is allowed by default.
- 1.1.1.0/24 # 新增加的遠程IP地址段。
3.2.1 創(chuàng)建上游
3.2.2 創(chuàng)建路由
3.2.3 配置路徑
3.2.4 選擇上游
四、插件使用
4.1 插件加載流程
請求路由是通過查詢ETCD的路由和消費方進行插件匹配,過濾得到可使用的插件后運行插件進行動態(tài)上游反向代理。
4.2 插件使用
通過配置路由時進行插件配置啟用響應(yīng)插件,并進行插件文件配置信息配置
4.2.1 以limt-req 為例的基于漏桶原理的請求限速
漏桶算法(Leaky Bucket)是網(wǎng)絡(luò)世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)時經(jīng)常使用的一種算法,它的主要目的是控制數(shù)據(jù)注入到網(wǎng)絡(luò)的速率,平滑網(wǎng)絡(luò)上的突發(fā)流量。漏桶算法提供了一種機制,通過它,突發(fā)流量可以被整形以便為網(wǎng)絡(luò)提供一個穩(wěn)定的流量。
4.2.2 屬性說明
rate:指定的請求速率(以秒為單位),請求速率超過 rate 但沒有超過 (rate + brust)的請求會被加上延時burst:請求速率超過 (rate + brust)的請求會被直接拒絕rejected_code:當請求超過閾值被拒絕時,返回的 HTTP 狀態(tài)碼key:是用來做請求計數(shù)的依據(jù),當前接受的 key 有:"remote_addr"(客戶端 IP 地址), "server_addr"(服務(wù)端 IP 地址), 請求頭中的"X-Forwarded-For" 或 "X-Real-IP"。
上述截圖配置:限制了每秒請求速率為 1,大于 1 小于 3的會被加上延時,速率超過 3就會被拒絕。
五、通過Nacos實現(xiàn)網(wǎng)關(guān)下的注冊發(fā)現(xiàn)
5.1 啟用nacos動態(tài)注冊服務(wù)
在文件 conf/config.yaml 中添加以下配置到,啟用nacos動態(tài)注冊服務(wù):
5.2 Upstream配置
配置上游服務(wù),選擇使用服務(wù)發(fā)現(xiàn),填寫服務(wù)名、命名空間等保存,最后通過創(chuàng)建路由服務(wù)關(guān)聯(lián)上游服務(wù)即可實現(xiàn)nacos的動態(tài)注冊發(fā)現(xiàn)服務(wù)。
程序員的核心競爭力其實還是技術(shù),因此對技術(shù)還是要不斷的學習,關(guān)注 “IT巔峰技術(shù)” 公眾號 ,該公眾號內(nèi)容定位:中高級開發(fā)、架構(gòu)師、中層管理人員等中高端崗位服務(wù)的,除了技術(shù)交流外還有很多架構(gòu)思想和實戰(zhàn)案例。
作者是 《 消息中間件 RocketMQ 技術(shù)內(nèi)幕》 一書作者,同時也是 “RocketMQ 上海社區(qū)”聯(lián)合創(chuàng)始人,曾就職于拼多多、德邦等公司,現(xiàn)任上市快遞公司架構(gòu)負責人,主要負責開發(fā)框架的搭建、中間件相關(guān)技術(shù)的二次開發(fā)和運維管理、混合云及基礎(chǔ)服務(wù)平臺的建設(shè)。