.NET CORE2.2 下 Ocelot+Consul服务发现踩坑记录
历史原因,笔者所在公司的项目目前还在使用 .NET CORE 2.2版本,在所有业务应用升级完成服务注册发现之后,最后剩下 Ocelot 网关服务升级。在升级过程中,遇到一些问题,记录此文,以便有相同情况的同学参考。
1. Ocelot 升级服务发现
根据官方文档 ,通过简单的添加配置,既可以将原有配置方式改为服务发现:
-
安装插件
Install-Package Ocelot.Provider.Consul 13.5.2,.Net Core 2.x 最后一个版本 -
配置服务
s.AddOcelot()
.AddConsul();
- 添加全局配置文件
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8500,
"Type": "Consul"
}
- 配置路由
{
"DownstreamPathTemplate": "/api/values}",
"DownstreamScheme": "https",
"UpstreamPathTemplate": "/spider/api/values",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "spider",
"LoadBalancerOptions": {
"Type": "LeastConnection"
},
}
2. 问题产生
简单的几个步骤,Ocelot 升级完成,然而经过测试,却发现 Ocelot 并没有向我们预期那样,路由到后端的服务,而是报如下错误:
刚开始以为是配置问题,直到将日志级别调至 Debug,查看更加详细的日志才发现,下游请求的 URL 拼接有问题。
具体来说,就是 Ocelot 采用了 Consul 服务节点的 Node Name,而不是节点上对应的该服务的 IP 地址。
既然问题定位到,那么翻阅源码应该可以找到原因,首先根据 nuget 包信息导航到 https://github.com/ThreeMammals/Ocelot.Provider.Consul 地址查看 Provider 源码,经过加载调试,发现居然是正常的,但是有个疑问是,这个源码仓库中只有最早期的几个版本tag,后续版本都没有,经过查找,原来后续版本均已合并到 Ocelot 主库中,而 Nuget 包中的项目URL 并未更新,汗!
既然问题跟版本有关,就翻阅了一下 Issue 列表,还真找到了问题,而且看问题下面的讨论,踩坑的人应该不少。具体原因请直接参看以下链接:
https://github.com/ThreeMammals/Ocelot/issues/954
总结
- 在.NET CORE 2.x 版本中,应该采用 13.5.1 以及之前的版本,否则会产生 Node Name 问题。
- Ocelot.Provider.Consul 源码已合并至 Ocelot 主库 传送门
作者:xboo
出处:http://www.cnblogs.com/xboo/
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。如果觉得对你有帮助,可以点一下右下角的【推荐】,感谢支持!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构