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. select函数详解(转)

    Select函数在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv或recvfrom这样的阻塞 ...

  2. 2017-18一《电子商务概论》本科作业-商A1551

    第1次作业: 1 2017年双十一新营销方案 2 销售额达1682亿元分析组成及了解猫狗大战 3 破亿店铺举例. 第2次作业: 1.你如何来定义和理解电子商务?电子商务对社会经济带了怎样的影响,企业. ...

  3. 多测师讲解python_os模块_高级讲师肖sir

    #os.path.isfile()#:判断当前是否为文件,返回布尔值是文件则True否者Falsea_path='F:\cms搭建.rar' #lesson包b_path=r'D:\bao\kk '# ...

  4. 添加Google网络地图功能

    在MeteoInfo中添加了Google网络地图功能.打开MeteoInfo软件,选中图层管理区的一个Map Frame(New Map Frame),点击鼠标右键,在弹出菜单中点击Add Web L ...

  5. 转 RabbitMQ 入门教程(PHP版) 使用rabbitmq-delayed-message-exchange插件实现延迟功能

    延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...

  6. spring boot:使接口返回统一的RESTful格式数据(spring boot 2.3.1)

    一,为什么要使用REST? 1,什么是REST? REST是软件架构的规范体系,它把资源的状态用URL进行资源定位, 以HTTP动作(GET/POST/DELETE/PUT)描述操作 2,REST的优 ...

  7. centos8平台安装zookeeper3.6集群

    一,规划三台zk服务器构成集群 ip:172.18.1.1 机器名:zk1 对应myid: 1 ip:172.18.1.2 机器名:zk2 对应myid: 2 ip:172.18.1.3 机器名:zk ...

  8. Python中while循环初识

    基本结构 ​ while 条件: ​ 循环体 基本原理: ​ 1.先判断条件是否为True ​ 2.如果是True进入循环体 ​ 3.执行到循环体的底部 ​ 4.继续判断条件,条件为True,再次进入 ...

  9. Spring Aop 详解二

    这是Spring Aop的第二篇,案例代码很详解,可以查看https://gitee.com/haimama/java-study/tree/master/spring-aop-demo. 阅读前,建 ...

  10. SVN如何回滚到指定版本

    以下内容网上收集整理. 方法一. 利用Export,这样你可以不丢失你新建的文件.打开你想要回滚的文件夹(受SVN版本控制).右键Tortoise SVN,然后在列表中选择 show log, 在看到 ...