Kong代理配置(二)

1、簡(jiǎn)介

在本文中,我們將通過詳細(xì)解釋Kong的路由功能和內(nèi)部工作機(jī)制來介紹它的代理功能。
可以通過修改Kong的兩個(gè)配置來處理它暴露的接口:

  • proxy_listen:定義一個(gè)地址/端口列表,Kong將在這些地址/端口上接受來自客戶端的公共流量,并將其代理到您的上游服務(wù)(默認(rèn)為8000個(gè))。
  • admin_listen:定義了地址和端口的列表,但是這些應(yīng)該被限制為只能由管理員訪問,因?yàn)樗鼈儽┞读薑ong的配置功能:Admin API(默認(rèn)為8001)。

2、術(shù)語(yǔ)

  • client:請(qǐng)求訪問Kong的代理端口的下游客戶端。
  • upstream service:Kong后端的API或service,提供給client訪問。
  • Service:對(duì)upstream service的抽象。
  • Route:對(duì)應(yīng)Kong中的Route組件。是kong的訪問的,匹配改Route規(guī)則的請(qǐng)求將被路由到后端的Service。
  • Plugin:對(duì)應(yīng)Kong中的Plugin組件,屬于業(yè)務(wù)邏輯的一部分將運(yùn)行在整個(gè)代理過程的生命周期中。

3、如何配置service(回顧)

在Kong中注冊(cè)服務(wù)需要使用Admin API進(jìn)行處理,及訪問8001端口的RestFul接口。

3.1、創(chuàng)建服務(wù)

curl -i -X POST http://localhost:8001/services/ \
    -d 'name=foo-service' \
    -d 'url=http://foo-service.com'

3.2、配置路由

curl -i -X POST http://localhost:8001/routes/ \
    -d 'hosts[]=example.com' \
    -d 'paths[]=/foo' \
    -d 'service.id=d54da06c-d69f-4910-8896-915c63c270cd' # 上一條命令執(zhí)行之后訪問的服務(wù)的id

4、路由和匹配能力

Kong支持Http/https、TCL/TLS和GRPC/GRPCS協(xié)議的代理;每種協(xié)議具有不同的路由屬性:

  • http: methods, hosts, headers, paths (and snis, if https)
  • tcp: sources, destinations (and snis, if tls)
  • grpc: hosts, headers, paths (and snis, if grpcs)

以上三個(gè)屬性都是可選的,但是至少需要設(shè)置一個(gè)屬性。
路由匹配規(guī)則:

  1. 請(qǐng)求必須包含在添加路由時(shí)設(shè)置的所有屬性
  2. 請(qǐng)求中所包含的屬性值至少得有一個(gè)和配置得屬性值相同,如果請(qǐng)求中包含所有配置得屬性則必須和配置得屬性值相同才標(biāo)識(shí)為匹配上。

如:

  1. 定義一個(gè)路由
{
    "hosts": ["example.com", "foo-service.com"],
    "paths": ["/foo", "/bar"],
    "methods": ["GET"]
}
  1. 匹配的請(qǐng)求
# 攜帶有所有配置的屬性,則值必須和對(duì)應(yīng)的屬性匹配上才能說明滿足該Route
GET /foo HTTP/1.1
Host: example.com
  1. 不匹配的請(qǐng)求
POST /foo HTTP/1.1    # 請(qǐng)求的類型不匹配
Host: example.com

4.1、路由匹配模式

  1. 請(qǐng)求頭
    從1.3開始,kong提供了對(duì)任意Http請(qǐng)求頭的支持。不過一般都是使用Host請(qǐng)求頭進(jìn)行處理。通過Kong提供的hosts屬性可以輕松的實(shí)現(xiàn)使用基于Host請(qǐng)求頭的路由配置。

hosts屬性可以接受多個(gè)值,多個(gè)值采用","分隔,如下使用Admin API來進(jìn)行配置:

curl -i -X POST http://localhost:8001/routes/ \
    -H 'Content-Type: application/json' \
    -d '{"hosts":["example.com", "foo-service.com"]}'

