在升級以后整個結構全部變了,以前0.8版本的配置完全不能用了
原文地址http://www.wantchalk.com/c/sa/gateway/2018/11/26/kong-getway-configuration.html
我是從0.8開始使用kong的,當時公司幾十個微服務,有java,ruby,python等等大大小小一堆項目,最后全部掛到kong上,然后統(tǒng)一用oauth插件來鑒權,
供給web端,手機端,微信后臺等等來調用, 整個做下來非常滿意,雖然維護不是很方便,需要手工去記一些配置信息,并且沒有后臺,所有的管理也是通過api,只能用nginx的ip屏蔽(只開放公司ip訪問kong的admin)來確保kong的admin的安全性.一直很穩(wěn)定,這次有新的項目,直接就拿來用,一看原來的kong都沒了,域名換了
產品的名字換了(現(xiàn)在分免費版本Kong CE和收費版本Kong Enterprise),連原來的結構也變了,沒辦法,再折騰一次
Content
- 1.實驗環(huán)境
- 2.重要概念
- 3.新建一個api服務的過程實例
1.實驗環(huán)境
- aliyun容器服務集群
- kong版本0.14.x
2.重要概念
變化還真大,之前用的0.8,那時候的概念主要是API, consumers, 一年沒折騰回來一看,大變化.
當前版本(0.14以后)kong的Service和Route
從0.13開始 kong就棄用的api改用service來組織api
- 增加了service Route Upstream Target
- service 相當于原來的api,但是沒有路由信息,可以直接掛載物理host,也可以掛一個Upstream的host
- Route就是專門定義外部訪問的分發(fā)hosts,strip_path,preserve_host,protocols,甚至method都在這里定義,和service關聯(lián)
- Upstream,這個是新東西,一個虛擬的后端服務, 需要結合Target一起使用, 好處是可以在這里就完成負載均衡,還有健康檢查
- 給Upstream添加實際的物理節(jié)點,實現(xiàn)的負載均衡
具體解釋
1.Service:
Service 顧名思義萤捆,就是我們自己定義的上游服務宾毒,通過Kong匹配到相應的請求要轉發(fā)的地方
Service 可以與下面的Route進行關聯(lián)线梗,一個Service可以有很多Route,匹配到的Route就會轉發(fā)到Service中棍丐,
當然中間也會通過Plugin的處理舔稀,增加或者減少一些相應的Header或者其他信息
Service可以是一個實際的地址露泊,也可以是Kong內部提供的upstream object
2.Route:
Route 字面意思就是路由,實際就是我們通過定義一些規(guī)則來匹配客戶端的請求乖阵,每個路由都會關聯(lián)一個Service,
并且Service可以關聯(lián)多個Route宣赔,當匹配到客戶端的請求時,每個請求都會被代理到其配置的Service中
Route作為客戶端的入口瞪浸,通過將Route和Service的松耦合拉背,可以通過hosts path等規(guī)則的配置,最終讓請求到不同的Service中
例如默终,我們規(guī)定api.example.com
和 api.service.com
的登錄請求都能夠代理到123.11.11.11:8000
端口上椅棺,那我們可以通過hosts和path來路由
首先,創(chuàng)建一個Service s1齐蔽,其相應的host和port以及協(xié)議為http://123.11.11.11:8000
然后两疚,創(chuàng)建一個Route,關聯(lián)的Service為s1含滴,其hosts為api.service.com, api.example.com
,path為login
最后诱渤,將域名api.example.com
和api.service.com
的請求轉到到我們的Kong集群上,也就是我們上面一節(jié)中通過Nginx配置的請求地址
那么谈况,當我們請求api.example.com/login
和api.service.com/login
時勺美,其通過Route匹配递胧,然后轉發(fā)到Service,最終將會請求我們自己的服務赡茸。
3.Upstream:
這是指您自己的API /服務位于Kong后面缎脾,客戶端請求被轉發(fā)到該服務器。
相當于Kong提供了一個負載的功能占卧,基于Nginx的虛擬主機的方式做的負載功能
當我們部署集群時遗菠,一個單獨的地址不足以滿足我們的時候,我們可以使用Kong的upstream來進行設置
首先在service中指定host的時候华蜒,可以指定為我們的upstream定義的hostname
我們在創(chuàng)建upstream時指定名字辙纬,然后指定solts(暫時不確定具體作用),upstream可以進行健康檢查等系列操作叭喜。這里先不開啟(還沒有研究)
然后我們可以再創(chuàng)建target類型贺拣,將target綁定到upstream上,那么基本上我們部署集群時捂蕴,也可以使用
4.Target:
target 就是在upstream進行負載均衡的終端纵柿,當我們部署集群時,需要將每個節(jié)點作為一個target启绰,并設置負載的權重昂儒,當然也可以通過upstream的設置對target進行健康檢查。
當我們使用upstream時委可,整個路線是 Route >> Service >> Upstream >> Target
5.API:
用于表示您的上游服務的傳統(tǒng)實體渊跋。自0.13.0起棄用服務。這里就不在深入了解
6.Consumer:
Consumer 可以代表一個服務着倾,可以代表一個用戶拾酝,也可以代表消費者,可以根據我們自己的需求來定義
可以將一個Consumer對應到實際應用中的一個用戶卡者,也可以只是作為一個Service的請求消費者
Consumer具體可以在Plugin使用時再做深入了解
7.Plugin:
在請求被代理到上游API之前或之后執(zhí)行Kong內的動作的插件蒿囤。
例如,請求之前的Authentication或者是請求限流插件的使用
Plugin可以和Service綁定崇决,也可以和Route以及Consumer進行關聯(lián)材诽。
具體的使用可以根據在創(chuàng)建Plugin以及后面的修改時,具體與Consumer恒傻,Service脸侥,Route綁定關系時,可參考
3.新建一個api服務的過程實例
以下請求摘自postman里,直接復制的
1.添加service
請求
curl -X POST \
http://kong.admin.example.com/services \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Postman-Token: d83730eb-e0c5-4d8e-aa88-326b26fc6dd1' \
-d 'name=igw_dev_http&host=igw-node-server-development&port=3000&protocol=http&read_timeout=60000&write_timeout=60000'
響應
{
"host": "igw-node-server-development",
"created_at": 1535959703,
"connect_timeout": 60000,
"id": "1234567890qazwsx",
"protocol": "http",
"name": "igw_dev_http",
"read_timeout": 60000,
"port": 3000,
"path": null,
"updated_at": 1535959703,
"retries": 5,
"write_timeout": 60000
}
2.添加 route
請求
curl -X POST \
http://kong.admin.example.com/routes/ \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Postman-Token: 5e44a8dc-e457-4af3-b11f-be4d8c0236bf' \
-d 'protocols%5B%5D=http&methods%5B%5D=GET&methods%5B%5D=POST&hosts%5B%5D=igw.dev.example.com&strip_path=false&preserve_host=true&service.id=1234567890qazwsx'
響應
{
"created_at": 1535962443,
"strip_path": false,
"hosts": [
"igw.dev.example.com"
],
"preserve_host": true,
"regex_priority": 0,
"updated_at": 1535962443,
"paths": null,
"service": {
"id": "1234567890qazwsx"
},
"methods": [
"GET",
"POST"
],
"protocols": [
"http"
],
"id": "1234567890qwertyuiop"
}
3.新的添加route的方法
之后所有的api走同一個域名的不同path,這樣可以節(jié)約ssl證書,都在api.example.com下
請求
curl -X POST \
http://kong.admin.example.com/routes/ \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Postman-Token: 0a4f4173-e4fa-4fe0-b3e5-20ef5363bdbe' \
-H 'cache-control: no-cache' \
-d 'protocols%5B%5D=http&protocols%5B%5D=https&methods%5B%5D=GET&methods%5B%5D=POST&methods%5B%5D=PUT&methods%5B%5D=DELETE&methods%5B%5D=PATCH&methods%5B%5D=HEAD&hosts%5B%5D=api.example.com&strip_path=true&preserve_host=true&service.id=1234567890qazwsx&paths%5B%5D=%2Figw&undefined='
響應
{
"created_at": 1543224681,
"strip_path": true,
"hosts": [
"api.example.com"
],
"preserve_host": true,
"regex_priority": 0,
"updated_at": 1543224681,
"paths": [
"/igw"
],
"service": {
"id": "1234567890qazwsx"
},
"methods": [
"GET",
"POST",
"PUT",
"DELETE",
"PATCH",
"HEAD"
],
"protocols": [
"http",
"https"
],
"id": "23456789ertyuiop"
}