Ocelot API网关的实现剖析

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ocelot API网关的实现剖析相关的知识,希望对你有一定的参考价值。

 

Ocelot API网关的实现剖析

Ocelot API网关的实现剖析

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

Ocelot API网关的实现剖析

Ocelot API网关的实现剖析

这里列出了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网关的实现剖析

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

Ocelot API网关的实现剖析

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网关的实现剖析

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

 

Ocelot API网关的实现剖析

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网关的实现剖析


  • A 为 Singleton

  • B 为 Scoped

  • C 为 Transient

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

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

Ocelot API网关的实现剖析

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

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

Ocelot API网关的实现剖析

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

3、自定义管理控制台

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

 
   
   
 

以上是关于Ocelot API网关的实现剖析的主要内容,如果未能解决你的问题,请参考以下文章

AKS 中的 Ocelot API 网关实现

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

Ocelot一款.NET下的API网关介绍

.NET Core开源API网关 – Ocelot中文文档

如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?

.NET微服务从0到1:API网关(Ocelot)