Ocelot网关Swagger无法显示微服务端点问题求助
问题描述
- 通过Ocelot网关可正常调用
points-service微服务接口,但Swagger无法加载该微服务的端点 - 网关日志出现警告:
warn: Ocelot.Responder.Middleware.ResponderMiddleware[0]
2024-10-30 21:04:21 requestId: 0HN7P2MKOVR6R:00000001, previousRequestId: No PreviousRequestId, message: 'Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /, verb: GET. errors found in ResponderMiddleware. Setting error response for request path:/, request method: GET'
- 在网关容器内执行
curl http://points-service:5001/swagger/v1/swagger.json可正常获取微服务Swagger配置文件
排查与修复方案
1. 补充Swagger代理路由并修正Swagger地址
当前Ocelot路由仅覆盖了/api/*路径,缺少Swagger相关路径的代理规则,且SwaggerEndPoints中配置的是微服务直接地址,无法通过网关正常访问。修改ocelot.json如下:
{ "Routes": [ // 原有API路由 { "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "points-service", "Port": 5001 } ], "UpstreamPathTemplate": "/api/{everything}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ], "SwaggerKey": "points" }, // 新增Swagger文件代理路由 { "DownstreamPathTemplate": "/swagger/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "points-service", "Port": 5001 } ], "UpstreamPathTemplate": "/points/swagger/{everything}", "UpstreamHttpMethod": [ "Get" ], "SwaggerKey": "points" } ], "GlobalConfiguration": { "BaseUrl": "http://gateway-api:5000" }, "SwaggerEndPoints": [ { "Key": "points", "Config": [ { "Name": "Points API", "Version": "v1", // 改为网关代理后的路径 "Url": "/points/swagger/v1/swagger.json" } ] } ] }
2. 调整中间件执行顺序
中间件顺序错误会导致Swagger和Ocelot的逻辑冲突,修改Program.cs的中间件顺序:
using API; using Confluent.Kafka; using Ocelot.DependencyInjection; using Ocelot.Middleware; var builder = WebApplication.CreateBuilder(args); var producerConfig = new ProducerConfig(); builder.Configuration.GetSection("Kafka").Bind(producerConfig); builder.Configuration.AddJsonFile("ocelot.json", true, true); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddOcelot(builder.Configuration); builder.Services.AddSwaggerForOcelot(builder.Configuration); builder.Services.AddSwaggerGen(); builder.Services.AddSingleton<ProducerConfig>(producerConfig); var app = builder.Build(); app.UseDeveloperExceptionPage(); // 调整中间件顺序,确保Swagger与Ocelot逻辑正确执行 app.UseSwagger() .UseSwaggerForOcelotUI() .UseRouting() .UseEndpoints(endpoints => { endpoints.MapControllers(); }) .UseOcelot().Wait(); app.Run();
移除原有的
UseSwaggerUI单独配置,统一通过UseSwaggerForOcelotUI访问聚合Swagger界面,地址为http://localhost:52791/swagger
3. 修正Docker环境变量格式
docker-compose.yml中的环境变量存在空格、多余逗号的语法错误,会导致ASP.NET Core启动配置异常:
services: gateway-api: container_name: gateway-api ports: - "52791:5000" build: context: . dockerfile: API/Dockerfile environment: - ASPNETCORE_URLS=http://*:5000 - ASPNETCORE_HTTPS_PORTS=5050 - ASPNETCORE_HTTP_PORTS=5000 points-service: container_name: points-service depends_on: - gateway-api ports: - "52792:5001" environment: - ASPNETCORE_URLS=http://*:5001 - ASPNETCORE_HTTPS_PORTS=5051 - ASPNETCORE_HTTP_PORTS=5001 build: context: . dockerfile: Services/PointsService/PointsService.Api/Dockerfile
4. 验证效果
重启所有容器后,访问http://localhost:52791/swagger,即可看到Points API的选项,切换后能正常加载微服务的所有端点。
内容的提问来源于stack exchange,提问作者Faradey Inimicos

