记录使用ocelot+consul构建微服务踩过的坑
·
先上问题
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
- 最后直接运行既可以得到一个简单的微服务程序
更多推荐
所有评论(0)