转: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
我在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
业务的飞速发展,产生的很是多的对外的服务接口,分散在组织的各个地方须要进行统一的管理,并且咱们的环境是linux和windows的混合环境,咱们的目标是统一在公司的Linux环境,.NET Core对于.NET 技术团队来讲是一个很是棒的技术,并且.NET Core自己的架构很是好,性能就更好了。github
这里列出了Ocelot目前支持的特性:编程
更详细的内容参看文档 https://github.com/TomPallister/Ocelot/wiki windows
上面介绍了Ocelot的功能特性,接下来咱们进入介绍Ocelot 的实现原理剖析,核心是是ASP.NET Core Middleware 以及 ASP.NET Core DependencyInjection:架构
ASP.NET Core 传统的ASP.NET 在架构上有很大的改进,更加的模块化,下图形象的说明了他们之间区别,Application 和 Middleware 是平等的,好比ASP.NET Core MVC也是一个Middleware,经过Middleware这样的结构咱们很是容易的扩展咱们的应用程序。mvc
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 也是逐一回传,以先进后出的方式处理每个封包:框架
具体内容参考: ASP.NET Core HTTP 管道中的那些事儿 和 如何一秒钟从头构建一个 ASP.NET Core 中间件, 咱们在Middleware的编程过程当中须要关注HttpContext 以及管道的注册者和构建者 ApplicationBuilder。asp.net
ASP.NET Core 使用了大量的 DI (Dependency Injection) 设计,一样咱们在Ocelot的设计中也使用了大量的DI设计,具体参看源码https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs
注册 Service 有分三种方式:
下面这张图来自https://blog.johnwu.cc/article/asp-net-core-dependency-injection.html ,形象的演示了对象生命周期。
上面介绍完了Ocelot开发的基本原理,目前Ocelot 由17 个Middleware 来完成,在每一个Middleware的内部实现上还有涉及到不少业务的知识,本篇文章先不作展开,后续写具体的文章详细解析。接下来咱们来讲说如何自定义扩展,在咱们的项目中主要在三个方面进行了扩展:
一、自定义扩展API 接口验证
Ocelot 默认支持基于IdentityServer4的认证,须要自定义认证,能够参考 https://github.com/TomPallister/Ocelot/pull/110,添加自定义的验证,可是.net core 2.0 认证部分基本上重写了。
二、自定义扩展下游通信协议
Ocelot 默认支持Http的通信,在咱们的实际项目中有不少老的服务是RPC调用,使用的是私有的Relay通信框架,在API网关上须要作协议转换,自动将Http的请求转换成Relay的tcp通信。
三、自定义管理控制台
ocelot 有管理API,能够基于管理API 作自定义的管理控制台,github 有个 https://github.com/dbarkwell/Ocelot.ConfigEditor,这个项目实现了asp.net core mvc 的在线编辑路由。