API网关—Ocelot

本文介绍了如何使用Ocelot作为API网关,解决微服务架构中的服务暴露问题,涵盖了请求转发、负载均衡、限流熔断等功能的配置与实践。通过实例展示了如何在.NET Core中部署Ocelot并配置路由转发到后端服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. API网关

我们知道在微服务架构中,后端会有许许多多的服务实例,但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多数据,这些数据可能来自于不同的微服务中。这就会出现一下的这种情况:
在这里插入图片描述
这种情况下,前端 UI 展示需要知道数据来源于哪个服务,需要知道每一个服务的 ip 和端口,但是按照微服务的设计原则,服务的划分是随时间变化的,服务实例也是可以伸缩的,也就是后端接口的 IP 和端口是不固定的,这将会导致前端 UI 展示多了很多不确定的因素。

而 API 网关就是这场景下的一个解决方案,它充当了多个服务的大门,整个微服务架构的统一入口,从面向对象设计的角度看,它与外观模式类似,封装了系统的内部复杂结构,同时它还可以承担其他的一些职责,处理非业务功能,实现各个微服务公共的功能。

在这里插入图片描述
API 网关应该包含如下一些功能:

  1. 请求转发,统一对外接口

    将前端请求的 Http Api 按照一定的规则转发到内部对应的服务,并将结果返回到前端

  2. 负载均衡

    在同一个服务存在多个实例的情况,根据一定规则将 Http Api 请求合适的分配到不同实例中,以应对高并发的情况

  3. 限流熔断

    限制同一个 API 接口一定时间内的请求次数,避免请求过于频繁,后端服务处理不过来,在后端服务出现故障时,直接截断请求,不往后端服务转发

  4. 认证鉴权

    进行统一的认证鉴权,免去各个服务的重复认证

  5. 监控

    对服务调用链路进行跟踪监控

2. Ocelot

Ocelot 是一个 .NET Core 平台上的一个开源的 API Gateway,包含了路由转发、负载均衡、限流熔断等功能,并且集成了 IdentityServer(身份验证)和 Consul(服务注册发现)。以下示例基于 Ocelot 17.0.1 版本。

2.1 Ocelot 的基本使用

  1. 准备一个 API 服务

    创建一个 ASP.Net Core WebAPI 项目,修改一下默认接口
    在这里插入图片描述
    在这里插入图片描述

  2. 创建网关应用

    (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之服务发现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值