API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址、限制进入、安全检查、位置引导等工作,我们可以形象的用下图来表示: 外部设备需要访问内部系统服务时必须要通过我们的API Gateway,目的是为了隔离内部服务和外部访问来做统一的认证授权,限流熔断,请求聚合,负载均衡,日志记录,监控预警等 通用功能,就像是我们系统的防火墙一样,在任何外部请求访问系统时都必须经过防火墙的验证。
更多关于网关的信息请参考前面的一篇文章《API网关模式》
Ocelot是什么?Ocelot是基于.NET Core实现的轻量级API网关,它包括的主要功能有:路由、请求聚合、服务发现、认证、授权、限流熔断、并内置了LoadBanalce以及集成了Service Fabric、 Consul、Eureka等功能,这些功能只都只需要简单的配置即可使用。目前腾讯财付通的API Gateway就是基于此做的实现(参考善友兄的这篇文章),下面是详细信息以及Ocelot如何在微软官方示例代码库 eShopContainers中的使用。
Ocelot在腾讯的使用:https://customers.microsoft.com/en-us/story/tencent-telecommunications-dotnetcore
微软官方示例:https://github.com/dotnet-architecture/eShopOnContainers
简单的来说它是一堆的asp.net core middleware组成的pipeline,当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务 返回response之后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。
代码示例我在Github上创建了示例代码库仅供参考,我们可以使用下面的步骤来创建示例代码:(示例代码)
1.创建BookingApi: dotnet new -n BookingApi
2.创建PassengerApi: dotnet new -n PassengerApi
3.创建ApiGateway: dotnet new -n ApiGateway
4.添加BookingApi和PassengerApi的实现代码
5.在ApiGateway项目中用Nuget安装Ocelot依赖包
6.添加configuration.json的配置文件
7.配置路由响应规则
8.启动服务并通过Api网关访问服务
启动BookingApi PassengerApi这两个服务,我们可以看到他们分别提供了两个接口
此时再启动我们的Api Gateway项目,通过Gateway来访问我们这两个API
我们可以看到原本我们可以直接访问的两个API现在都可以通过Gateway来访问了,那这一切是怎么做到的呢?
当我们通过Nuget安装Ocelot的依赖之后,我们需要在项目中添加.json的配置文件,在此项目中我们配置文件命名为configuration.json,内容如下:
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/booking", "UpstreamPathTemplate": "/api/getbooking", "UpstreamHttpMethod": [ "Get" ], "ReRouteIsCaseSensitive": false, "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8001 } ], "Key": "booking", "RateLimitOptions": { "ClientWhitelist": [], "EnableRateLimiting": true, "Period": "1s", "PeriodTimespan": 15, "Limit": 1 } }, { "DownstreamPathTemplate": "/api/booking/{pnr}", "UpstreamPathTemplate": "/api/getbooking/{pnr}", "UpstreamHttpMethod": [ "Get" ], "ReRouteIsCaseSensitive": false, "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8001 } ] }, { "DownstreamPathTemplate": "/api/passenger", "UpstreamPathTemplate": "/api/getpassenger", "UpstreamHttpMethod": [ "Get" ], "ReRouteIsCaseSensitive": false, "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8002 } ], "Key": "passenger" }, { "DownstreamPathTemplate": "/api/passenger/{id}", "UpstreamPathTemplate": "/api/getpassenger/{id}", "UpstreamHttpMethod": [ "Get" ], "ReRouteIsCaseSensitive": false, "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8002 } ] } ], "GlobalConfiguration": { "BaseUrl": "https://localhost:5000" }, "Aggregates": [ { "ReRouteKeys": [ "booking", "passenger" ], "UpstreamPathTemplate": "/api/getbookingpassengerinfo" } ] }