ASP.NET Core3.1 Ocelot路由的实现

1.路由

前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务。Ocelot当前仅以另一个http请求的形式支持此功能(将来可能是任何传输机制)。
Ocelot将一个请求路由到另一个请求。为了让Ocelot正常工作,您需要在配置中设置一个Route。下面我们就Ocelot基础项目构建简单介绍下路由功能。

2.Ocelot基础项目构建(APIGatewayBasicDemo)

现在我们根据GitHub贡献者开源项目来学习Ocelot,根据下载下来Ocelot基础项目结构来看,我们能看到有一个网关项目(APIGateway),一个客户API项目(CustomersAPIServices),一个产品API项目(ProductsAPIServices)。如下图所示:

2.1Ocelot网关配置

APIGateway网关项目根目录下面有一个configuration.json配置文件,内容如下:

{
 //Routes:处理上游请求的对象(客户端),每个数组{}就是配置:上游地址和对应下游地址
 "Routes": [
  {
   //以Downstream开头的,是要转发到下游服务器的地址(CustomersAPIServices),与nginx转发类似
   //下面所有Downstream开头的,组成一个转发url,转发地址是http://localhost:9001/api/customers
   "DownstreamPathTemplate": "/api/customers",
   "DownstreamScheme": "http",
   // "DownstreamHost": "localhost",
   // "DownstreamPort": 9001,
   //转发到下游服务器的主机和端口。
   "DownstreamHostAndPorts": [
    {
     "Host": "localhost",
     "Port": 9001
    }
   ],
   //Upstream开头是指上游服务器(客户端)访问地址,通过http get方式访问。
   //也就是说客户端访问http://localhost:9000/customers 实际是转发到了http://localhost:9001/api/customers的服务
   "UpstreamPathTemplate": "/customers",
   "UpstreamHttpMethod": [ "Get" ]
  },
  {
   "DownstreamPathTemplate": "/api/customers/{id}",
   "DownstreamScheme": "http",
   // "DownstreamHost": "localhost",
   // "DownstreamPort": 9001,
   "DownstreamHostAndPorts": [
    {
     "Host": "localhost",
     "Port": 9001
    }
   ],
   "UpstreamPathTemplate": "/customers/{id}",
   "UpstreamHttpMethod": [ "Get" ]
  },
  {
   "DownstreamPathTemplate": "/api/products",
   "DownstreamScheme": "http",
   // "DownstreamPort": 9002,
   // "DownstreamHost": "localhost",
   "DownstreamHostAndPorts": [
    {
     "Host": "localhost",
     "Port": 9002
    }
   ],
   "UpstreamPathTemplate": "/products",
   "UpstreamHttpMethod": [ "Get" ]
  }
 ],
 //全局配置,允许覆盖Routes特定设置
 "GlobalConfiguration": {
  "RequestIdKey": "OcRequestId",
  "AdministrationPath": "/administration"
 }
}

下面我们就文件中这些属性进行解释:
DownstreamPathTemplate:下游路由服务地址。
DownstreamScheme:下游服务地址访问协议类型http或者https。
DownstreamHostAndPorts:是一个数据集合,用于定义您希望将请求转发到的任何下游服务的主机和端口。通常,它仅包含一个条目,但是有时您可能希望对下游服务进行负载均衡请求,Ocelot允许您添加多个条目,然后选择一个负载均衡器。
UpstreamPathTemplate:上游服务地址,即下游服务真实访问地址。
UpstreamHttpMethod:上游服务HTTP请求方式,例如Get、Post。
GlobalConfiguration:顾名思义就是全局配置,此节点的配置允许覆盖Routes里面的配置,你可以在这里进行通用的一些配置信息。
在Ocelot中,您可以以{something}的形式将变量的占位符添加到模板中。占位符变量需要同时存在于DownstreamPathTemplate和UpstreamPathTemplate属性中。当设置为Ocelot时,Ocelot将尝试为每个请求Ocelot进程将UpstreamPathTemplate占位符中的值替换为DownstreamPathTemplate。例如上述/customers/{id}。

2.2网关项目中添加Ocelot支持

现在我们在网关项目中添加Ocelot支持,代码如下:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
        //.UseStartup<Startup>()
        //设置网关url
        .UseUrls("http://*:9000")
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
          //添加Ocelot配置文件
config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
             .AddJsonFile("configuration.json")
             .AddEnvironmentVariables();
        })
        .ConfigureServices(s =>
        {
          //添加Ocelot服务
          s.AddOcelot();
        })
        .Configure(a =>
        {
          //使用Ocelot中间件
          a.UseOcelot().Wait();
        });

Ocelot的配置如上代码基本完成了,下面我们看看一个基础Ocelot路由正常工作流程。

