【微服务】Ocelot微服务网关

目录

一、目的

二、Ocelot介绍

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

[3.1 搭建网关Ocelot步骤](#3.1 搭建网关Ocelot步骤)

[3.1.1、创建Net7 WebApi服务](#3.1.1、创建Net7 WebApi服务)

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

3.1.3、配置中间件和IOC注册

[3.1.4 配置文件编辑Ocelot网关配置信息](#3.1.4 配置文件编辑Ocelot网关配置信息)

[3.2 Ocelot相关配置](#3.2 Ocelot相关配置)

[3.2.1 单地址访问](#3.2.1 单地址访问)

[3.2.2 多地址访问](#3.2.2 多地址访问)

[3.2.3 单地址多实例负载均衡](#3.2.3 单地址多实例负载均衡)

[3.2.4 负载均衡+Consul(服务发现)](#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注册

cs 复制代码
//配置Ocelot中间件设置和注册到Ioc
builder.Services.AddOcelot();

//使用Ocelot中间件
app.UseOcelot();

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

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

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

cs 复制代码
builder.Configuration.AddJsonFile("configuration.json", true, true);

3.2 Ocelot相关配置

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

3.2.1 单地址访问

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

javascript 复制代码
{
  "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

javascript 复制代码
//  //*****************************多地址********************************
{
  "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的负载很像。

javascript 复制代码
//*****************************单地址多实例负载均衡********************************
{
  "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

cs 复制代码
builder.Services.AddOcelot()
    .AddConsul();

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

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

//设置node地址

consul agent -dev -node=127.0.0.1

3、Json配置内容

javascript 复制代码
//*****************************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的服务治理相关。

欢迎大家多多交流~

相关推荐
论迹3 小时前
【Spring Cloud 微服务】-- 服务拆分原则
java·spring cloud·微服务
星光一影5 小时前
PDF工具箱/合并拆分pdf/提取图片
pdf·c#
baivfhpwxf20236 小时前
要在 WPF 中实现数据表对应实体的属性与 UI 控件的双向绑定,并支持修改通知和 UI 自动更新
c#·wpf
秋月的私语7 小时前
代码自动生成文本小工具TextStringizerWpf
c#
葛小白17 小时前
Winform控件:Chart
c#·winform·chart
好望角雾眠16 小时前
第四阶段C#通讯开发-9:网络协议Modbus下的TCP与UDP
网络·笔记·网络协议·tcp/ip·c#·modbus
我是苏苏18 小时前
C#基础:如何从现有类库复制一个新的类库,并且加入解决方案
开发语言·c#
阿里云云原生19 小时前
阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态
阿里云·微服务·云原生·云计算
Tadas-Gao21 小时前
MySQL存储架构解析:从数据无序到索引艺术的演进
数据库·分布式·mysql·微服务·云原生·架构
CV_J21 小时前
编写微服务api
微服务·云原生·架构