【威尼斯手机娱乐官网】API网关组件Ocelot,Cons
分类:威尼斯手机娱乐官网

Ocelot+ Consul:

实现目标:启动服务发现然后模拟集群发布功能,实现发布端口8001,8002后,启动服务发现,然后配置Ocelot网关。实现访问统一接口可以轮询访问8001,8002,8001,8002,...这样。然后可以在添加8003,继续规则。

实现以上目标我们不需要该我们的示例代码,只需要修改配置json文件即可:

威尼斯手机娱乐官网 1威尼斯手机娱乐官网 2

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/Test/{postId}",
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/Product123Service/{postId}",
      "UpstreamHttpMethod": [ "Get" ],
      "ServiceName": "ProductService",
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "UseServiceDiscovery": true
    }
  ],
  "GlobalConfiguration": {
    // "BaseUrl": "http://127.0.0.1:8887/"
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500,
      "Type": "PollConsul",
      "PollingInterval": 100
    }
  }
}

View Code

这个就是我们的服务功能:

Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口。目前,这仅在GlobalConfiguration部分中受支持,这意味着将为所有的ReRoute使用相同的服务发现提供程序,以便在ReRoute级别指定ServiceName。

  • ServiceName:consul的服务名称
  • LoadBalancerOptions:使用的算法,目前有两种RoundRobin(轮询方式)和LeastConnection(最小连接)
  • UseServiceDiscovery:是否启用服务发现功能 true:为启动
  • ServiceDiscoveryProvider:配置服务发现的一些配置
  • Host:主机地址
  • Port:端口
  • PollingInterval:轮询的间隔时间,以毫秒为单位。并告诉Ocelot多久可以向Consul调用服务配置的更改

想要了解更多可以访问Ocelot官网:

服务连接:

开启consul服务之后需要把现有的项目连接集群到consul服务,这时候需要在项目中注册服务(在startup.cs文件下的Configure方法):

威尼斯手机娱乐官网 3威尼斯手机娱乐官网 4

 String ip = Configuration["ip"];//部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址            int port = int.Parse(Configuration["port"]);//获取服务端口            var client = new ConsulClient(ConfigurationOverview); //回调获取            var result = client.Agent.ServiceRegister(new AgentServiceRegistration()            {                ID = "ServerNameFirst" + Guid.NewGuid(),//服务编号保证不重复                Name = "MsgServer",//服务的名称                Address = ip,//服务ip地址                Port = port,//服务端口                Check = new AgentServiceCheck //健康检查                {                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后反注册                    Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)                    HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址                    Timeout = TimeSpan.FromSeconds(5)//服务的注册时间                }            });

View Code

之后在增加一个回调方法:

