使用Docker配置基于0.14.x版本kong做為api網(wǎng)關(guān)

在升級(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.comapi.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.comapi.service.com的請(qǐng)求轉(zhuǎn)到到我們的Kong集群上,也就是我們上面一節(jié)中通過Nginx配置的請(qǐng)求地址
那么,當(dāng)我們請(qǐng)求api.example.com/loginapi.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"
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容