.net core使用ocelot---第八篇 Consul

简介

  .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实现服务发现简单的例子。完结!!!!

原文地址:https://www.cnblogs.com/xlxr45/p/11321966.html