在升級(jí)以后整個(gè)結(jié)構(gòu)全部變了,以前0.8版本的配置完全不能用了
原文地址http://www.wantchalk.com/c/sa/gateway/2018/11/26/kong-getway-configuration.html
我是從0.8開始使用kong的,當(dāng)時(shí)公司幾十個(gè)微服務(wù),有java,ruby,python等等大大小小一堆項(xiàng)目,最后全部掛到kong上,然后統(tǒng)一用oauth插件來鑒權(quán),
供給web端,手機(jī)端,微信后臺(tái)等等來調(diào)用, 整個(gè)做下來非常滿意,雖然維護(hù)不是很方便,需要手工去記一些配置信息,并且沒有后臺(tái),所有的管理也是通過api,只能用nginx的ip屏蔽(只開放公司ip訪問kong的admin)來確保kong的admin的安全性.一直很穩(wěn)定,這次有新的項(xiàng)目,直接就拿來用,一看原來的kong都沒了,域名換了
產(chǎn)品的名字換了(現(xiàn)在分免費(fèi)版本Kong CE和收費(fèi)版本Kong Enterprise),連原來的結(jié)構(gòu)也變了,沒辦法,再折騰一次
Content
- 1.實(shí)驗(yàn)環(huán)境
- 2.重要概念
- 3.新建一個(gè)api服務(wù)的過程實(shí)例
1.實(shí)驗(yàn)環(huán)境
- aliyun容器服務(wù)集群
- kong版本0.14.x
2.重要概念
變化還真大,之前用的0.8,那時(shí)候的概念主要是API, consumers, 一年沒折騰回來一看,大變化.
當(dāng)前版本(0.14以后)kong的Service和Route
從0.13開始 kong就棄用的api改用service來組織api
- 增加了service Route Upstream Target
- service 相當(dāng)于原來的api,但是沒有路由信息,可以直接掛載物理host,也可以掛一個(gè)Upstream的host
- Route就是專門定義外部訪問的分發(fā)hosts,strip_path,preserve_host,protocols,甚至method都在這里定義,和service關(guān)聯(lián)
- Upstream,這個(gè)是新東西,一個(gè)虛擬的后端服務(wù), 需要結(jié)合Target一起使用, 好處是可以在這里就完成負(fù)載均衡,還有健康檢查
- 給Upstream添加實(shí)際的物理節(jié)點(diǎn),實(shí)現(xiàn)的負(fù)載均衡
具體解釋
1.Service:
Service 顧名思義,就是我們自己定義的上游服務(wù),通過Kong匹配到相應(yīng)的請(qǐng)求要轉(zhuǎn)發(fā)的地方
Service 可以與下面的Route進(jìn)行關(guān)聯(lián),一個(gè)Service可以有很多Route,匹配到的Route就會(huì)轉(zhuǎn)發(fā)到Service中,
當(dāng)然中間也會(huì)通過Plugin的處理,增加或者減少一些相應(yīng)的Header或者其他信息
Service可以是一個(gè)實(shí)際的地址,也可以是Kong內(nèi)部提供的upstream object
2.Route:
Route 字面意思就是路由,實(shí)際就是我們通過定義一些規(guī)則來匹配客戶端的請(qǐng)求,每個(gè)路由都會(huì)關(guān)聯(lián)一個(gè)Service,
并且Service可以關(guān)聯(lián)多個(gè)Route,當(dāng)匹配到客戶端的請(qǐng)求時(shí),每個(gè)請(qǐng)求都會(huì)被代理到其配置的Service中
Route作為客戶端的入口,通過將Route和Service的松耦合,可以通過hosts path等規(guī)則的配置,最終讓請(qǐng)求到不同的Service中
例如,我們規(guī)定api.example.com 和 api.service.com的登錄請(qǐng)求都能夠代理到123.11.11.11:8000端口上,那我們可以通過hosts和path來路由
首先,創(chuàng)建一個(gè)Service s1,其相應(yīng)的host和port以及協(xié)議為http://123.11.11.11:8000
然后,創(chuàng)建一個(gè)Route,關(guān)聯(lián)的Service為s1,其hosts為api.service.com, api.example.com,path為login
最后,將域名api.example.com和api.service.com的請(qǐng)求轉(zhuǎn)到到我們的Kong集群上,也就是我們上面一節(jié)中通過Nginx配置的請(qǐng)求地址
那么,當(dāng)我們請(qǐng)求api.example.com/login和api.service.com/login時(shí),其通過Route匹配,然后轉(zhuǎn)發(fā)到Service,最終將會(huì)請(qǐng)求我們自己的服務(wù)。
3.Upstream:
這是指您自己的API /服務(wù)位于Kong后面,客戶端請(qǐng)求被轉(zhuǎn)發(fā)到該服務(wù)器。
相當(dāng)于Kong提供了一個(gè)負(fù)載的功能,基于Nginx的虛擬主機(jī)的方式做的負(fù)載功能
當(dāng)我們部署集群時(shí),一個(gè)單獨(dú)的地址不足以滿足我們的時(shí)候,我們可以使用Kong的upstream來進(jìn)行設(shè)置
首先在service中指定host的時(shí)候,可以指定為我們的upstream定義的hostname
我們?cè)趧?chuàng)建upstream時(shí)指定名字,然后指定solts(暫時(shí)不確定具體作用),upstream可以進(jìn)行健康檢查等系列操作。這里先不開啟(還沒有研究)
然后我們可以再創(chuàng)建target類型,將target綁定到upstream上,那么基本上我們部署集群時(shí),也可以使用
4.Target:
target 就是在upstream進(jìn)行負(fù)載均衡的終端,當(dāng)我們部署集群時(shí),需要將每個(gè)節(jié)點(diǎn)作為一個(gè)target,并設(shè)置負(fù)載的權(quán)重,當(dāng)然也可以通過upstream的設(shè)置對(duì)target進(jìn)行健康檢查。
當(dāng)我們使用upstream時(shí),整個(gè)路線是 Route >> Service >> Upstream >> Target
5.API:
用于表示您的上游服務(wù)的傳統(tǒng)實(shí)體。自0.13.0起棄用服務(wù)。這里就不在深入了解
6.Consumer:
Consumer 可以代表一個(gè)服務(wù),可以代表一個(gè)用戶,也可以代表消費(fèi)者,可以根據(jù)我們自己的需求來定義
可以將一個(gè)Consumer對(duì)應(yīng)到實(shí)際應(yīng)用中的一個(gè)用戶,也可以只是作為一個(gè)Service的請(qǐng)求消費(fèi)者
Consumer具體可以在Plugin使用時(shí)再做深入了解
7.Plugin:
在請(qǐng)求被代理到上游API之前或之后執(zhí)行Kong內(nèi)的動(dòng)作的插件。
例如,請(qǐng)求之前的Authentication或者是請(qǐng)求限流插件的使用
Plugin可以和Service綁定,也可以和Route以及Consumer進(jìn)行關(guān)聯(lián)。
具體的使用可以根據(jù)在創(chuàng)建Plugin以及后面的修改時(shí),具體與Consumer,Service,Route綁定關(guān)系時(shí),可參考
3.新建一個(gè)api服務(wù)的過程實(shí)例
以下請(qǐng)求摘自postman里,直接復(fù)制的
1.添加service
請(qǐng)求
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'
響應(yīng)
{
"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
請(qǐng)求
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'
響應(yīng)
{
"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走同一個(gè)域名的不同path,這樣可以節(jié)約ssl證書,都在api.example.com下
請(qǐng)求
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='
響應(yīng)
{
"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"
}