从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中。当客户端(web站点、ios、 app 等)访问web api时,需要先统一入口点进入Ocelot网关(Ocelot可以做很多事情例如路由,身份验证,服务发现,日志记录等,下面列出了功能基本),再由Ocelot分发到web api。Ocelot官方希望IS4一起使用,实现令牌轻松集成。

  Ocelot是一组按特定顺序排列的中间件,查看源码会发现Ocelot是一堆的middleware组成的一个管道。

  Ocelot操控HttpRequest对象到其配置指定的状态,在中间件中Ocelot创建一个HttpRequestMessage对象,该对象用于向下游服务(wep api)发出请求。发出请求的中间件是Ocelot管道中的最后一件事。它不会调用下一个中间件。

  当下游服务response返回Ocelot管道时,将检索下游服务的响应。有一个中间件将HttpResponseMessage映射到HttpResponse对象并返回给客户端。

  通过官方部署架构图介绍,可以了解到:Ocelot有5种部署方式包括:

  (1) Ocelot基本实现

    (2) Ocelot结合IS4、

     (3) Ocelot多个实现(高可用,负载)

    (4) Ocelot结合Consul(健康检查,服务注册)、

     (5) Ocelot结合Service Fabric。

  查看部署架构图,在架构图中,Ocelot网关暴露在广域网的一个访问入口,供客户端调用。而web api是在局域网中,由Ocelot来转发。

  Ocelot的功能基本包括:

路由

请求聚合

Consul和Eureka的服务发现

Service Fabric

WebSockets

Authentication认证

Authorisation授权

限速

高速缓存

重试策略/ QoS

负载均衡

日志/跟踪/关联

标头/查询字符串/声明转换

自定义中间件/委托处理程序

配置/管理REST API

Platform / Cloud Agnostic

安装Nuget包

Install-Package Ocelot

下面通过贡献者的开源项目来学习Ocelot,掌握一个基础项目应用,学习起来也更直观。示例有三个项目:一个是网关APIGateway项目,有二个是web api服务。 项目实现的功能是:客户端统一通过网关作为入口点访问,实现路由的功能。github开源地址   架构如下图所示:

  

  2.1 CustomersAPIServices项目

    该项目是一个web api项目,用来处理客户事务的API服务。该地址为http://localhost:9001, 可以在“项目选项”中指定url,也可以在Host启动时配置。

    (1) Program类添加UseUrls

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>().UseUrls("http://*:9001");

    (2) 在CustimersAPIServices项目中创建一个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}";
}
}

  2.2 ProductsAPIServices项目 

    该项目是一个web api项目,处理产品某事的API服务。该地址为http://localhost:9002, 可以在“项目选项”中指定url,也可以在Host启动时配置。

    (1) Program类添加UseUrls

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>().UseUrls("http://*:9002");

    (2) 在ProductsAPIServices项目中创建ProductsController

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

  2.3 APIGateway项目

    该项目是Ocelot网关项目,先安装Ocelot包。在项目中添加一个Ocelot的json配置文件,这里创建的是configuration.json文件。

    (1) configuration.json(配置Ocelot)

    {
//ReRoutes:处理上游请求的对象(客户端),每个数组{} 就是配置:上游地址和对应下游地址
"ReRoutes": [
{
//以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": "/api/products",
"UpstreamHttpMethod": [ "Get" ]
}
],
//全局配置,允许覆盖ReRoutes特定设置
"GlobalConfiguration": {
"RequestIdKey": "OcRequestId",
"AdministrationPath": "/administration"
}
}

    (2) Startup类,使用Ocelot

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

  

  最后开始测试:

    (1) 启动CustomersAPIServices web api服务程序 http://localhost:9001

    (2) 启动ProductsAPIServices web api服务程序  http://localhost:9002

    (3) 启动 APIGateway 网关服务程序  http://localhost:9000

    

