一 术语
(1)Routes、Services、Upstreams、Targets关系
请求'流向':Route --> Service -->[Upstream] --> Target
注意: '对应'关系
Kong 的'六'大核心对象:Upstream、Target、Service、Route、Consumer、Plugins
(2)Kong 网关对于一个请求的处理流程
1) 客户端访问'kong网关ip地址' + '代理端口' + '请求路径'
备注: http默认为'8000',https默认为'8443'
2) 对于'client客户端'的请求,先由'Routes路由规则'匹配客户端的请求规则
3) 匹配'成功(success)'后分配相应的'Service层'
备注:一个'Route路由'指向一个'Service',但是一个Service可以被多个不同规则的'Routes'指向
4) Service服务是一个'抽象'服务层,可以用于指向具体的'target',也可以指向'upstream'
备注: Service指向upstream,upstream'指向多个target',相当于实现'负载均衡'的效果
补充: Target是'后端'服务,用'ip:port'表示
(3)端口问题
1)proxy_listen:kong网关用于'接收客户端'的流量入口,默认是'0.0.0.0:8000'
2)admin_listen:提供给'管理员'使用,默认值是'127.0.0.1:8001'
应用场景: 'konga的(管理)Resuful Api'的调用端口
(4)Service
注意: 哪些是'Required'? 哪些是'Optional可选的'?
1) 服务'实体'是每个'上游服务'的'抽象'
2) Service 的主要属性是其URL -->'Kong应该将流量代理到的地方'
补充:可以设置为'单个字符串',也可以'单独指定'其protocol、 host、 port 和 path
3) Service 与 router '相关联',一个 Service 可以有许多'与之关联'的Router
补充:
[1] Router 是Kong的'入口点',并定义匹配客户端请求的规则
[2] 一旦 Router 匹配,Kong就会将请求'代理'到其'关联'的服务
备注: 一般'host'配置的是'upstream_name'或者'具体的target'
① tags参数解读
(5)Routes
1) 路由实体定义规则以'匹配客户端请求';
2)每个Route与一个服务相关联,一个'服务(Service)'可能有'多个与之关联'的'路由(Route)';
3)匹配'给定路由'的'每个请求'都将'代理到'其关联的服务;
4)Routes 和 Services 的组合[以及它们之间的'关注点分离']提供了一种强大的路由机制
5)通过它可以在 Kong 中定义'细粒度的入口点',从而导致基础架构的'不同'上游服务
下面图示说明: '至少'必须指定其中的'一个'
+++++++++ "创建Routes" +++++++++
点击 'You can only create routes from a service page' -> 选择一个Servcie
参数核心: 从请求的'哪些维度'来匹配这条'Routes'
细节点: 可以'和路由route匹配'的有两类 -->'service'和'plugin'
实质: 拿'用户的相关请求信息'与'Routes信息'进行匹配
常用'字段':
1)'paths(用户的请求匹配匹配该路由的路径)' --> "必设" -->类似'nginx的location'
2)'hosts(匹配该路由的域名列表)'
eg : curl -H '域名' http://kong_ip:porxy_port/url
细节: -d '{"hosts":["wzj.com", "shell.com"]}'
解读: hosts属性可以接受'多个值',多个值采用","分隔;也支持'前或后通配符号*'
3) 'name(该条路由的标识)'、
4)'service(与这条Route关联的服务)'
重点: 多个'条件'同时满足,'用户的请求'才能匹配上该'Routes'
大白话: 要使传入请求与路由匹配,'必须满足所有'现有字段
+++++++++++ "不常用的" +++++++++++
1)methods '限制请求方法(GET、POST、DELETE、PATCH等)'
2)regex_priority 路由请求的'优先级','数字越大优先级越高',默认为0
strip_path字段和path_handling字段联动关系
含义: 这'两个字段'设置是用来决定你访问的'真实路径'的
eg:paths =/myPath,strip_path=true,path_handling=v0,
最终: 你service配置的url是'http://www.baidu.com';
① 优先级的问题1
1) kong之涉及'前缀(就是空)'和'正则(~)'匹配
备注: kong不涉及'nginx 中location 复杂的 =和^~'等符号
2) kong 中也是'前缀路径'总是比'正则表达式'优先评估
3)regex_priority 属性从高到低'评估正则表达式'的优先级
补充: 掌握'优先级'是为了'避免多个Routes同时满足(但是其对应的Service不同)',导致'异常'
② 优先级问题2
假定: 路由的规则数'相同',都只有'paths'
[
{
"paths": ["/status/\d+"],
"regex_priority": 0
},
{
"paths": ["/version/\d+/status/\d+"],
"regex_priority": 6
},
{
"paths": ["/version"],
},
{
"paths": ["/version/6"],
}
]
+++++++++++++ "假定: 请求都能匹配这些路由, 则匹配顺序" +++++++++++++
客户端的'请求url': /version/6/status/10
/version/\d+/status/\d+
/status/\d+
/version/6
/version
说明: 最'常见'前缀的问题
③ 优先级问题3
1)如果:'路由规则'数目不同
出发点: '规则'越细,规则'越多',则越倾向于'匹配'
匹配规则: kong将首先尝试匹配'具有最多规则'的路由
2)如果:'路由规则'数量相同,优先'选择A'的场景
A只有"普通"主机报头,B有一个或多个"通配符"主机报头
A的'非主机头信息'比B多
A至少有一个"regex"路径,而B只有"plain"路径
A的'路径'比B的路径长
A.created_at < B.created_at
(6)kong的日志
+++++++++++++ "修改日志格式" +++++++++++++
/usr/local/share/lua/5.1/kong/templates/kong_defaults.lua
/usr/local/share/lua/5.1/kong/templates/nginx_kong.lua -->'修改的地方'
备注: 测试环境可以修改'日志级别(debug 看匹配的路由)'或者'日志格式'帮助我们定位问题
① 默识
1)'无法'通过修改'/usr/local/kong/nginx.conf'来修改日志
2)kong网关启动时'通过模板渲染方式'生成的,每次'重启'都会'重新'生成
思考: '默认'的日志格式?->实际在这里'看'/usr/local/kong/nginx-kong.conf
② 修改日志格式
# 添加log_format日志格式
log_format main 'remote_addr=[$remote_addr] http_x_forward=[$http_x_forwarded_for] time=[$time_local] request=[$request] '
'status=[$status] byte=[$bytes_sent] elapsed=[$request_time] upstream_connect_time=[$upstream_connect_time] upstream_header_time=[$upstream_header_time] upstream_response_time=[$upstream_response_time] upstream_addr=[$upstream_addr] upstream_status=[$upstream_status] ' 'refer=[$http_referer] ua=[$http_user_agent] gzip=[$gzip_ratio] ' 'msec=[$msec] http_host=[$http_host] http_accept=[$http_accept|$http_accept_encoding|$http_accept_language]';
③ 效果展示
ping ok,curl/telnet 访问 ip+port 报not route to host 一般是firewalld防火墙
④ admin的日志
说明: 所有'通过' kong 的请求,都会'添加'一定的 header
(8)添加多个path路径
通过kong命令'Routes添加多个path路径'时,是这样的:
--data 'paths[]=/myPath&paths[]=/test'
注意: 而'不是加,'的方式
(9) 官方如何注入nginx指令
1) 可能通过'注入nginx指令',将'自定义的格式'添加到kong.conf文件中
2) 任何带有nginx_http_、nginx_proxy_、nginx_admin_'前缀'的配置
说明:kong在'启动后'将通过'删除前缀'而转换为'等效的Nginx指令',添加到nginx配置的部分
3) kong.conf中常见'前缀'指令
[1] nginx_http_ --> 注入到'整个http块'指令中
说明: 在'kong.conf增加'如下配置:
nginx_proxy_large_client_header_buffers=16 128k
启动kong后,在'nginx-kong.conf中'的server模块'增加'如下代码:
large_client_header_buffers 16 128k;
[2] nginx_proxy_ --> 注入到kong'代理端口'的服务模块中
[3] nginx_admin_ --> 注入到kong的admin 'API接口'的服务模块中