首页 > 其他分享 >Ocelot API网关的实现剖析

Ocelot API网关的实现剖析

时间:2022-12-14 14:33:44浏览次数:70  
标签:Core 网关 github Middleware API Ocelot ASP NET

在微软Tech Summit 2017 大会上和大家分享了一门课程《.NET Core 在腾讯财付通的企业级应用开发实践》,其中重点是基于ASP.NET Core打造可扩展的高性能企业级API网关,以开源的API网关Ocelot为基础结合自己的业务特性,当天课程只有40分钟,有很多内容都没有展开,接下来就用一篇小文章来聊下Ocelot 的实现原理,大家在使用的过程中也可以一起来贡献。 总体来说这是一个ASP.NET Core 高级编程的内容,之前在公众号里已经发过不少各位朋友写的文章,今天都会在这篇文章中引用,让你进一步深入学习。

​​Ocelot API网关的实现剖析_github​​


我在github上的地址​​https://github.com/geffzhang​​​ 欢迎互粉,Ocelot在github的地址 ​​https://github.com/TomPallister/Ocelot​​​ , 非常给力的是在课程当天完成了.NET Core 2.0的升级,升级过程请看​​https://github.com/TomPallister/Ocelot/issues/114​​​ 。昨天我花了半小时就把我的另外一个POC项目Nanofabric   ​​https://github.com/geffzhang/NanoFabric​​ 升级到了.NET Core 2.0, 这个POC项目也是我的分享的项目的原型,可以这么说.NET Core 2.0 8月份正式发布,经过3 个月时间的发展,社区生态已经都已经做好了准备,开发新项目可以采用.NET Core 2,Ocelot 是一个集成社区中众多优秀开源项目的代表。

​​Ocelot API网关的实现剖析_github_02​​

​​Ocelot API网关的实现剖析_github_03​​

业务的飞速发展,产生的非常多的对外的服务接口,分散在组织的各个地方需要进行统一的管理,而且我们的环境是linux和windows的混合环境,我们的目标是统一在公司的Linux环境,.NET Core对于.NET 技术团队来说是一个非常棒的技术,而且.NET Core本身的架构非常好,性能就更好了。

​​Ocelot API网关的实现剖析_github_04​​

​​Ocelot API网关的实现剖析_ASP_05​​

这里列出了Ocelot目前支持的特性:

  • Routing
  • 用户可以指定上游请求之间的映射,并将其转发到下游服务上的不同URL。
  • Service Discovery
  • Ocelot可以查看你的服务发现,并找到它应该转发下游请求的服务。它可以在这些服务之间进行负载平衡。.
  • Authentication using IdentityServer
  • 您可以将端点标记为已认证,并使用IdentityServer承载标记对您的用户进行身份验证.
  • Authorisation using Claims
  • 如果使用 bearer tokens, 可以使用 claims 标记特定 endpoints是授权的
  • Claims Transformation
  • Ocelot提供了一种语法来转换给下游请求,并将声明数据添加到标题,URL参数,其他声明等等
  • Quality of service
  • Retries, circuit breaker, timeouts etc.
  • Request / Correlation Ids
  • Caching
  • Logging
  • Custom Middleware

更详细的内容参看文档 ​​https://github.com/TomPallister/Ocelot/wiki​​ 

上面介绍了Ocelot的功能特性,接下来我们进入介绍Ocelot 的实现原理剖析,核心是是ASP.NET Core Middleware 以及 ASP.NET Core DependencyInjection:

​​Ocelot API网关的实现剖析_Core_06​​

ASP.NET Core 传统的ASP.NET 在架构上有很大的改进,更加的模块化,下图形象的说明了他们之间区别,Application 和 Middleware 是平等的,比如ASP.NET Core MVC也是一个Middleware,通过Middleware这样的结构我们非常容易的扩展我们的应用程序。

​​Ocelot API网关的实现剖析_github_07​​

Ocelot就是使用Middleware来完成网关的所有功能,每个小功能就是一个Middleware,具体可以看代码 ​​https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/Middleware/OcelotMiddlewareExtensions.cs​​ ,Ocelot 是如何把各个Middleware串起来协同完成一个API网关的功能。 asp.net core 非常巧妙的设计,把Middleware抽象成了一个委托RequestDelegate, ASP.NET Core 的每个 Request 都会经过每个所注册的 Middleware,Response 也是逐一回传,以先进后出的方式处理每一个封包:

​​Ocelot API网关的实现剖析_Core_08​​

具体内容参考: ​​ASP.NET Core HTTP 管道中的那些事儿​​ 和 ​​如何一秒钟从头构建一个 ASP.NET Core 中间件​​, 我们在Middleware的编程过程中需要关注HttpContext 以及管道的注册者和构建者 ApplicationBuilder。

 

