【微服务】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的服务治理相关。

欢迎大家多多交流~

相关推荐
时光追逐者2 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 49 期(2025年8.1-8.10)
c#·.net·.netcore
喵叔哟3 小时前
42.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成认证(一)
运维·微服务·.net
★YUI★3 小时前
学习游制作记录(背包UI以及各种物品的存储)8.12
学习·游戏·ui·unity·c#
专注VB编程开发20年4 小时前
IIS Express中可以同时加载并使用.net4.0和.NET 2.0的 DLL
c++·windows·microsoft·c#·vb.net
悦人楼5 小时前
当C#遇上Notepad++:实现GCode可视化编辑的跨界实践
java·c#·notepad++
大飞pkz6 小时前
【C#】正则表达式
开发语言·正则表达式·c#·string·字符串匹配·高效字符串匹配
1990_super8 小时前
使用ceph-deploy安装和配置RADOS Gateway (RGW)并使用S3访问集群
ceph·gateway
fs哆哆10 小时前
在VB.net中,委托Action和Func,结合LINQ和Lambda表达式的应用
c#·.net·linq
向宇it11 小时前
【unity实战】在Unity中实现不规则模型的网格建造系统(附项目源码)
游戏·3d·unity·c#·游戏引擎
CodeCraft Studio11 小时前
3D文档控件Aspose.3D实用教程:在 C# 中将 3MF 文件转换为 STL
c++·3d·c#