前言

卯兔敲门,新的一年,祝大家前‘兔’似锦!希望大家假后还能找到公司的大门 O(∩_∩)O !
书接上文,我们使用了 Consul实现了服务注册与发现,对Consul不熟悉的同学可以先看看。这篇文章我们来学习Ocelot网关,在这之前我们首先得需要知道“什么是API网关?”,“为什么要选择Ocelot?”以及“如何将Consul与Ocelot结合起来”等等,同样这些知识点网上的文章也介绍得比较详细了,我这里也只做简单的介绍,然后本文只是个人学习与分享,不喜勿喷,谢谢。

什么是API网关?

Ocelot 介绍

.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
Ocelot的开源地址:GitHub - ThreeMammals/Ocelot: .NET core API Gateway
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由请求聚合服务发现认证鉴权限流熔断、并内置了负载均衡器Service FabricButterfly Tracing集成。而且这些功能都只需要简单的配置即可完成。

Ocelot工作流程

实际上Ocelot就是一系列按特定顺序排列的中间件。

基本上就是这样,还有很多其他功能。

基本集成

.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
想要了解更多信息请移步官网 Big Picture — Ocelot 1.0.0 documentation

环境准备

.Net 6
Docker desktop
Visual Studio 2022
GitHub - fengzhonghao8-24/ConsulIntroduction

项目配置

在我们之前的Consul示例项目中新增一个WebApi项目Gateway
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
添加Ocelot的NuGet包
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
Program.cs 文件中将Ocelot进行IOC注入,并替换我们原有的管道模型
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
增加Ocelot配置文件
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP

  • DownstreamPathTemplate:下游服务转发地址模板
  • DownstreamScheme:下游服务http schema
  • DownstreamHostAndPorts:下游服务的地址,一般只会包含一个条目,如果想希望对下游服务的请求进行负载的话这里可以填多项,同时选择一个负载均衡器 LoadBalancerOptions
  • UpstreamPathTemplate: 上游也就是用户输入的请求Url模板
  • UpstreamHttpMethod: 上游请求http方法,可使用数组

Program增加应用文件配置
Ocelot 支持在更改时重新加载 json 配置文件。

然后通过Gateway项目来访问我们上篇文章配置好的服务ServiceA
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
OK,成功访问,最基础的配置就这么简单。
然后还有一些常用的配置

路由

万能模板

此模板的优先级低于任何其他 Route。如果你的配置中也有下面的 Route,那么 Ocelot 会在 catch all 之前匹配它。

{
	"DownstreamPathTemplate":"/{url}",
	"DownstreamScheme":"https",
	"DownstreamHostAndPorts":[
		{
			"Host":"localhost",
			"Port":80,
		}
	],
	"UpstreamPathTemplate":"/{url}",
	"UpstreamHttpMethod":["Get"]
}

Prioirty优先级

可以通过在 ocelot.json 中包含“优先级”属性来定义您希望路由与上游 HttpRequest 匹配的顺序

{    
	"Priority": 0 
}

0 是最低优先级,Ocelot 始终将 0 用于 /{catchAll} 路由,硬编码设置

路由负载均衡

当下游服务有多个节点的时候,我们可以在DownstreamHostAndPorts中进行配置。
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
LoadBalancerOptions将决定负载均衡的算法

  • LeastConnection – 将请求发往最空闲的那个服务器
  • RoundRobin – 轮流发送
  • NoLoadBalance – 总是发往第一个请求或者是服务发现

当然这里只是作为示例演示,都只是硬编码模式,实际情况我们需要动态的管理服务实例,所以最终会结合Consul来进行使用。

自定义负载均衡策略

当然也可以自定义负载均衡策略,实现ILoadBalancer接口然后根据抽象出来的下游节点信息 Service来做自定义操作即可
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
这里不做多概述,感兴趣的同学可以参考源码自行实现。

其他

当然Ocelot还支持很多其他功能,感兴趣的同学可以移步官网Big Picture — Ocelot 1.0.0 documentation

Consul + Ocelot

为什么要将Consul与Ocelot结合使用?

.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP

添加Consul配置

在我们 Geteway 项目中安装 Ocelot.Provider.Consul Nuget包,然后在 Program.c 中增加IOC配置
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
然后在ocelot.json文件中增加配置
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP

  • UseServiceDiscovery:true – 使用服务发现
  • ServiceDiscoveryProvider – 服务发现的配置
  • LoadBalancerOptions – 负载方式
  • ServiceName – 注册到Consul的服务名称

如果Consul有集群的话,ServiceDiscoveryProvider 这里可以使用 例如 Nginx 地址来做配置。

检查Consul

检查Consul服务注册情况,这里我们就只为 ServiceA 启动了两个服务节点,方便测试负载。
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP

启动项目

第一次访问 - 端口5050
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
第二次访问 - 端口5051
.Net6 使用 Ocelot + Consul 看这篇就够了-LMLPHP
到这里,我们就差不多大功告成了。
然后这里可能会遇到一些端口问题,导致通过网关访问不到服务,这里不清楚的同学可以去了解下Docker的网络模式,这里就不做多概述。

结尾

本文只是简单的介绍了Ocelot的使用以及怎么与Consul结合,后面还会继续学习网关对接JWT或者IdentityServer4,然后还有Polly,感兴趣的同学欢迎继续关注!

代码仓库地址

https://github.com/fengzhonghao8-24/Consul.Ocelot

02-09 03:07