Ocelot 结成 Consul 做配置以及服务发现出现的一些小问题
首先创建 web 项目
dotnet new web -n ApiGateway
然后安装对应的 nuget 包
dotnet add package Ocelot dotnet add package Ocelot.Provider.Consul
Program 配置
using Ocelot.Middleware; using Ocelot.DependencyInjection; using Ocelot.Provider.Consul; var builder = WebApplication.CreateBuilder(args); builder.Services.AddOcelot().AddConsul().AddConfigStoredInConsul(); builder.Configuration.AddJsonFile("ocelot.json"); var app = builder.Build(); app.UseOcelot().Wait(); app.Run();
然后配置 ocelot.json
{ "Routes": [ { "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "UseServiceDiscovery": true, "UpstreamPathTemplate": "/media-service/{url}", "ServiceName": "MediaService", "LoadBalancerOptions": { "Type": "RoundRobin" } }, { "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "UseServiceDiscovery": true, "UpstreamPathTemplate": "/dictionary-service/{url}", "ServiceName": "DictionaryService", "LoadBalancerOptions": { "Type": "RoundRobin" } }, { "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "UseServiceDiscovery": true, "UpstreamPathTemplate": "/search-service/{url}", "ServiceName": "SearchService", "LoadBalancerOptions": { "Type": "RoundRobin" } }, { "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "UseServiceDiscovery": true, "UpstreamPathTemplate": "/user-service/{url}", "ServiceName": "UserService", "LoadBalancerOptions": { "Type": "RoundRobin" } }, { "DownstreamPathTemplate": "/{url}", "DownstreamScheme": "http", "UseServiceDiscovery": true, "UpstreamPathTemplate": "/content-service/{url}", "ServiceName": "ContentService", "LoadBalancerOptions": { "Type": "RoundRobin" }, "RouteIsCaseSensitive": false } ], "GlobalConfiguration": { "ServiceDiscoveryProvider": { "Host": "localhost", "Port": 8500, "PollingInterval": 5000, "Type": "Consul", "ConfigurationKey": "API_Gateway" } } }
没有找到注册的服务
因为是获取对应的服务实例时,请求的路径不对,例如我在 consul 中注册了 ContentService,在 ocelot.json 中也配置了 ServiceName 为 ContentService,LoadBalancer 会尝试获取所有可用的实例,
通过向 consul 的 /v1/health/service/content-service
路径,然而这个路径时错误的,所以并不能收到相关的信息
解决方法(Ocelot.Provider.Consul 已经是 归档状态了):服务名不要使用 PascalCase,使用中划线分割单词
服务地址无效
consul 注册的使用服务 Address 应该时 Host 名称,不能是 localhost,也不能带有协议名称 https:// 或者 https:// 等
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步