三. 关于ReRoutes路由介绍

  在上面示例中,使用了基本的路由配置,在ocelot路由配置中,还有许多特性,比如:   

  (1) 给DownstreamPathTemplate和UpstreamPathTemplate设置占位符,来捕捉所有类型的ReRoute,是使用直接代理。

  (2) 设置上游(客户端)的主机头来匹配 "UpstreamHost": "somedomain.com"。

  (3) 设置路由的优先级,Priority的数字越高代表级别越高。

  (4) 设置动态路由,不必提供ReRoute配置。

  (5) 设置查询字符串,根据url的参数unitId={unitId}来匹配转发。

  

参考文献

  构建基础Ocelot项目介绍

  官方文档

net core体系-API-1Ocelot-(1)概要的更多相关文章

  1. net core体系-1概要

    .net core最近园子讨论频率很高的话题,从不久前发布正式版本后,也是开始从netcore官网一步一步走向学习之路:.net跨平台的设计让人很是兴奋起来,因为做了多年的互联网研发者,见识了很多一流 ...

  2. 如何在ASP.NET Core Web API测试中使用Postman

    使用Postman进行手动测试 如果您是开发人员,测试人员或管理人员,则在构建和使用应用程序时,有时了解各种API方法可能是一个挑战. 使用带有.NET Core的Postman为您的Web API生 ...

  3. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  4. Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API 下

    一,引言 上一节讲到如何在我们的项目中集成Azure AD 保护我们的API资源,以及在项目中集成Swagger,并且如何把Swagger作为一个客户端进行认证和授权去访问我们的WebApi资源的?本 ...

  5. 加快ASP。NET Core WEB API应用程序。第2部分

    下载source from GitHub 使用各种方法来增加ASP.NET Core WEB API应用程序的生产力 介绍 第1部分.创建测试RESTful WEB API应用程序第2部分.增加了AS ...

  6. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  7. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  8. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  9. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  10. ASP.NET Core Web API Cassandra CRUD 操作

    在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...

随机推荐

  1. Python2018-列表的相关操作

    列表中存放的数据是可以进行修改的,比如"增"."删"."改" .“查” "增"-----append, extend, ...

  2. HNU 2015暑期新队员训练赛2 H Blanket

    把每个 bi *x + ri ( 0 <= ri <= ai)标记, 输出被标记 0 – N 次的个数 #include<iostream> #include<cstdi ...

  3. [正则表达式]匹配Unicode

    一.PHP[PCRE]之Unicode PCRE支持的16进制字符编码转义符有 \x00-\xFF,或\x{num},num为任意位16进制数 但并不支持\u0000-\uFFFF这的形式 PCRE运 ...

  4. [PHP]flock文件IO锁的使用

    一.flock概述 bool flock  ( resource $handle  , int $operation  [, int &$wouldblock  ] ) 参数 handle 文 ...

  5. 布思算法——Java实现

    前面一篇提到二进制队列实现了 N位二进制的补码,那么我们来实现布思算法. 关于BinaryQueue:https://www.cnblogs.com/XT-xutao/p/10050518.html ...

  6. Winform中的TextBox的小技巧

    1  一些常用属性this.textBox5.PasswordChar = '@';  //密码的样式            this.textBox5.UseSystemPasswordChar = ...

  7. JS控制文本框内键盘上下左右键的焦点

    avaScript键盘上下左右控制文本框焦点的方法有很多,这里简单说两种方法: 方法一: 创建一个table的dom元素,包含5行4列的文本框 <!DOCTYPE HTML PUBLIC &qu ...

  8. mongodb基类封装实例

    mongodb的基类 1 <?php 2 3 namespace BI\Service\MongoDB; 4 5 use MongoDB\Driver\BulkWrite; 6 use Mong ...

  9. day 13 装饰器

    装饰器基础 装饰器的目的是为了给被装饰 对象,增加新功能,或者说增加某种能力 在程序中工具就是函数 如此一来,装饰器指的就是一个函数,被装饰着也是一个函数 总结;装饰器就是用一个函数去拓展另外一个已存 ...

  10. 【python】正则替换

    正则替换可以使用函数 例如:替换字符串中所有#1.2.3.4#格式中的数字为0 import re def replace(x): def _replace(matched): m = matched ...