大家好,我是鴨血粉絲,想起來之前生產發生的事故,阿粉我的內心到現在都還很忐忑不安,今天我們來學習一個 Kong 以及跟你們聊聊做好網關限流控制的重要性。

背景

事情是這樣的,阿粉記得那是一個陽光明媚的早上,窗外一片祥和,整個世界充滿了和諧。誰知九點半的時候突然微信報警消息如狂風暴雨般襲來,讓人猝不及防,原來是線上的一個接口流量突然暴增,而且居高不下,導致部分業務癱瘓,無法使用。

按照正常的用戶量,平常的上班時間不會出現如此大的流量,而且還是在這麼短的時間裏,對比了下往常的數據,發現訪問量飆升幾十倍,爲了不影響正常的用戶,緊急聯繫運維擴容服務器,穩定業務。然後緊急分析問題,一開始以爲是客戶端的 APP 升級出現了問題,導致死循環了,但是問了下終端負責人,並沒有發佈新的 APK。然後事情都這裏想必大家都猜到原因了,沒錯,那就是我們被 DDoS 了。

關於什麼是 DDoS,我想大家都是有經驗的開發人員,應該都知道,不知道的朋友可以在公衆號後臺回覆【安全】,獲取一份 Web 安全相關電子書。

那麼遇到這種情況,我們除了擴容服務器還有哪些解決方案呢?

知乎上有一篇問答,裏面提到有下面幾種方式

  1. 高防服務器
  2. 黑名單
  3. DDoS 清洗
  4. CDN 加速

這幾種方案都有相應的特性,不過阿粉我在這裏想給大家介紹另一種方案,簡單,快速,但是對用戶不友好,那就是採用網關限流。當然不同的業務有不同的特性,需要選擇適合自己的方式,如果是金融證券企業的話還是請第三方專業的公司去做防護。

API 網關 Kong

介紹

Next-Generation API Platform for Multi-Cloud and Hybrid Organizations. Connect all your microservices and APIs with the industry’s most performant, scalable and flexible API platform.

在 Kong 的官網赫然的寫了上面的一句話,翻譯起來有點彆扭,我就不直譯了,大家自己看英文更能理解。簡單來說 Kong 就是下一代的 API 網關,用起來就對了。

Kong 是在客戶端和服務端之間的 API 網關,Kong 作爲網關可以統一轉發請求,並且因爲 Kong 是基於 Nginx 的,所以本身支持水平擴展;另外 Kong 可以對請求做統一的限流,認證和授權管理,而且這些功能都是基於插件式,即插即用,根據自身業務的特性,可以選擇合適的插件來控制相關業務。如果已有的插件不適合,還可以自己開發相應的插件,不過插件的開發是基於 lua 的。

安裝步驟

安裝數據庫

因爲 Kong 的底層存儲是採用 PostgreSQL 9.5+ 或者 Cassandra 3.x.x 的,所以我們在安裝 Kong 之前需要先安裝數據庫,阿粉這裏採用的是 PostgreSQL 9.5,並且服務器是 CentOS7 的版本。

1.使用 yum 安裝依次執行如下命令

~$ yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm 
~$ yum install postgresql95 
~$ yum install postgresql95-server 

在提示安裝y/n 的時候,輸入y 即可。

2.安裝過程很快,沒什麼難度,就不贅述,主要是安裝過後的配置大家需要注意一下,安裝完畢過後,我們初始化一下數據庫,輸入/usr/pgsql-9.5/bin/postgresql95-setup initdb

3.初始化完畢過後,我們設置一下服務,然後啓動即可,輸入如下命令。

~$ systemctl enable postgresql-9.5 
~$ systemctl start postgresql-9.5 

4.到這一步我們 PostgreSQL 的安裝已經完整了,但是爲了後面Kong 能正常的運行起來,我們需要做一些配置,這裏的配置比較重要,網上各種文章說的也都不清不楚,阿粉在多次探索之後終於搞清了其中的緣由,來全場跟着我整齊劃一,先說下我們要做的操作步驟,然後我們再依次完成。

1) 給超級管理員設置密碼:安裝完 PostgreSQL 後,會自動幫我們創建一個 Linux 的用戶 postgres,而且這個用戶默認是 PostgreSQL 的超級管理員。

2) 創建 Kong 的數據存儲環境,包括用戶,密碼和數據庫:因爲我們後面需要啓動Kong ,需要讓 Kong 能訪問到數據庫,所以需要配置數據庫,用戶和密碼。

3) 修改PostgreSQL配置文件

5.我們首先使用命令 su - postgres , 然後輸入 psql,進入 PostgreSQL 的命令行模式,如下圖

6.進入命令行模式過後,我們先後完成上面 1 和 2 的步驟,先修改密碼,輸入\password postgres 如下圖,連續輸入兩次你需要設定的密碼,例如postgres123 一定要記住,後面需要用到這個密碼登錄的。

7.修改完密碼過後,我們進行第二步操作,創建用戶,密碼和數據庫,輸入語句CREATE USER kong WITH PASSWORD 'kong123'; 我這裏因爲之前已經創建過這個用戶了,所以提示已經存在,正常是顯示 CREATE ROLE 的

