品牌名稱
360搜索
所在行業(yè)
科技
企業(yè)規(guī)模
1001-5000人

在 360基礎(chǔ)運(yùn)維平臺(tái)項(xiàng)目中的實(shí)踐

602次閱讀

API 網(wǎng)關(guān)選型

2019 年 10 月,我們團(tuán)隊(duì)計(jì)劃改造 360 基礎(chǔ)運(yùn)維平臺(tái)的網(wǎng)關(guān)層,當(dāng)時(shí)我們主要調(diào)研了社區(qū)幾個(gè)比較活躍的網(wǎng)關(guān),如 Kong,Orange,Apache APISIX,最終選擇了 Apache APISIX 當(dāng)時(shí)主要是考慮到 Apache APISIX 的存儲(chǔ)選型 etcd 比較符合我們的使用場(chǎng)景。

 

1.png

 

線上運(yùn)行情況

目前我們添加到網(wǎng)關(guān)的 API 數(shù)量接近 900 個(gè),日均 PV 1000 萬(wàn)左右,從監(jiān)控系統(tǒng)來(lái)看,網(wǎng)關(guān)以及我們各個(gè)微服務(wù)均運(yùn)行良好。

  • 日均 PV

 

2.png

 

  • 網(wǎng)關(guān) POD 監(jiān)控

 

3.png

 

  • 微服務(wù)負(fù)載監(jiān)控圖

 

4.png

 

基礎(chǔ)運(yùn)維平臺(tái)架構(gòu)圖

下圖是我們運(yùn)維平臺(tái)項(xiàng)目最終的架構(gòu)圖,網(wǎng)關(guān)服務(wù)我們部署在公司的容器云上,etcd 服務(wù)我們是在 3 臺(tái)虛機(jī)上部署了一套集群。

 

5.png

 

容器化開發(fā)和部署

接下來(lái)我具體介紹一下我們是如何使用 Apache APISIX 搭建網(wǎng)關(guān)服務(wù)的,首先先給大家看下我們網(wǎng)關(guān)項(xiàng)目的代碼結(jié)構(gòu)

 

6.png

 

之前我給王院生(Apache APISIX PMC 之一 )看我們的項(xiàng)目代碼結(jié)構(gòu)時(shí),他驚訝的問(wèn)我,說(shuō)怎么沒(méi)有看到 Apache APISIX 的 core 代碼。

 

實(shí)際上這是我們?cè)谑褂萌萜靼惭b Apache APISIX 時(shí)探索出來(lái)的一條道路。它給我們帶來(lái)最大的好處是,我們業(yè)務(wù)的代碼和 Apache APISIX 的核心代碼完全分開,方便 Apache APISIX 升級(jí),也方便我們的業(yè)務(wù)代碼迭代。

 

插件化開發(fā)

1、項(xiàng)目插件介紹

正如在上面代碼結(jié)構(gòu)圖中所看到的,我們項(xiàng)目的 apisix 目錄里面有兩個(gè)目錄,libs 和 plugins,libs 里面我們放一些常用的類庫(kù),plugins 里面存放我們自定義的業(yè)務(wù)插件,我們所有的業(yè)務(wù)都采用插件機(jī)制來(lái)開發(fā)。 下圖是我們項(xiàng)目中目前使用到的插件。

 

7.png

 

稍微解釋一下,我們項(xiàng)目的入口域名有兩個(gè),一個(gè)是提供給 openApi 訪問(wèn)的,認(rèn)證插件使用的是 Basic Auth,一個(gè)是提供給 web 瀏覽器訪問(wèn)的,認(rèn)證插件使用的是 web auth(cookie 認(rèn)證)。

 

對(duì)應(yīng) OpenResty 的請(qǐng)求處理流程,我們的插件主要集中在 access 和 log 階段

 

插件 階段 描述
ip-restriction access_by_lua ip 限流,使用 apisix 原生插件
basic-auth access_by_lua 對(duì) openApi 請(qǐng)求用戶鑒權(quán),自研插件
web-auth access_by_lua 對(duì) webApi 請(qǐng)求用戶鑒權(quán),自研插件
limit-rate access_by_lua 對(duì)請(qǐng)求實(shí)現(xiàn)用戶級(jí)別和用戶+請(qǐng)求參數(shù)級(jí)別的限流,自研插件
proxy-rewrite access_by_lua,balancer_by_lua 對(duì)請(qǐng)求進(jìn)行轉(zhuǎn)發(fā),設(shè)置接口級(jí)別的超時(shí)時(shí)間,自研插件
log log_by_lua 將請(qǐng)求日志記錄到 kafka,再通過(guò) logstash 讀到 es 中,自研插件
alarm log_by_lua 根據(jù)響應(yīng)的 statusCode 來(lái)報(bào)警,自研插件

 

2、Etcd 緩存對(duì)象

etcd 緩存對(duì)象的原理是利用 etcd 的 watch 功能,將數(shù)據(jù)從 etcd 緩存到內(nèi)存對(duì)象中,業(yè)務(wù)使用的時(shí)候直接從內(nèi)存中讀取,避免網(wǎng)絡(luò) io 消耗,etcd 的 watch 功能又保障了數(shù)據(jù)的實(shí)時(shí)性,Apache APISIX 的這一特性,簡(jiǎn)直是讓人拍案叫絕。

 

上線后遇到的問(wèn)題

crontab 清理日結(jié)

由于我們網(wǎng)關(guān)部署在容器,運(yùn)行一段時(shí)間之后,日志文件超過(guò)了默認(rèn)的配額 50G,后來(lái)我們?cè)阽R像里面默認(rèn)安裝了 cron 和 logrotate,然后在容器 entrypoint 里面開啟了 cron 用來(lái)解決這個(gè)問(wèn)題。

 

感謝

最后特別感謝一下 Apache APISIX 的貢獻(xiàn)者們,貼出 Apache APISIX 官網(wǎng)[2] 和 Apache APISIX Github 地址[3]

References

[1] etcd 官方文檔: https://doczhcn.gitbook.io/etcd/index

[2] Apache APISIX 官網(wǎng): https://apisix.apache.org/

[3] Apache APISIX Github 地址: https://github.com/apache/apisix

以上就是本次分享的內(nèi)容~

如果有什么建議,也可以在我們?cè)u(píng)論區(qū)留言,供大家參考學(xué)習(xí)。