或者采用表單的方式:

curl -i -X POST http://localhost:8001/routes/ \
    -d 'hosts[]=example.com' \
    -d 'hosts[]=foo-service.com'

除了使用確定的值進(jìn)行配置意外,Kong還提供了使用通配符的方式進(jìn)行配置,通配符主機(jī)名在域的最左邊或最右邊的標(biāo)簽上只能包含一個(gè)星號(hào)。例子:

  • *.example.com:即以example.com結(jié)尾的host都將匹配該路由
  • example.*:即以example開頭的都將匹配該路由
  1. 路徑
    kong也支持通過請(qǐng)求路由的匹配規(guī)則,即請(qǐng)求路徑的前綴必須至少一個(gè)匹配添加路由時(shí)設(shè)置的paths屬性值。例子:
{
    "paths": ["/service", "/hello/world"]
}
# 請(qǐng)求的前綴為/service,匹配
GET /service/resource?param=value HTTP/1.1
Host: example.com

# 請(qǐng)求的前綴為/hello,不匹配
GET /hello/world/resource HTTP/1.1
Host: anything.com

除了等值的匹配意外,基于path的模式也支持正則表達(dá)式的方式,例子:

{
    "paths": ["/users/\d+/profile", "/following"]   # \d+ 標(biāo)識(shí)匹配一個(gè)或多個(gè)數(shù)字
}
GET /users/123/profile HTTP/1.1
Host: ...

基于請(qǐng)求前綴的匹配模式,Kong通過前綴的長(zhǎng)度來處理匹配的優(yōu)先級(jí):即長(zhǎng)度越長(zhǎng)的先進(jìn)行匹配。并且也可以在添加路由的時(shí)候通過設(shè)置regex_priority屬性來設(shè)置優(yōu)先級(jí)(數(shù)字越大優(yōu)先級(jí)越高),同時(shí)正則表達(dá)的優(yōu)先級(jí)高于前綴。例子:

[
    {
        "paths": ["/status/\d+"],
        "regex_priority": 0
    },
    {
        "paths": ["/version/\d+/status/\d+"],
        "regex_priority": 6
    },
    {
        "paths": ["/version"],
    },
    {
        "paths": ["/version/any/"],
    }
]

匹配順序:

  1. /version/\d+/status/\d+
  2. /status/\d+
  3. /version/any/
  4. /version

4.2、優(yōu)先級(jí)

路由可以根據(jù)其標(biāo)頭、主機(jī)、路徑和方法(加上安全路由的snis——“https”、“grpcs”、“tls”)字段定義匹配規(guī)則。要使傳入請(qǐng)求與路由匹配,必須滿足所有現(xiàn)有字段。但是,Kong允許使用包含相同值的字段來配置兩個(gè)或多個(gè)路由,從而提供了相當(dāng)大的靈活性——在這種情況下,Kong應(yīng)用優(yōu)先級(jí)規(guī)則。

  1. 在評(píng)估請(qǐng)求時(shí),Kong將首先嘗試匹配具有最多規(guī)則的路由,例子:
{
    "hosts": ["example.com"],
    "service": {
        "id": "..."
    }
},
{
    "hosts": ["example.com"],
    "methods": ["POST"],
    "service": {
        "id": "..."
    }
}

因?yàn)榈诙€(gè)路由的規(guī)則比較多,所有kong優(yōu)先選擇該路由進(jìn)行匹配。

  1. 加入兩個(gè)路由的規(guī)則數(shù)量相同,滿足一下規(guī)則是將優(yōu)先選擇A:
  • A只有“普通”主機(jī)報(bào)頭,B有一個(gè)或多個(gè)“通配符”主機(jī)報(bào)頭
  • A的非主機(jī)頭信息比B多
  • A至少有一個(gè)“regex”路徑,而B只有“plain”路徑。
  • A的路徑比B的路徑長(zhǎng)
  • A.created_at < B.created_at
最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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