8.然後再輸入 CREATE DATABASE kong OWNER kong; 創建數據庫,並且把這個數據庫授權給 kong 用戶,輸入 GRANT ALL PRIVILEGES ON DATABASE kong to kong; 同樣的,我這邊已經創建 kong 數據庫了,所以顯示錯誤,正常是可以創建成功的。

9.到這裏,我們在檢查一下是否都創建成功,通過輸入命令 \du 和 \l 來看下

10.如果能看到用戶和數據庫都有的話,那就說明創建成功了,如果沒有說明沒有設置成功,按照上面的操作再仔細來一遍。

11.現在我們再來修改配置文件,我們先退出命令模式,使用命令 \q 然後再輸入exit 即可推到 Linux 的正常模式。我們輸入命令 vim /var/lib/pgsql/9.5/data/pg_hba.conf 來編輯 pg_hba.conf 文件,將最後的幾行設置成如圖所示,也就是將默認的 peer 修改成 md5 。

12.保存退出,使用 systemctl restart postgresql-9.5 重啓服務,這時我們在使用postgres 用戶去登錄一下看看

13.這裏需要我們輸入密碼了,這裏的密碼就是我們上面步驟 1 設定了 postgres123,輸入即可,如果提示psql: FATAL: password authentication failed for user "postgres" 說明密碼不對,如果正常進去,那我們再退出來用設置的 kong用戶再去登錄看看。輸入 psql -U kong -W 再輸入之前 kong 的密碼,如何能正常的如下圖進去說明整個配置都正確。

如果提示 psql: FATAL: Peer authentication failed for user "kong" 可能檢查你的配置文件是否修改,以及修改後是否重啓。

14.最後我們修改一下 postgresql.conf 文件,設置支持遠程訪問,vim /var/lib/pgsql/9.5/data/postgresql.conf ,將 listen_addresses 修改爲下圖一致,然後保存退出,重啓即可。

到這裏,數據庫的部分就已經完成了,總結一個小點,peer 模式的 postgres 用戶不用密碼可以登入,md5 模式下需要密碼才能登入。因爲Kong 是有密碼的遠程登錄,所以我們要配置密碼以及支持遠程訪問。

下面就可以安裝 Kong 了。

安裝 Kong

1.下載 rpm 文件:wget https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-2.0.2.el7.amd64.rpm

2.執行命令

~$ sudo yum install epel-release 
~$ sudo yum install kong-2.0.2.el7.amd64.rpm --nogpgcheck 

有提示輸入 y 就好了

3.修改 kong 配置文件,先拷貝一份配置文件 cp kong.conf.default kong.conf 然後編輯一下對應的數據庫,用戶名和密碼,這裏的用戶名和密碼就是上面配置的 kong 和 kong123

4.調整一下 kong admin api 的訪問地址,後面會用到

5.輸入 kong start 啓動 kong

6.如果出現下面提示,則輸入 kong migrations bootstrap 然後再次啓動 kong

Error: /usr/local/share/lua/5.1/kong/cmd/utils/migrations.lua:16: Database needs bootstrapping or is older than Kong 1.0. 
 
To start a new installation from scratch, run 'kong migrations bootstrap'. 
 
To migrate from a version older than 1.0, migrated to Kong 1.5.0 first. 
If you still have 'apis' entities, you can convert them to Routes and Services 
using the 'kong migrations migrate-apis' command in Kong 1.5.0. 
 
  Run with --v (verbose) or --vv (debug) for more details 

7.檢驗是否安裝成功,輸入curl http://127.0.0.1:8001 如有下面的信息輸出表示安裝成功

至此我們Kong 也安裝好了,下面爲了日後使用方便,我們還需要安裝一個管理頁面,Kong 的管理頁面工具網上有好幾個,比如 Konga,Kong admin ui 等,阿粉這裏也大家介紹的是Kong admin ui。

安裝 Kong Admin UI

我們打開 GitHub 地址 https://github.com/pocketdigi/kong-admin-ui,可以看到提供四種部署方式,

第一種是可以直接使用不用部分,第二種和第三種都是下載使用 Nginx 部署,第四種是採用 docker 進行部署。作爲有經驗的開發人員,阿粉還是採用 docker 進行安裝。直接一行命令搞定即可。Docker 的安裝不是本文的重點,感興趣的可以自行 Google。

安裝完成後打開 8899 端口可以看到如下界面,在 Api url 裏面填入 Kong 的 Api 信息即可,如http://127.0.0.1:8001 然後點擊進入。

進入界面如下:

至此,整個Kong 環境的搭建就已經完成了,剩下的就是使用了,流量控制,授權訪問等更多特性,大家可以自行去嘗試,想想如果當時阿粉就知道了 Kong 是不是就可以避免那一次的事故。

寫在最後

其實這個世界上天才真的很少,大部分人都還沒有到拼智商的地步;作爲普通人我們拼的是努力,拼的是圈子,拼的是對這個世界的認知,接觸更多更厲害的人,你遲早也會厲害起來。

相關文章