kong 怎么根据nacos的服务自动路由,加载服务呢
先梳理逻辑
本文参考:https://my.oschina.net/xiejunbo/blog/4720458
kong api:https://docs.konghq.com/gateway-oss/2.3.x/admin-api/#retrieve-service
kong路由动态控制服务的说明
- 调用kong原生api,进行upstream,target,service,route,plugins等创建,更新,及删除操作
- 由于原生konga上大部分功能都包括,所以不做过多的功能嵌入,以防止配置的复杂性,只需做简单配置
- 此服务皆在于实现服务动态路由,服务动态上下线,服务动态寻址,根据配置动态刷新服务信息等
逻辑说明
- 配置说明
cloudportal-kong-route.yaml中部分配置:
#网关配置存放地址 json
kong:
route:
config:
data-id: kong-router \\路由服务配置id,json格式
group: DEFAULT_GROUP \\默认的组
# forest 配置
forest:
backend: okhttp3
#全局变量可以在任何模板表达式中进行数据绑定。
variables:
kongbaseUrl: http://10.200.69.37:8001 #kong api baseUrl
kong-router.json中部分配置:
- 默认情况下 只需要配置name,paths或者hosts即可,服务会根据name去nacos中寻找对应的服务及配置,后续会有逻辑说明
//参数说明
name:nacos里的服务名称
paths:需要映射出去的服务路径
hosts:映射出去host列表(head中包含host属性会路由到此服务),与paths 二选一,建议使用path
plugins:需要为此路由加载的插件
strip_path:是否删除上游请求标头的前缀,默认true
url:默认为空,为空自动从nacos里面根据服务名获取服务进行路由,不为空时按url路由,默认为空就行,如果docker部署,请使用host模式,否则可能无法获取到真实ip导致路由失败
hostip:当获取的ip不对 但是又想使用nacos的服务自动获取功能,可以配置此项,配置后获取的ip失效,已此ip为准,会替换从nacos获取的ip
路由设置优先级:1.url 2.hostip+name 3.name
[{
"name": "fanyi",
"url": "https://fanyi.baidu.com",
"hostip": null,
"strip_path": true,
"paths": [
"/fanyi",
"/aa"
],
"hosts": [],
"plugins": []
},{
"name": "cloudportal-workspace",
"url": null,
"hostip": "10.200.69.84",
"strip_path": true,
"paths": [
"/cloudportal-workspace"
],
"hosts": [],
"plugins": []
}]
如图中测试配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WOxUj6yo-1614759131675)(/uploads/5da43f5b11e0ceaa2bf14556f9a6a72e/image.png)]
核心流程说明:
- 1.启动初始化,默认获取nacos服务配置,获取路由配置
- 2.验证配置格式,验证配置必要参数
- 3.根据配置中的name创建或更新kong service,当路由配置中的url存在时已url做service路由寻找地址,已url为准,此时不会从nacos获取配置及服务,根据name及paths及hosts创建路由,其中paths及hosts二者必选其一,两种方式可以共存
- 4.当url为空时会从nacos中根据name获取服务,如果不为空,根据name创建upstream,根据upstream清除targets,根据nacos中服务的ip:port创建targets与upstream关联,此时有个逻辑,因为服务可能部署到容器中,获取到的是容器ip,路由配置中提供了忽略容器ip的配置,添加hos