简介
.net core使用ocelot---第一篇 简单使用
.net core使用ocelot---第二篇 身份验证使用
.net core使用ocelot---第三篇 日志记录
.net core使用ocelot---第四篇 限流熔断
.net core使用ocelot---第五篇 服务质量
.net core使用ocelot---第六篇 负载均衡
.net core使用ocelot---第七篇 服务发现
本文我们介绍Ocelot使用consul实现服务发现。
我将使用Ocelot的13.5.2版本向您展示此功能。
Step1
启动Consul
在本次演示,我将使用Docker运行consul的实例。(你也可以自己安装consul,不需要docker)
docker run -p 8500:8500 consul
启动后,我们会看到下面的结果。
Step2
新建一个在consul注册了的API服务。
为了演示,我将创建两个Web API项目,它们端口不一样但服务名一样。
编写控制器的代码如下:
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { // GET api/values [HttpGet] public ActionResult<IEnumerable<string>> Get() { var port = Request.Host.Port; return new string[] { "value1", "value2", port.Value.ToString() }; } }
接下来将它注册到consul,下面的代码,打个样。
public static class AppExtensions { public static IServiceCollection AddConsulConfig(this IServiceCollection services, IConfiguration configuration) { services.AddSingleton<IConsulClient, ConsulClient>(p => new ConsulClient(consulConfig => { var address = configuration.GetValue<string>("Consul:Host"); consulConfig.Address = new Uri(address); })); return services; } public static IApplicationBuilder UseConsul(this IApplicationBuilder app) { var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>(); var logger = app.ApplicationServices.GetRequiredService<ILoggerFactory>().CreateLogger("AppExtensions"); var lifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); if (!(app.Properties["server.Features"] is FeatureCollection features)) return app; var addresses = features.Get<IServerAddressesFeature>(); var address = addresses.Addresses.First(); Console.WriteLine($"address={address}"); var uri = new Uri(address); var registration = new AgentServiceRegistration() { ID = $"MyService-{uri.Port}", // servie name Name = "MyService", Address = $"{uri.Host}", Port = uri.Port }; logger.LogInformation("Registering with Consul"); consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true); consulClient.Agent.ServiceRegister(registration).ConfigureAwait(true); lifetime.ApplicationStopping.Register(() => { logger.LogInformation("Unregistering from Consul"); consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true); }); return app; } }
我们还得修改Startup.cs以便可注册。
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddConsulConfig(Configuration); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseConsul(); app.UseMvc(); } }
当我们启动我们的项目,会在Consul发现名为MyServices的实例,它包括两个节点。
为了看看新服务的具体细节,点开MyService,我们会看到两个节点的具体信息。
接下来创建APIGateway
Step3
通过.NET Core CLI 添加下面的包
dotnet add package Ocelot --version 13.5.2 dotnet add package Ocelot.Provider.Consul --version 13.5.2
新建ocelot.json,内容如下。
{ "ReRoutes": [ { "UseServiceDiscovery": true, "DownstreamPathTemplate": "/{url}", "DownstreamScheme": "http", "ServiceName": "MyService", "LoadBalancerOptions": { "Type": "RoundRobin" }, "UpstreamPathTemplate": "/{url}", "UpstreamHttpMethod": [ "Get" ], "ReRoutesCaseSensitive": false } ], "GlobalConfiguration": { "ServiceDiscoveryProvider": { "Host": "localhost", "Port": 8500, "Type":"PollConsul", "PollingInterval": 100 } } }
使用服务发现我们在GlobalConfiguration中添加ServiceDiscoveryProvider节点。
名称 |
描述 |
Host |
表明Consul的主机 |
Port |
指明Consul的端口 |
Type |
1. Consul, 意味每次请求Ocelot会从consul获得服务信息。 2. PollConsul, 意味着Ocelot将向Consul推荐最新的服务信息 |
PollingInterval |
告诉Ocelot多长时间调用Consul来更改服务配置 |
在这里,ReRoute依然很重要。因为它告诉Ocelot,当发出请求时我们希望使用的服务名称和负载均衡器。 如果未指定负载均衡器,则Ocelot将不会对请求进行负载均衡。
设置此选项后,Ocelot将从服务中查找下游主机和端口,发现提供程序,并查找任何可用服务的负载均衡请求。
最后,我们需要在program.cs 中配置Ocelot。
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseUrls("http://*:9000") .ConfigureAppConfiguration((hostingContext, config) => { config .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("ocelot.json") .AddEnvironmentVariables(); }) .ConfigureServices(services => { services.AddOcelot() .AddConsul(); }) .Configure(app => { app.UseOcelot().Wait(); }); }
启动APIGateway,访问http://localhost:9000/api/values.
看一下打印的日志。请求的详细信息都在控制台显示。
源码在此
网盘链接:https://pan.baidu.com/s/17sqfGcYx8yEHRL_LwKAUlA
提取码:p3d0
总结
在这篇文章中我们学习了ocelot使用consul实现服务发现简单的例子。完结!!!!