Ocelot API网关的实现剖析_ASP_09

ASP.NET Core 使用了大量的 DI (Dependency Injection) 设计,同样我们在Ocelot的设计中也使用了大量的DI设计,具体参看源码​​https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs​​ 

注册 Service 有分三种方式:

  • Transient  每次注入时,都重新 new 一个新的实体。
  • Scoped    每个 Request 都重新 new 一个新的实体。
  • Singleton 程序启动后会 new 一个实体。也就是运行期间只会有一个实体。

下面这张图来自​​https://blog.johnwu.cc/article/asp-net-core-dependency-injection.html​​ ,形象的演示了对象生命周期。

Ocelot API网关的实现剖析_ASP_10

  • A 为 Singleton
  • B 为 Scoped
  • C 为 Transient

上面介绍完了Ocelot开发的基本原理,目前Ocelot 由17 个Middleware 来完成,在每个Middleware的内部实现上还有涉及到很多业务的知识,本篇文章先不做展开,后续写具体的文章详细解析。接下来我们来说说如何自定义扩展,在我们的项目中主要在三个方面进行了扩展:

1、自定义扩展API 接口验证

​​Ocelot API网关的实现剖析_github_11​​

Ocelot 默认支持基于IdentityServer4的认证,需要自定义认证,可以参考 ​​https://github.com/TomPallister/Ocelot/pull/110​​,添加自定义的验证,但是.net core 2.0 认证部分基本上重写了。

2、自定义扩展下游通讯协议

​​Ocelot API网关的实现剖析_Core_12​​

Ocelot 默认支持Http的通讯,在我们的实际项目中有很多老的服务是RPC调用,使用的是私有的Relay通讯框架,在API网关上需要做协议转换,自动将Http的请求转换成Relay的tcp通讯。

3、自定义管理控制台

​​Ocelot API网关的实现剖析_github_13​​

ocelot 有管理API,可以基于管理API 做自定义的管理控制台,github 有个 ​​https://github.com/dbarkwell/Ocelot.ConfigEditor​​,这个项目实现了asp.net core mvc 的在线编辑路由。



标签:Core,网关,github,Middleware,API,Ocelot,ASP,NET
From: https://blog.51cto.com/shanyou/5936690

相关文章

  • 搭建网关微服务实现接口统一访问
    我们现在搭建一个Zuul网关,实现在第9章创建的商品和订单两个微服务的接口通过网关统一访问。同样,先创建一个SpringBoot项目,命名为zuul,如图所示。  然后,在“Dependenc......
  • 网关介绍
    网关指的是一个网络连接到另一个网络的“关口”。在Internet里,网关是一种连接内部网与Internet上其他网络的中间设备,通俗来说,也叫作“路由器”。网关地址是能够理解成内部......
  • API 错误排查
    1.找出报错API的日志2.在浏览器中直接打开,不行的话就用PostMan,看访问API是否正常登录postman复制访问url:https://xxx/api/charts?userId=123Authorization->Typ......
  • Eureka REST API
    EurekaRESTAPI是指通过指定的URL来查询或操纵注册到EurekaServer的EurekaClient。Netflix官方在GitHub的Wiki上专门写了一篇文章“EurekaRESToperations”来介绍Eur......
  • 我做了第一个ChatGPT .net api聊天库
    最近这个ChatGPT很火啊,看了B站上很多视频,自己非常手痒,高低自己得整一个啊,但是让我很难受的是,翻遍了github前十页,竟然没有一个C#的ChatGPT项目,我好难受啊!那能怎么办?自己搞......
  • apipost通过预执行脚本,设置默认请求头
     await$.ajax({method:"GET",url:"http://10.10.106.207:9511/debug_device_code",success:function(response){apt.setRequestHeader("D......
  • 《Redis DevOps》二:API的理解和使用
    概述数据结构与内部编码优点:1)改进内部编码时,对外数据结构与命令无影响2)多种内部编码适配不同使用场景单线程架构单线程访问快速的原因:1)纯内存访问2)非阻塞IO,ep......
  • HarmonyOS实现登录页面(四)相关api的测试+内网穿透(Postman, NATAPP)
    Postman对应结果NATAPP内网穿透NATAPP下载地址NATAPP新手教程不要添加多余空格NATAPP设置变量如何查询本地tomcat端口http的默认端口是80,也就copy是说,如......
  • 使用 WebAPI获取实体的复数名称
    Xrm.Utility.getEntityMetadata("opportunity","").then(function(result){console.log("当前实体的复数名称:"+result.EntitySetName);},functio......
  • webapi excel导入
     效果图  引入命名空间:usingNPOI;usingNPOI.HSSF.UserModel;usingNPOI.SS.UserModel;usingNPOI.XSSF;usingNPOI.XSSF.UserModel;usingXiaowu_Ship.Model;//......