在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對外路徑定義為<code>/api</code>,如下圖所示:
把api釋出成功後可以進入<code>調試api</code>進行測試:
慶祝一下,我們的服務對外提供api了。
在應用程式能夠通路我們的api之前,我們還需要在api網關控制台上生成應用通路所需要的token。
在控制台建立一個新的應用:
授權該應用可以通路我們的經典服務:
進入appkey頁面,記錄下<code>appkey</code>和<code>appsecret</code>
進入分組管理頁面,記錄下api對外的二級域名:
這三個資訊是應用程式通路api所需的端點和認證資訊,我們馬上要把它們填入到程式中。
下面我們可以建構一個通路api的應用示例。通路sdk下載下傳頁面,可以看到很多語言的示例。
在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管理功能。