天天看點

API網關遇上容器服務

在api經濟和微服務的背景下,如何對服務的api進行管理是大家都很感興趣的話題。本文通過利用阿裡雲的容器服務和api網關,建構一個完整的基于docker的具有api管理功能的服務。

假定我們需要這麼一個經典的後端服務,通路如下api接口的時候傳回hello world:

這個服務推出後廣受歡迎,但是煩惱總是伴随幸福不期而至:

對api進行計費怎麼做?

外界通路api的流量太高了,如何進行流量控制?

外界通路api的并發連接配接太多了,能不能把這許多連接配接合成一個長連接配接通路服務?

如何對api進行保護,讓隻有授權的應用才能通路api?

... ...

這實際上涉及到了api管理的内容,并且很多和業務邏輯無關。是否可以利用雲上的paas服務來完成呢?

openresty是基于nginx和luajit的web應用架構。實作我們的這個經典服務隻需要nginx.conf配置檔案做如下聲明即可:

在本地啟動openresty後通路:

後端服務就成了。

建構docker鏡像的dockerfile内容如下:

容器啟動時為其增加了<code>daemon off</code>設定,這讓nginx程序一直在前台運作,保證容器不退出。

部署到阿裡雲容器服務需要定義docker-compose.yml,這個檔案和标準的docker compose部署模版檔案完全相容,隻不過增加了一些阿裡雲特有的label。比如:

<code>aliyun.lb.port_8080: http://${slbname}:8080</code>

這個label的意思是把openresty應用對外通過負載均衡8080端口暴露出來。

我們的測試叢集是運作在經典網絡中,開通一個内網阿裡雲負載均衡,并添加http 8080到8080的監聽器。上面的部署檔案講hello服務通過這個負載均衡對外提供服務,通路端點為負載均衡的阿裡雲内網位址,如下圖:

API網關遇上容器服務

這個位址會用來配置api網關中對後端的通路,請記好。

API網關遇上容器服務

在這個分組中建立api:

API網關遇上容器服務

對後端的通路位址為如下形式:

api對外路徑定義為<code>/api</code>,如下圖所示:

API網關遇上容器服務

把api釋出成功後可以進入<code>調試api</code>進行測試:

API網關遇上容器服務

慶祝一下,我們的服務對外提供api了。

在應用程式能夠通路我們的api之前,我們還需要在api網關控制台上生成應用通路所需要的token。

在控制台建立一個新的應用:

API網關遇上容器服務

授權該應用可以通路我們的經典服務:

API網關遇上容器服務

進入appkey頁面,記錄下<code>appkey</code>和<code>appsecret</code>

API網關遇上容器服務

進入分組管理頁面,記錄下api對外的二級域名:

API網關遇上容器服務

這三個資訊是應用程式通路api所需的端點和認證資訊,我們馬上要把它們填入到程式中。

下面我們可以建構一個通路api的應用示例。通路sdk下載下傳頁面,可以看到很多語言的示例。

API網關遇上容器服務

在democlient的主程式中聲明3個變量表示前面拿到的三個資訊:appkey,appsecret和分組二級域名(api_host)。

把三個參數代入到http請求中:

為了不把apikey和apisecret等敏感資訊寫死到程式裡,我們采用在環境變量中指定的方式:

為了友善示例程式的建構,我們使用gradle。

運作如下指令可以建構一個包含所有依賴的uber jar:

這個指令的意思是建構jar包,但不執行測試。我們的示例client的測試代碼都需要填寫apikey和apisecret等資訊,沒有的話測試會失敗。為了不影響建構jar包,我們編譯的時候忽略測試。

建構成功後,執行如下指令運作demo client:

把前面得到的資訊分别填入,可以看到如下執行結果:

bingo,通路應用成功調用了雲上的api。

本文示範了如何利用阿裡雲的api網關管理背景docker應用api,和讀者探讨了如何利用api網關和caas的能力為服務提供api管理功能。