先上问题

Ocelot.Responder.Middleware.ResponderMiddleware[0]
RequestId: 0HNHS8L0SV7TC:00000002, PreviousRequestId: -
ResponderMiddleware found 1 error ->
ConnectionToDownstreamServiceError: Error connecting to downstream service, exception: System.Net.Http.HttpRequestException: 由于目标计算机积极拒绝,无法连接。 (xn–irr469ca:5002)
解决方式为

consul agent -dev -node=127.0.0.1
解决参考

程序组成:网关服务+服务A+服务B

  • 网关服务
    • 引用程序包

    PackageReference Include=“Ocelot” Version=“24.0.1”
    PackageReference Include=“Ocelot.Provider.Consul” Version=“24.0.0”

var builder = WebApplication.CreateBuilder(args);
// 加载 ocelot.json
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration).AddConsul();
var app = builder.Build();
await app.UseOcelot();
app.Run("http://127.0.0.1:5000");

ocelot.json配置

{
 "Routes": [
   {
     "RouteKey": "servicea-route",
     "UpstreamPathTemplate": "/api/servicea",
     "UpstreamHttpMethod": [ "GET" ],
     "DownstreamPathTemplate": "/",
     "DownstreamScheme": "http",
     "ServiceName": "ServiceA",
     "LoadBalancerOptions": { "Type": "RoundRobin" }
   },
   {
     "RouteKey": "serviceb-route",
     "UpstreamPathTemplate": "/api/serviceb",
     "UpstreamHttpMethod": [ "GET" ],
     "DownstreamPathTemplate": "/",
     "DownstreamScheme": "http",
     "ServiceName": "ServiceB",
     "LoadBalancerOptions": { "Type": "RoundRobin" }
   }
 ],
 "GlobalConfiguration": {
   "ServiceDiscoveryProvider": {
     "Type": "Consul",
     "Host": "127.0.0.1",
     "Port": 8500,
     "UseNodeAddress": false
   }
 }
}
  • 服务A
    • 引用包

    PackageReference Include=“Consul” Version=“1.7.14.9”

var builder = WebApplication.CreateBuilder(args);
using Consul;
var builder = WebApplication.CreateBuilder(args);
// 注册 ServiceA 到 Consul
builder.Services.AddSingleton<IHostedService, ConsulRegistrationService>();
var app = builder.Build();
app.MapGet("/", () => "Hello from Service A!");
app.MapGet("/health", () => Results.Ok("ServiceA Healthy"));
app.MapGet("/servicea", () => Results.Ok("This is Service A"));
app.Run("http://127.0.0.1:5001");
// 注册服务到 Consul
public class ConsulRegistrationService : IHostedService
{
    private readonly IHostApplicationLifetime _lifetime;
    private ConsulClient _consulClient;
    public ConsulRegistrationService(IHostApplicationLifetime lifetime)
    {
        _lifetime = lifetime;
    }
    public Task StartAsync(CancellationToken cancellationToken)
    {
        _consulClient = new ConsulClient(c => { c.Address = new Uri("http://localhost:8500"); });
        var registration = new AgentServiceRegistration()
        {
            ID = "ServiceA-1",
            Name = "ServiceA",
            Address = "127.0.0.1",   // ⚠️ 关键,使用 IP 避免中文 Node
            Port = 5001
        };
        _consulClient.Agent.ServiceRegister(registration).Wait();
        _lifetime.ApplicationStopping.Register(() =>
        {
        _consulClient.Agent.ServiceDeregister(registration.ID).Wait();
        });
        return Task.CompletedTask;
    }
    public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
  • 根据服务A同理构建服务B端口可配置为5002
  • 最后直接运行既可以得到一个简单的微服务程序

更多推荐