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

三、.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的服务治理相关。
欢迎大家多多交流~