kong 网关 结合 nacos 动态路由,服务上下线,加载插件

kong 怎么根据nacos的服务自动路由,加载服务呢

  • 先梳理逻辑
    • kong路由动态控制服务的说明
        • 逻辑说明
        • 核心流程说明:
        • 此服务中存在的冲突及问题
        • 插件的加载
      • 附上部分代码

先梳理逻辑

本文参考: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

你可能感兴趣的:(java,kong,动态路由,java,spring,网关)