回调方法是代表的consul服务的地址配置。

 private static void ConfigurationOverview(ConsulClientConfiguration obj)        {            //consul的地址            obj.Address = new Uri("http://127.0.0.1:8500");            //数据中心命名            obj.Datacenter = "dc1";        }

服务到这里已经是配置完毕。但是我们怎么注销服务哪。当然是有办法的拉。通过api我们可以知道ServiceDeregister方法是注销服务的方法。那么我们应该怎么写哪:

首先我们要去了解一下IApplicationLifetime接口:允许消费者在优雅关机期间执行清理工作

ApplicationStarted:当应用程序主机已完全启动并将要等待时触发

ApplicationStopping:当应用程序主机执行优美关机时触发。请求可能还在运行中。关闭将阻止此事件完成

ApplicationStopped:当应用程序主机执行关机时触发。所有请求应该在这一点完成。关机将阻止此事件完成。

好了,我的英语确实不好,这些就是自动翻译的意思。不过也能让我们明白大概的意思。知道有这个东西我们就可以实现功能了完整代码:

威尼斯手机娱乐官网 5威尼斯手机娱乐官网 6

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)        {            if (env.IsDevelopment            {                app.UseDeveloperExceptionPage();            }            app.UseMvc();            String ip = Configuration["ip"];//部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址            int port = int.Parse(Configuration["port"]);//获取服务端口            var client = new ConsulClient(ConfigurationOverview); //回调获取            string serverId = "ServerNameFirst" + Guid.NewGuid();            var result = client.Agent.ServiceRegister(new AgentServiceRegistration()            {                ID = serverId,//服务编号保证不重复                Name = "MsgServer",//服务的名称                Address = ip,//服务ip地址                Port = port,//服务端口                Check = new AgentServiceCheck //健康检查                {                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后反注册                    Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)                    HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址                    Timeout = TimeSpan.FromSeconds(5)//服务的注册时间                }            });            lifetime.ApplicationStopping.Register =>            {                Console.WriteLine("注销方法");                client.Agent.ServiceDeregister.Wait();//服务停止时取消注册            });        }

View Code

运行效果截图:

威尼斯手机娱乐官网 7

威尼斯手机娱乐官网 ,Ocelot是一组按特定顺序的中间件,Ocelot操纵HttpRequest对象进入由其配置指定的状态,直到它到达请求生成器中间件,在该中间件中创建HttpRequestMessage对象,该对象用于向下游服务发出请求。提出请求的中间件是Ocelot管道中的最后一件事。它不叫下一个中间件。来自下游服务的响应存储在每个请求作用域存储库中,并在请求返回到Ocelot管道时进行恢复。有一件中间件将HttpResponseMessage映射到HttpResponse对象上,并返回给客户端。这基本上是与其他一些功能。

系列章节:

微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:

  • 微服务——微服务的介绍和目录
  • 微服务——服务发现在windows下简单使用
  • 微服务——微服务故障处理库
  • 微服务——动态代理AspectCore的使用
  • 微服务——网关Ocelot+Consul实现集群轮询

Ocelot只能用于.NET Core,并且目前已经构建到netstandard2.0。所有下面 我们使用.NET Core 2.1做演示。

客户端:

简单介绍一个获取服务所有地址,然后打印并从其中随机选取一个进行请求并打印:

威尼斯手机娱乐官网 8威尼斯手机娱乐官网 9

       static List<string> Urls = new List<string>();        static void Main(string[] args)        {            Console.WriteLine("开始输出当前所有服务地址");            Catalog_Nodes().GetAwaiter().GetResult();            //Console.WriteLine(HelloConsul().GetAwaiter().GetResult;            Console.WriteLine("开始随机请求一个地址服务地址");            int index = new Random().Next(Urls.Count);            string url = Urls[index];            string param = "";//这里是开始位置            param += "{";            param += """ + "id" + "":"" + 5 + "",";            param = param.TrimEnd(',');            param += "}";            Console.WriteLine("请求的随机地址:" + url);            string result = HttpClientHelpClass.PostResponse(url, param, out string statusCode);            Console.WriteLine("返回状态:" + statusCode);            Console.WriteLine("返回结果:" + result);            Console.ReadLine();        }        public static async Task Catalog_Nodes()        {            var client = new ConsulClient();            var nodeList = await client.Agent.Services();            var url = nodeList.Response.Values;            foreach (var item in url)            {                string Address = item.Address;                int port = item.Port;                string name = item.Service;                Console.WriteLine($"地址:{Address}:{port},name:{name}");                Urls.Add($"http://{Address}:{port}/api/Test");            }        }

View Code

系列目录:

微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:

  • 微服务——微服务的介绍和目录
  • 微服务——【Consul】服务发现在windows下简单使用(一)
  • 微服务——【polly】微服务故障处理库(二)
  • 微服务——动态代理AspectCore的使用(三) 
  • 微服务——网关Ocelot+Consul实现集群轮询(四)

基本介绍:

安装:

下载地址:

运行:

consul agent -dev

威尼斯手机娱乐官网 10

显示这个界面说明已经开启成功。

页面显示:

然后访问8500端口就可以看到页面:

威尼斯手机娱乐官网 11

命令:

consul members:输出当前服务的信息,显示的所有配置节点。

install-package Consul:在vs项目中安装Consul

路由小知识:

UpstreamHost=>"UpstreamHost": "baidu.com":上游主机

    此功能允许您基于上游主机进行ReRoutes。这通过查看客户端使用的主机头来工作,然后将其用作我们用来识别ReRoute的信息的一部分。这样就是显示了只有在主机头值为baidu.com时才会匹配。

Priority=> "Priority": 0:优先级

    此功能设置访问路由的优先级,假设在同一个路由下有多个路由,会根据优先级匹配优先级最高的,0是最低的。

Dynamic Routing:动态路由

    这个主要是为了服务发现而实现的,在这种模式下,Ocelot将使用上游路径的第一个分段来查找服务发现提供商的下游服务。官网给出的大概配置效果:

威尼斯手机娱乐官网 12威尼斯手机娱乐官网 13

{
    "ReRoutes": [],
    "Aggregates": [],
    "GlobalConfiguration": {
        "RequestIdKey": null,
        "ServiceDiscoveryProvider": {
            "Host": "localhost",
            "Port": 8510,
            "Type": null,
            "Token": null,
            "ConfigurationKey": null
        },
        "RateLimitOptions": {
            "ClientIdHeader": "ClientId",
            "QuotaExceededMessage": null,
            "RateLimitCounterPrefix": "ocelot",
            "DisableRateLimitHeaders": false,
            "HttpStatusCode": 429
        },
        "QoSOptions": {
            "ExceptionsAllowedBeforeBreaking": 0,
            "DurationOfBreak": 0,
            "TimeoutValue": 0
        },
        "BaseUrl": null,
            "LoadBalancerOptions": {
            "Type": "LeastConnection",
            "Key": null,
            "Expiry": 0
        },
        "DownstreamScheme": "http",
        "HttpHandlerOptions": {
            "AllowAutoRedirect": false,
            "UseCookieContainer": false,
            "UseTracing": false
        }
    }
}

View Code

本文由威尼斯手机娱乐官网发布于威尼斯手机娱乐官网,转载请注明出处:【威尼斯手机娱乐官网】API网关组件Ocelot,Cons

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文