华域联盟 .Net ASP.NET Core3.1 Ocelot负载均衡的实现

ASP.NET Core3.1 Ocelot负载均衡的实现

ASP.NET Core3.1 Ocelot负载均衡的实现
 更新时间:2020年11月12日 11:18:31   作者:暗断肠  

这篇文章主要介绍了ASP.NET Core3.1 Ocelot负载均衡的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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("*: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";
}
}

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

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

通过dotnet run命令启动APIServicesA项目

dotnet run --project APIGateway项目路径\\APIGateway.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官网
到此这篇关于ASP.NET Core3.1 Ocelot负载均衡的实现的文章就介绍到这了,更多相关ASP.NET Core3.1 Ocelot负载均衡内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:详解Docker Swarm服务发现和负载均衡原理服务器负载均衡是什么意思(服务器负载均衡的基本功能和实现原理)采用软件负载均衡器实现web服务器集群(iis+nginx)Nginx 负载均衡是什么以及该如何配置Nginx + consul + upsync 完成动态负载均衡的方法详解Spring Cloud 系列之负载均衡 Ribbon的示例代码Nginx+SpringBoot实现负载均衡的示例浅谈服务发现和负载均衡的来龙去脉

ASP.NET
Core
Ocelot
负载均衡

相关文章
C# Base64编码Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。 2009-06-06
VS2015 update2安装历程本文给大家分享的是VS2015 update2的坑爹的安装历程,简直是虐爹一百次,不过话说回来VS的Android模拟器真是流畅到爆啊,希望本文能对小伙伴们有所帮助 2016-07-07
一个完整的ASP.NET 2.0 URL重写方案[翻译]这篇文章描述了一个完整的 ASP.NET 2.0 URL 重写方案。这个方案使用正则表达式来定义重写规则并解决通过虚拟 URLs 访问页面产生回发事件的一些可能的困难。 2009-11-11
FileUpload 控件禁止手动输入的方法FileUpload 控件禁止手动输入的方法,需要的朋友可以参考下。 2010-02-02
asp.net后台弹窗如何实现这篇文章主要介绍了asp.net后台弹窗如何实现,需要的朋友可以参考下 2014-02-02
ASP.NET Core3.X 终端中间件转换为端点路由运行详解这篇文章主要介绍了ASP.NET Core3.X 终端中间件转换为端点路由运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2019-12-12
aspx后台传递Json到前台的两种接收方法推荐下面小编就为大家带来一篇aspx后台传递Json到前台的两种接收方法推荐。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2016-05-05
asp.net 读取配置文件方法asp.net 读取配置文件方法,需要的朋友可以参考下。 2011-12-12
LiteralControl ASP.NET中的另类控件对于LiteralControl控件的应用比较少,今天突然看到了,就弄个明白为好,所以总结出来,供大家一起学习 2012-01-01
ASP.NET MVC5网站开发文章管理架构(七)继上一篇把member的用户部分完成,现在开始做文章管理部分。文章部分根据涉及显示现实文章列表,发布文章,修改和删除文章等功能。最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示全部文章列表和我的文章列表,普通用户只显示我的文章列表。 2015-09-09

最新评论

本文由 华域联盟 原创撰写:华域联盟 » ASP.NET Core3.1 Ocelot负载均衡的实现

转载请保留出处和原文链接:https://www.cnhackhy.com/5026.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者:

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部