欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET CORE2.2 下 Ocelot+Consul服务发现踩坑记录

程序员文章站 2022-06-05 17:00:53
历史原因,笔者所在公司的项目目前还在使用 .NET CORE 2.2版本,在所有业务应用升级完成服务注册发现之后,最后剩下 Ocelot 网关服务升级。在升级过程中,遇到一些问题,记录此文,以便有相同情况的同学参考。 1. Ocelot 升级服务发现 "根据官方文档" ,通过简单的添加配置,既可以将 ......

历史原因,笔者所在公司的项目目前还在使用 .net core 2.2版本,在所有业务应用升级完成服务注册发现之后,最后剩下 ocelot 网关服务升级。在升级过程中,遇到一些问题,记录此文,以便有相同情况的同学参考。

1. ocelot 升级服务发现

,通过简单的添加配置,既可以将原有配置方式改为服务发现:

  1. 安装插件
    install-package ocelot.provider.consul 13.5.2,.net core 2.x 最后一个版本

  2. 配置服务

s.addocelot()
    .addconsul();
  1. 添加全局配置文件
"servicediscoveryprovider": {
    "host": "localhost",
    "port": 8500,
    "type": "consul"
}
  1. 配置路由
{
    "downstreampathtemplate": "/api/values}",
    "downstreamscheme": "https",
    "upstreampathtemplate": "/spider/api/values",
    "upstreamhttpmethod": [ "get" ],
    "servicename": "spider",
    "loadbalanceroptions": {
        "type": "leastconnection"
    },
}

2. 问题产生

简单的几个步骤,ocelot 升级完成,然而经过测试,却发现 ocelot 并没有向我们预期那样,路由到后端的服务,而是报如下错误:
.NET CORE2.2 下 Ocelot+Consul服务发现踩坑记录

刚开始以为是配置问题,直到将日志级别调至 debug,查看更加详细的日志才发现,下游请求的 url 拼接有问题。
.NET CORE2.2 下 Ocelot+Consul服务发现踩坑记录

具体来说,就是 ocelot 采用了 consul 服务节点的 node name,而不是节点上对应的该服务的 ip 地址。
.NET CORE2.2 下 Ocelot+Consul服务发现踩坑记录

既然问题定位到,那么翻阅源码应该可以找到原因,首先根据 nuget 包信息导航到 https://github.com/threemammals/ocelot.provider.consul 地址查看 provider 源码,经过加载调试,发现居然是正常的,但是有个疑问是,这个源码仓库中只有最早期的几个版本tag,后续版本都没有,经过查找,原来后续版本均已合并到 ocelot 主库中,而 nuget 包中的项目url 并未更新,汗!

既然问题跟版本有关,就翻阅了一下 issue 列表,还真找到了问题,而且看问题下面的讨论,踩坑的人应该不少。具体原因请直接参看以下链接:

https://github.com/threemammals/ocelot/issues/954

总结

  1. 在.net core 2.x 版本中,应该采用 13.5.1 以及之前的版本,否则会产生 node name 问题。
  2. ocelot.provider.consul 源码已合并至 ocelot 主库 传送门