API网关—Ocelot
1. API网关
我们知道在微服务架构中,后端会有许许多多的服务实例,但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多数据,这些数据可能来自于不同的微服务中。这就会出现一下的这种情况:
这种情况下,前端 UI 展示需要知道数据来源于哪个服务,需要知道每一个服务的 ip 和端口,但是按照微服务的设计原则,服务的划分是随时间变化的,服务实例也是可以伸缩的,也就是后端接口的 IP 和端口是不固定的,这将会导致前端 UI 展示多了很多不确定的因素。
而 API 网关就是这场景下的一个解决方案,它充当了多个服务的大门,整个微服务架构的统一入口,从面向对象设计的角度看,它与外观模式类似,封装了系统的内部复杂结构,同时它还可以承担其他的一些职责,处理非业务功能,实现各个微服务公共的功能。
API 网关应该包含如下一些功能:
-
请求转发,统一对外接口
将前端请求的 Http Api 按照一定的规则转发到内部对应的服务,并将结果返回到前端
-
负载均衡
在同一个服务存在多个实例的情况,根据一定规则将 Http Api 请求合适的分配到不同实例中,以应对高并发的情况
-
限流熔断
限制同一个 API 接口一定时间内的请求次数,避免请求过于频繁,后端服务处理不过来,在后端服务出现故障时,直接截断请求,不往后端服务转发
-
认证鉴权
进行统一的认证鉴权,免去各个服务的重复认证
-
监控
对服务调用链路进行跟踪监控
2. Ocelot
Ocelot 是一个 .NET Core 平台上的一个开源的 API Gateway,包含了路由转发、负载均衡、限流熔断等功能,并且集成了 IdentityServer(身份验证)和 Consul(服务注册发现)。以下示例基于 Ocelot 17.0.1
版本。
2.1 Ocelot 的基本使用
-
准备一个 API 服务
创建一个 ASP.Net Core WebAPI 项目,修改一下默认接口
-
创建网关应用
(1)新建一个 Web API 项目
(2)安装 Ocelot 依赖包Install-package Ocelot
(3)添加配置信息
在 appsetting.json 中加入 Ocelot 配置信息,也可以单独创建一个 ocelot.json 配置文件,单独创建文件的时候记得在主机启动的时候读取配置文件,并且注意将配置文件设置为较新则复制"Routes": [ { "UpstreamPathTemplate": "/Customer/{url}", // 外部应用对于的url模板 "UpstreamHttpMethod": [ "Get", "Post" ], "DownstreamPathTemplate": "/{url}", // 内部服务实际对于的url模板 "DownstreamScheme": "http", "DownstreamHostAndPorts": [ // 内部服务对于的ip和端口 { "Host": "localhost", "Port": "5000" } ] } ]
Ocelot 配置文件中包含两个根节点: Routes 和 GlobalConfiguration。Routes 是一个数组,其中的每一个元素代表了一个路由,我们可以针对每一个路由进行以上功能配置。而 GlobalConfiguration 可以设置一些全局配置,对每个路由都有效。这里演示路由转发,暂不涉及全局配置的部分。配置项的详细信息请见官方文档。
4)添加依赖注入
public void ConfigureServices(IServiceCollection services) { services.AddOcelot(Configuration); services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "OcelotGateWay", Version = "v1" }); }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "OcelotGateWay v1")); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseOcelot().GetAwaiter().GetResult(); //app.UseEndpoints(endpoints => //{ // endpoints.MapControllers(); //}); }
5)启动两个应用
在 vs 中通过设置启动项目,设置 CustomerService 先启动,OcelotGateWay 后启动,然后通过 postman,根据 url 模板通过 OcelotGateWay 请求 CustomerService 中的 API 接口
注意这里 5001 是网关的端口,当外部应用通过符合配置的 url 模板请求网关时,Ocelot 把客户端对网关的请求(Request),按照配置文件中的映射关系,转发给对应的后端 http service,然后从后端 http service 获取响应(Response)后,再返回给客户端。对于外部应用而言,不需要记住每个 service 所在的 IP 和端口,而是只需要告诉网关我需要消费哪个 service 即可。这就是一个网关最基本的功能。
微服务系列文章:
上一篇:配置中心—Consul配置管理
下一篇:API网关—Ocelot之服务发现