1.负载均衡

Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求。负载均衡类型:
●LeastConnection:根据服务正在处理请求量的情况来决定哪个服务来处理新请求,即将新请求发送到具有最少现有请求的服务去处理。算法状态没有分布在Ocelot集群中。
●RoundRobin:遍历可用服务并发送请求。算法状态没有分布在Ocelot集群中。
●NoLoadBalancer:从配置或服务发现中获取第一个可用服务来处理新请求。
●CookieStickySessions:通过使用Cookie,确保特定的请求能够被分配到特定的服务上进行处理。
Ocelot负载均衡项目示例中,我们通过路由的LoadBalancerOptions配置选项选择负载均衡类型:

{
"Routes": [
{
//下游路由服务地址
"DownstreamPathTemplate": "/api/values",
//下游服务地址访问协议类型http或者https
"DownstreamScheme": "http",
//下游服务的主机和端口
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 9001
},
{
"Host": "localhost",
"Port": 9002
}
],
//上游服务地址,即下游服务真实访问地址
"UpstreamPathTemplate": "/",
//负载均衡类型:轮询
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
//上游服务HTTP请求方式,例如Get、Post
"UpstreamHttpMethod": [ "Get" ]
}
]
}

新请求通过网关的时候,Ocelot会根据LoadBalancerOptions配置负载均衡类型来分发到具体下游服务。

2.服务发现

下面展示如何使用服务发现来设置路由:

{
"DownstreamPathTemplate": "/api/posts/{postId}",
"DownstreamScheme": "https",
"UpstreamPathTemplate": "/posts/{postId}",
"UpstreamHttpMethod": [ "Put" ],
"ServiceName": "product",
"LoadBalancerOptions": {
"Type": "LeastConnection"
}
}

设置此选项后,Ocelot将从服务发现提供程序中查找下游主机和端口,并在所有可用服务中进行负载平衡请求。如果您从服务发现提供者(领事)中添加和删除服务,Ocelot会停止调用已删除的服务,并开始调用已添加的服务。后续学习服务发现这块知识点时候会重新再讲解。

3.项目演示

3.1APIGateway项目

该项目通过LoadBalancerOptions配置选项定义服务负载均衡请求机制,事例项目使用的负载均衡类型是RoundRobin,在Program添加Ocelot支持代码如下:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//.UseStartup<Startup>()
.UseUrls("http://*:9000")
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
//添加Ocelot配置文件
.AddJsonFile("configuration.json")
.AddEnvironmentVariables();
})
.ConfigureServices(s =>
{
//添加Ocelot服务;
s.AddOcelot();
})
.Configure(a =>
{
    //使用Ocelot
a.UseOcelot().Wait();
});

3.2APIServicesA和APIServicesB下游服务项目

APIServicesA和APIServicesB项目分别新建两个GET请求方法,代码分别如下:

//APIServicesA
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public string Get()
{
return "From APIServiceA";
}
}
//APIServicesB
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public string Get()
{
return "From APIServiceB";
}
}

3.3项目运行

●通过dotnet run命令启动APIGateway项目(网关层)

dotnet run --project APIGateway项目路径\APIGateway.csproj


●通过dotnet run命令启动APIServicesA项目

dotnet run --project APIServicesA项目路径\APIServicesA.csproj


●通过dotnet run命令启动APIServicesB项目

dotnet run --project APIServicesB项目路径\APIServicesB.csproj


通过浏览器查看轮询分发给下游服务返回的结果:


负载均衡轮询分发下游服务成功。

4.自定义负载均衡

Ocelot支持自定义负载均衡的方法。自定义负载均衡的类需要继承ILoadBalancer接口类,下面我们定义一个简单的负载均衡循环输出下游服务的示例:

public class CustomLoadBalancer : ILoadBalancer
{
private readonly Func<Task<List<Service>>> _services;
private readonly object _lock = new object();
private int _last; public CustomLoadBalancer(Func<Task<List<Service>>> services)
{
_services = services;
}
public async Task<Response<ServiceHostAndPort>> Lease(HttpContext httpContext)
{
var services = await _services();
lock (_lock)
{
if (_last >= services.Count)
{
_last = 0;
}
var next = services[_last];
_last++;
return new OkResponse<ServiceHostAndPort>(next.HostAndPort);
}
}
public void Release(ServiceHostAndPort hostAndPort)
{
}
}

在Ocelot中注册此类:

Func<IServiceProvider, DownstreamRoute, IServiceDiscoveryProvider, CustomLoadBalancer> loadBalancerFactoryFunc =
(serviceProvider, Route, serviceDiscoveryProvider) => new CustomLoadBalancer(serviceDiscoveryProvider.Get);
s.AddOcelot().AddCustomLoadBalancer(loadBalancerFactoryFunc);

