Ocelot API网关的实现剖析

转:http://www.javashuo.com/article/p-wtfmtrfv-es.htmlhtml

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

image

 

我在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 是一个集成社区中众多优秀开源项目的表明。git

image

image

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

image

image

这里列出了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 windows

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

image

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

image

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 也是逐一回传,以先进后出的方式处理每个封包:框架

image

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

 ASP.NET Core 教學 - Middleware - 運做方式

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 ,形象的演示了对象生命周期。

ASP.NET Core 教學 - Dependency Injection - 運做方式動畫

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

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

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

image

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

二、自定义扩展下游通信协议

image

Ocelot 默认支持Http的通信,在咱们的实际项目中有不少老的服务是RPC调用,使用的是私有的Relay通信框架,在API网关上须要作协议转换,自动将Http的请求转换成Relay的tcp通信。

三、自定义管理控制台

image

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

相关文章
相关标签/搜索