2.3CustomersAPIServices和ProductsAPIServices项目

CustomersAPIServices项目的CustomersController有如下两个方法:

[Route("api/[controller]")]
public class CustomersController : Controller
{
  [HttpGet]
  public IEnumerable<string> Get()
  {
    return new string[] { "Catcher Wong", "James Li" };
  }

  [HttpGet("{id}")]
  public string Get(int id)
  {
    return $"Catcher Wong - {id}";
  }
}

ProductsAPIServices项目的ProductsController有如下一个方法:

[Route("api/[controller]")]
public class ProductsController : Controller
{
  [HttpGet]
  public IEnumerable<string> Get()
  {
    return new string[] { "Surface Book 2", "Mac Book Pro" };
  }
}

2.4运行测试

上面这三个下游路由地址根据configuration.json配置文件都分别配置了上游分发地址,我们把这三个项目根据配置信息分别在IIS上部署起来,当然你们也可以使用dotnet run命令分别启动这个三个项目。APIGateway、CustomersAPIServices、ProductsAPIServices项目绑定主机地址分别是http://localhost:9000、http://localhost:9001、http://localhost:9002。
当我们在浏览器上打开http://localhost:9000/customers时候,会发现浏览器上输出如下信息:

为什么输入网关主机地址,返回过来却是客户主机处理结果?那是因为当客户端访问上游服务http://localhost:9000/customers时候,Ocelot会根据配置信息中下游模版把请求分发到http://localhost:9001/api/Customers/Get去处理,然后返回结果。
而当我们打开http://localhost:9000/customers/1时候,也会输出如下信息:

配置信息中上游模版/customers/{id}对应下游模版/api/customers/{id},当我们请求的路径为http://localhost:9000/customers/1时候,Ocelot会根据配置信息分发到对应的下游路由http://localhost:9001/api/Customers/Get/1去处理,然后返回结果。
同理,当客户端访问上游服务http://localhost:9000/products时候,Ocelot也会分发到对应的下游路由http://localhost:9002/api/Products去处理,然后返回结果:

根据上面测试结果,也就是说我们的Ocelot已经在起作用了,而且根据上下游路由进行了映射。当然该章节也只是简单介绍Ocelot路由功能,而configuration.json配置中有些属性还没有进行描述,例如负载均衡、限流,熔断等等。下面我会继续根据GitHub贡献者开源项目继续讲解其功能。

参考文献:
Ocelot官网

