【微服务】Ocelot微服务网关

目录

一、目的

二、Ocelot介绍

三、.Net中使用Ocelot搭建网关服务

3.1 搭建网关Ocelot步骤

 3.1.1、创建Net7 WebApi服务

3.1.2、Nuget引入-Ocelot程序包(版本:19.0.2)

3.1.3、配置中间件和IOC注册

3.1.4 配置文件编辑Ocelot网关配置信息

3.2 Ocelot相关配置

3.2.1 单地址访问

3.2.2 多地址访问

3.2.3 单地址多实例负载均衡

3.2.4 负载均衡+Consul(服务发现)

四、文章总结


一、目的

         在微服务架构中,网关作为系统的统一入口,承担着路由转发、负载均衡、安全控制等核心功能,是确保系统高效运行的关键组件。市面上一些主流网关:Kong、Envoy、Spring Cloud Gateway、Bumblebee、Ocelot(C#开源-微软-腾讯---Abp.vnext内置)。

        这里主要讲解通过Ocelot设计微服务Api网关。

    二、Ocelot介绍

            Ocelot网关是一款基于.NET Core开发的开源API网关,专为微服务架构设计,其主要作用包括统一管理客户端请求、提升系统安全性和可维护性‌.

        网关的作用包括:

    1. 请求路由‌:通过配置文件定义路由规则,将客户端请求动态转发到对应的下游服务,支持路径占位符(如/{userId})和通配符匹配‌。
    2. 负载均衡‌:集成轮询、随机、最少连接数等算法,分发请求到多个服务实例,提高可用性和性能‌。
    3. 服务发现‌:自动集成Consul或Eureka等注册中心,实时发现服务地址,减少手动配置负担‌。
    4. 认证与授权‌:支持JWT、OAuth2等认证方式,实现统一身份验证和基于角色的访问控制(RBAC),保障资源安全‌。
    5. 限流与熔断‌:采用令牌桶算法限制请求速率,防止服务过载;熔断机制在服务故障时快速失败,避免级联崩溃‌。
    6. 请求聚合‌:合并多个下游服务的响应为单一结果,减少客户端请求次数,优化用户体验‌。
    7. 日志与监控‌:记录请求日志和性能指标,支持与Serilog、Prometheus等工具集成,便于运维分析和优化‌。
    8. 统一入口‌:作为微服务架构的单一接入点,屏蔽后端服务复杂性,降低客户端与服务间的耦合度‌。

    三、.Net中使用Ocelot搭建网关服务

    3.1 搭建网关Ocelot步骤

     3.1.1、创建Net7 WebApi服务

    3.1.2、Nuget引入-Ocelot程序包(版本:19.0.2)

            dotnet add packages Ocelot

    3.1.3、配置中间件和IOC注册

    //配置Ocelot中间件设置和注册到Ioc
    builder.Services.AddOcelot();
    
    //使用Ocelot中间件
    app.UseOcelot();

    3.1.4 配置文件编辑Ocelot网关配置信息

    为了便于区分,新增一个configuration配置文件用来编辑Ocelot网关相关信息。

    创建了配置文件就需要在重新读取配置文件,appsettings是默认读取的,这里需要在读取configuration中的内容:

    builder.Configuration.AddJsonFile("configuration.json", true, true);

    3.2 Ocelot相关配置

            Ocelot在注册服务到Ioc时,AddOcelot方法在构建Ocelot服务时,对通过读取配置文件中的信息来设置相关服务。以下是几种常见的服务配置方式。

    3.2.1 单地址访问

            这里配置了单地址转发,通过配置文件定义路由规则,将请求动态转发到对应的下游服务,通过占位符"/Test80"和通配符访问。

    {
      "Routes": [
        {
          "DownstreamPathTemplate": "/api/{url}", //服务地址,Url变量
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "127.0.0.1",
              "Port": 80 //服务端口
            } //http://127.0.0.1:80
          ],
          "UpstreamPathTemplate": "/Test80/{url}", //网关地址: Url变量
          "UpstreamHttpMethod": [ "Get", "Post" ]
        }
      ]
    }

    3.2.2 多地址访问

          网关支持多个服务地址,转发请求。模拟客户端请求不同的服务示例。如:

    访问: https://网关ip:80/Test81/Test/Get

    //  //*****************************多地址********************************
    {
      "Routes": [
        {
          "DownstreamPathTemplate": "/api/{url}", //服务地址,Url变量
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "127.0.0.1",
              "Port": 81 //服务端口
            }
          ],
          "UpstreamPathTemplate": "/Test81/{url}", //网关地址: Url变量
          "UpstreamHttpMethod": [ "Get", "Post" ]
        },
        {
          "DownstreamPathTemplate": "/api/{url}", //服务地址,Url变量
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "127.0.0.1",
              "Port": 82 //服务端口
            }
          ],
          "UpstreamPathTemplate": "/Test82/{url}", //网关地址: Url变量
          "UpstreamHttpMethod": [ "Get", "Post" ]
        },
        {
          "DownstreamPathTemplate": "/api/{url}", //服务地址,Url变量
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "127.0.0.1",
              "Port": 83 //服务端口
            }
          ],
          "UpstreamPathTemplate": "/Test83/{url}", //网关地址: Url变量
          "UpstreamHttpMethod": [ "Get", "Post" ]
        }
      ]
    }

    3.2.3 单地址多实例负载均衡

            可以负载均衡,客户端请求网关时,会根据负载策略去匹配不同的示例。但是不能动态伸缩服务, 所以一般不会使用他来做负载均衡, 需要和Consul做集成。这种处理方式和nginx的负载很像。

    //*****************************单地址多实例负载均衡********************************
    {
      "Routes": [
        {
          "DownstreamPathTemplate": "/api/{url}", //服务地址Url变量
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "127.0.0.1",
              "Port": 81
            },
            {
              "Host": "127.0.0.1",
              "Port": 82
            },
            {
              "Host": "127.0.0.1",
              "Port": 83
            } //能负载均衡,但是不能动态伸缩, 需要结合Consul来完成
          ],
          "UpstreamPathTemplate": "/Test/{url}", //网关地址: Url变量
          "UpstreamHttpMethod": [ "Get", "Post" ],
          "LoadBalancerOptions": {
            "Type": "RoundRobin" //轮询 // "LeastConnection" //最小连接数的服务器  "NoLoadBalance" //不负载均衡 
          }
        }
      ]
    }

    3.2.4 负载均衡+Consul(服务发现)

            1、在网关中配置Consul,注册Consul到Ocelot中,引用Ocelot.Provider.Consul

    dotnet add package Ocelot.Provider.Consul

            2、配置Consul注册到Ocelot

    builder.Services.AddOcelot()
        .AddConsul();

    ps:ocelot请求时,通过Consul获取的默认服务名称会通过本机名字匹配。默认请求时可能会出现通过consul访问对应服务节点的情况。(此处测试时Consul在window上运行)

    解决方案:启动Consul的node节点.此处写上服务端地址

    //设置node地址

    consul agent -dev -node=127.0.0.1

            3、Json配置内容

    //*****************************Consul服务发现
    {
      "Routes": [
        {
    
          "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
          "DownstreamScheme": "http",
          "UpstreamPathTemplate": "/Test/{url}", //网关地址--url变量
          "UpstreamHttpMethod": [ "Get", "Post" ],
          "UseServiceDiscovery": true,
          "ServiceName": "TestService", //consul服务名称
          "LoadBalancerOptions": {
            "Type": "RoundRobin" //轮询 "LeastConnection-最少连接数的服务器NoLoadBalance不负载均衡"
          }
        }
      ],
      "GlobalConfiguration": {
        //"BaseUrl": "http://127.0.0.1:6299", //网关对外地址
        "ServiceDiscoveryProvider": {
          "Host": "127.0.0.1",
          "Port": 8500,
          "Type": "Consul" //由Consul提供服务发现,每次请求去consul
        }
    
      }
    }

    四、文章总结

            以上内容基本满足网关搭建的使用,本篇主要介绍基础的使用方式。Ocelot还有更多高级的用法,也会在后面的文章中慢慢补上。例如:Ocelot缓存、自定义负载均衡规则以及接入Polly的服务治理相关。

            欢迎大家多多交流~

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    勿芮介

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值