zoukankan      html  css  js  c++  java
  • .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实现服务发现简单的例子。完结!!!!

  • 相关阅读:
    byte在计算机中的存储方式--Double.byteValue()的输出结果思考
    启动Eclipse时An internal error occurred during: "Initializing Java Tooling".错误
    java实现两个int数交换
    cmd编译运行java
    java配置环境变量
    使用jQuery获取session中存储的list集合
    搭建ssm框架,可实现登录和数据展示以及增删改查
    java 生成UUID
    jQuery serialize()方法获取不到数据,alert结果为空
    SpringMVC架构的项目,js,css等静态文件导入有问题
  • 原文地址:https://www.cnblogs.com/xlxr45/p/11321966.html
Copyright © 2011-2022 走看看