最后在路由的LoadBalancerOptions配置选项上修改为CustomLoadBalancer自定义负载均衡类名:

"LoadBalancerOptions": {
"Type": "CustomLoadBalancer"
}

运行项目调试查看结果:
第一次请求时候分发到APIServicesA项目。

第二次请求时候分发到APIServicesB项目。

从上面结果来看,自定义负载均衡成功。

参考文献:
Ocelot官网

(4)ASP.NET Core3.1 Ocelot负载均衡的更多相关文章

  1. ASP.NET中如何实现负载均衡

    ASP.NET站点中做负载均衡: 基于HTTP协议我们可能发现我们要解决两点问题: 第一,做到负载均衡,我们需要一个负载均衡器. 可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同 ...

  2. linux+asp.net core+nginx四层负载均衡

    Linux Disibutaion:Ubuntu 16.04.1 LTS Web Server:Nginx.Kestrel 关于如何在linux中部署asp.net core我这里不再详细介绍,可以参 ...

  3. asp.net core 五 SignalR 负载均衡

           SignalR : Web中的实时功能实现,所谓实时功能,就是所连接的客户端变的可用时,服务端能实时的推送内容到客户端,而不是被动的等待客户端的请求.Asp.net SignalR 源码 ...

  4. asp.net:如何实现负载均衡方案讨论 (nginx+iis实现负载均衡)

    5台阿里云服务器,ip地址分别为 ip地址                      名字简称      操作系统       iis服务器     cpu   内存DDR3      机械硬盘 11 ...

  5. (1)ASP.NET Core3.1 Ocelot介绍

    1.简介 Ocelot原本设计仅为与.NET Core一起使用的,它是一个.NET API网关,作为面向使用.NET运行微型服务/面向服务的体系结构需要统一的系统入口点,即当客户端(Web站点,手机A ...

  6. (2)ASP.NET Core3.1 Ocelot路由

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能( ...

  7. (8)ASP.NET Core3.1 Ocelot Consul服务注册与发现

    1.服务注册与发现(Service Discovery) ●服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka) ...

  8. Haproxy+asp.net +RedisSessionStateProvider 完美实现负载均衡,并且session保持

    .net framework 4.5下测试成功,使用RedisSessionStateProvider 2.2.1保持session数据,通过Haproxy保持会话数据.首先在PM下安装RedisSe ...

  9. (3)ASP.NET Core3.1 Ocelot认证

    1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后使用Ocelot基于声明的任何功能,例如授权或使用 ...

随机推荐

  1. Matlab中界面和注释---中英文切换问题

    有参考网页后实践的心得: Matlab中界面和注释---中英文切换问题 网上有大把的方法,并不是一一有效,这里介绍一种比较简单的方法我自己的电脑挺好用的,大家的电脑matlab需要你们自己实验了. 1 ...

  2. AD15使用笔记

    AD15使用笔记 1.板内孔开洞 步骤:选中图形->Tools->Convert->Creat Borad Cutout From Selected Primitives;

  3. Github 太狠了,居然把 "master" 干掉了!

    前段时间栈长有看到 Github 和 master 分支变更的新闻,当时没有注意细节,直到今天我创建仓库时: 看了半天感觉有点不对劲啊... 怎么 master 不见了,之前默认主干分支名称都是叫 m ...

  4. Python 中 pip 工具的安装与使用

    pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具. Python 2 ...

  5. centos7 下 kafka的安装和基本使用

    首先确保自己的linux环境下正确安装了Java 8+. 1:取得KAFKA https://mirrors.bfsu.edu.cn/apache/kafka/2.6.0/kafka_2.13-2.6 ...

  6. thinkphp6.0.x 反序列化详记(一)

    前言 这几天算是进阶到框架类漏洞的学习了,首当其冲想到是thinkphp,先拿thinkphp6.0.x来学习一下,体验一下寻找pop链的快乐. 在此感谢楷师傅的帮忙~ 环境配置 用composer指 ...

  7. Linux最常用的命令大全

    Linux最常用的命令大全 按功能索引 目录处理命令 ls mkdir pwd cd rmdir cp mv rm 文件处理命令 touch cat tac more less head tail l ...

  8. vs code 编译python 输出到调试控制台

    如图所示,在debug菜单中点击齿轮按钮,进入launch.json,更改console选项的值(有三种) "console": "internalConsole&quo ...

  9. flink 处理实时数据的三重保障

    flink 处理实时数据的三重保障 window+watermark 来处理乱序数据对于 TumblingEventTimeWindows window 的元数据startTime,endTime 和 ...

  10. Asp.Net Core 查漏补缺《一》 —— IStartFilter

    Asp.Net Core 查漏补缺<一> -- IStartFilter IStartFilter 实现了Configure,如下图一,而Configure方法接受并返回Action< ...