首页 > 其他分享 >Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul

Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul

时间:2023-02-10 14:15:19浏览次数:59  
标签:Polly 网关 http Consul 2.9 Ocelot 172.16

 

Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级

Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul

微服务网关Ocelot加入IdentityServer4鉴权-.NetCore(.NET5)中使用

Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现

一、简介

 前一篇Consul中有个问题是,所有客户端都要和Consul进行连接,且直接拿到了所有的服务实例,这就直接把全部的服务实例暴露出来了,所以需要用网关来隔离客户端和服务实例,

所有api请求都从网关进入。

 

 

 Ocelot作为一个网关应用,主要的功能有路由、请求聚合、服务发现、统一认证、统一鉴权、限流熔断、并内置了负载均衡器等的集成。而且这些功能都只需要简单的配置即可完成。

 

回到顶部

二、使用Ocelot

2.1应用配置

新建一个.NetCore项目作网关应用。

安装NuGet包 

Ocelot

Startup.cs中把ConfigureServices(),Configure()里面的代码都去掉,加上Ocelot接管代码。

复制代码
  public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseOcelot();
        }
复制代码

这些操作完,程序就再也不是asp.net core,也不是什么webApi的程序了,就是一个Ocelot网关应用。

2.2路由配置

网关最重要的功能就是路由,根据路由把功能转发到其它应用去,它本身的应用有ip地址,别人可能访问它,但它怎么知道哪个请求转到哪个应用去呢,这些全靠配置。

首先在 Program.cs里的CreateHostBuilder()加入配置文件信息

复制代码
public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(c =>
            {
                c.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
复制代码

根目录下增加配置文件ocelot.json。

复制代码
  {
    "Routes": [
      {
        //转发到下游服务地址--url变量
        "DownstreamPathTemplate": "/api/{url}",
        //下游http协议
        "DownstreamScheme": "http",
        //负载方式,
        "LoadBalancerOptions": {
          "Type": "RoundRobin" // 轮询
        },
        "DownstreamHostAndPorts": [
          {
            "Host": "172.16.2.9",
            "Port": 5201 //服务端口
          }, //可以多个,自行负载均衡
          {
            "Host": "172.16.2.9",
            "Port": 5202 //服务端口
          },
          {
            "Host": "172.16.2.9",
            "Port": 5203 //服务端口
          }
        ],
        //上游地址
        "UpstreamPathTemplate": "/T1/{url}", //网关地址--url变量   //冲突的还可以加权重Priority
        "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ]
      }
    ]
  }
复制代码

 

这里的是路由配置,注释说明已经很清楚,假如网关程序启动后的地址为http://172.16.2.9:5200

当访问:http://172.16.2.9:5200/T1/Test/GetName  网关会把请求转发到http://172.16.2.9:5201/api/Test/GetName,http://172.16.2.9:5202/api/Test/GetName,http://172.16.2.9:5203/api/Test/GetName,根据负载算法决定转发规则。

LoadBalancer是来决定负载的算法

  • LeastConnection:将请求发往最空闲的那个服务器

  • RoundRobin:轮流转发

  • NoLoadBalance:总是发往第一个请求或者是服务发现

Routes里面可以配多个路由转发。

2.3验证

在前面的Consul注册的程序中(5201,5202,5203端口程序)加入一个接口

复制代码
    [Route("api/[controller]/[action]")]
    public class TestController : Controller
    {
        private IConfiguration _configuration;
        public TestController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        public IActionResult GetName()
        {
            string port = _configuration["port"];
            return Json($"端口:{port},姓名:张三");
        }
    }
复制代码

 

启动Ocelot的网关程序,端口为5200

 

 访问地址:http://ip:5200/T1/Test/GetName

 

 刷新一下

可以看到,已经成功转发到上面配置好的路由地址。

2.4Ocelot结合Consul进行服务发现

上面的示例是没有经过Consul的,是直接转发到相应地址,这显然又面临了服务地址管理的问题了,所以需要结合Consul自动发现服务的地址。

 把ocelot.json的文件加入consul配置信息

复制代码
  {
    "Routes": [
      {
        //转发到下游服务地址--url变量
        "DownstreamPathTemplate": "/api/{url}",
        //下游http协议
        "DownstreamScheme": "http",
        //负载方式,
        "LoadBalancerOptions": {
          "Type": "RoundRobin" // 轮询
        },
        //"DownstreamHostAndPorts": [
        //  {
        //    "Host": "172.16.2.9",
        //    "Port": 5201 //服务端口
        //  }, //可以多个,自行负载均衡
        //  {
        //    "Host": "172.16.2.9",
        //    "Port": 5202 //服务端口
        //  },
        //  {
        //    "Host": "172.16.2.9",
        //    "Port": 5203 //服务端口
        //  }
        //],
        //上游地址
        "UpstreamPathTemplate": "/T1/{url}", //网关地址--url变量   //冲突的还可以加权重Priority
        "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
        "UseServiceDisConvery": true, //使用服务发现
        "ServiceName": "api"//Consul服务名称
      }
    ],
    "GlobalConfiguration": {
      //Ocelot应用地址
      "BaseUrl": "http://172.16.2.9:5200",
      "ServiceDiscoveryProvider": {
        //Consul地址
        "Host": "172.16.2.84",
        //Consul端口
        "Port": 8500,
        "Type": "Consul"//由Consul提供服务发现,每次请求Consul
      }
    }
  }
复制代码

可以看到,这里已经把写死的下游地址去掉了,加入了Consul的信息。

安装NuGet包 

Ocelot.Provider.Consul

Startup.cs中ConfigureServices(IServiceCollection services)加入.AddConsul();

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot()
                .AddConsul();
        }

配置完成,验证效果,启动项目。

 

 再次访问http://ip:5200/T1/Test/GetName

 

 刷新一下

 

 

 控制台信息

 

 到这就已经成功完成 Ocelot+Consul的网关和服务发现功能了。

标签:Polly,网关,http,Consul,2.9,Ocelot,172.16
From: https://www.cnblogs.com/weihengblogs/p/17108689.html

相关文章

  • Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级
    Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul微服务网关Ocelot加入......
  • Docker--consul 注册中心
    前言服务注册与发现是微服务架构中不可或缺的重要功能。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个......
  • consul学习笔记
    consul默认的服务端口是8500consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Va......
  • Docker-consul的容器服务更新与发现
    一、Consul概述1.1什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯......
  • .Net6 使用 Ocelot + Consul 看这篇就够了
    前言卯兔敲门,新的一年,祝大家前‘兔’似锦!希望大家假后还能找到公司的大门O(∩_∩)O!书接上文,我们使用了Consul实现了服务注册与发现,对Consul不熟悉的同学可以先看看。......
  • Docker consul容器服务更新与发现
    一、Consul概述1、什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯......
  • Docker consul的容器服务更新与发现
    一、Consul概述(1)什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯......
  • docker consul的容器服务更新与发现
    一、Consul1、什么是服务注册与发现(1)服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的......
  • 使用Consul作为Istio的注册中心
    默认istio使用k8s作为注册中心,k8s的service、endpoint对应于服务、实例。针对一些还未接入到服务网格的SpringCloud服务,其使用的注册中心可能是consul,如何让服务网格上的......
  • consul 使用
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;namespaceUFX.SCM.OpenApi.Settings{///<summary>......