到此这篇关于ASP.NET Core3.1 Ocelot路由的实现的文章就介绍到这了,更多相关ASP.NET Core Ocelot路由内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core MVC 配置全局路由前缀

    ASP.NET Core MVC 配置全局路由前缀 前言 大家好,今天给大家介绍一个 ASP.NET Core MVC 的一个新特性,给全局路由添加统一前缀.严格说其实不算是新特性,不过是Core MVC特有的. 应用背景 不知道大家在做 Web Api 应用程序的时候,有没有遇到过这种场景,就是所有的接口都是以 /api 开头的,也就是我们的api 接口请求地址是像这样的: http://www.example.com/api/order/333 或者是这样的需求 http://www.exa

  • 详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopmen

  • 详解ASP.NET Core端点路由的作用原理

    端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民. Endpoint Routing的动机 在端点路由出现之前,我们一般在请求处理管道的末尾,定义MVC中间件解析路由.这种方式意味着在处理管道中,MVC中间件之前的中间件将无法获得路由信息. 路由信息对于某些中间件非常有用,比如CORS.认证中间件(认证过程可能会用到路由信息). 同时端点路由提炼出端点概念,解耦路由匹配逻辑.请求分发. Endpoint Rout

  • ASP.NET Core中自定义路由约束的实现

    路由约束 ASP.NET Core中,通过定义路由模板,可以在Url上传递变量,同时可以针对变量提供默认值.可选和约束. 约束的使用方法是在属性路由上添加指定的约束名,用法如下: // 单个使用 [Route("users/{id:int}")] public User GetUserById(int id) { } // 组合使用 [Route("users/{id:int:min(1)}")] public User GetUserById(int id) {

  • ASP.NET Core 2.2中的Endpoint路由详解

    Endpoint路由 在ASP.NET Core 2.2中,新增了一种路由,叫做 Endpoint (终结点)路由.本文将以往的路由系统称为 传统路由 . 本文通过源码的方式介绍传统路由和 Endpoint 路由部分核心功能和实现方法,具体功能上的差异见 官方文档 . 在升级到ASP.NET Core 2.2后,会自动启用 Endpoint 路由.如果要恢复以往的实现逻辑,需要加入以下代码: services.AddMvc(options => options.EnableEndpointRou

  • asp.net Core3.0区域与路由配置的方法

    在ASP.NET Core 3.0中路由配置和2.0不一样了 一.MVC 服务注册 ASP.NET Core 3.0 添加了用于注册内部的 MVC 方案的新选项Startup.ConfigureServices. 三个新的顶级扩展方法与 MVC 方案上IServiceCollection可用. 模板使用这些新方法,而不是UseMvc. 但是,AddMvc继续像它已在以前的版本. 下面的示例将添加对控制器和与 API 相关的功能,但不是视图或页面的支持. API 模板使用此代码: public v

  • ASP.NET Core3.1 Ocelot路由的实现

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能(将来可能是任何传输机制). Ocelot将一个请求路由到另一个请求.为了让Ocelot正常工作,您需要在配置中设置一个Route.下面我们就Ocelot基础项目构建简单介绍下路由功能. 2.Ocelot基础项目构建(APIGatewayBasicDemo) 现在我们根据GitHub贡献者开源项目来学

  • ASP.NET Core3.1 Ocelot负载均衡的实现

    1.负载均衡 Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求.负载均衡类型: LeastConnection:根据服务正在处理请求量的情况来决定哪个服务来处理新请求,即将新请求发送到具有最少现有请求的服务去处理.算法状态没有分布在Ocelot集群中. RoundRobin:遍历可用服务并发送请求.算法状态没有分布在Ocelot集群中. NoLoadBalancer:从配置或服务发现中获取第一个可用服务来处理新请求. CookieStickySess

  • ASP.NET Core3.1 Ocelot认证的实现

    1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后Ocelot会基于授权密钥授权每个请求可以访问的资源.用户必须像往常一样在其Startup.cs中注册身份验证服务,但是他们为每次注册提供一个方案(身份验证提供者密钥),例如: public void ConfigureServices(IServiceCollection services) { var authenticationProvide

  • asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

    目录 认证授权 身份认证 授权 默认授权 选择授权 总结 开发了一个公司内部系统,使用asp.net core 3.1.在开发用户认证授权使用的是简单的cookie认证方式,然后开发好了要写几个接口给其它系统调用数据.并且只是几个简单的接口不准备再重新部署一个站点,所以就直接在MVC的项目里面加了一个API区域用来写接口.这时候因为是接口所以就不能用cookie方式进行认证,得加一个jwt认证,采用多种身份验证方案来进行认证授权. 认证授权 身份验证是确定用户身份的过程. 授权是确定用户是否有权

  • Asp.Net Core使用Ocelot结合Consul实现服务注册和发现

    目录 1.服务注册与发现(Service Discovery) 2.Consul 3.Asp.Net Core向Consul注册服务实例 4.项目演示 4.1APIGateway项目 4.2Common项目 4.3APIServiceA项目 4.4APIServiceB项目 4.5项目运行 1.服务注册与发现(Service Discovery) 服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka)注册一下,

  • ASP.NET Core为Ocelot网关配置Swagger

    1.前言 前端与后端的联系更多是通过API接口对接,API文档变成了前后端开发人员联系的纽带,开始变得越来越重要,而Swagger就是一款让你更好的书写规范API文档的框架.在Ocelot Swagger项目示例中,通过APIGateway项目路由配置网关.上下游服务Swagger.对解决方案中的示例APIServiceA.APIServiceB项目Get方法进行配置,文件配置具体代码如下: { "Routes": [ { //下游服务地址 "DownstreamPathTe

  • ASP.NET Core设置Ocelot网关限流

    1.限流(Rate Limiting) 很多时候为了防止DoS攻击,我们会通过限流方式对上游请求进行限制,以保护下游服务不会负荷过载,为客户端提供高质量的资源服务.在Ocelot限流项目示例中,通过APIGateway项目路由RateLimitOptions选项可以配置限流.对解决方案的示例APIServices项目Get方法进行限流,文件配置具体代码如下: { "Routes": [ { "DownstreamPathTemplate": "/api/v

  • [译]ASP.NET Core 2.0 路由引擎详解

    本文介绍了ASP.NET Core 2.0 路由引擎详解,分享给大家,具体如下: 问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvir

  • 详解ASP.NET Core3.0 配置的Options模式

    上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式. 一.Options的使用 上一章有个配置的绑定的例子,可以将配置绑定到一个Theme实例中.也就是在使用对应配置的时候,需要进行一次绑定操作.而Options模式提供了更直接的方式,并且可以通过依赖注入的方式提供配置的读取.下文中称每一条Options配置为Option. 1.简单的不为Option命名的方式 依然采用这个例子,在appsettings.json中存在这样的配置: { "Th

随机推荐