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

通过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负载均衡内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core3.1 Ocelot认证的实现

    1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后Ocelot会基于授权密钥授权每个请求可以访问的资源.用户必须像往常一样在其Startup.cs中注册身份验证服务,但是他们为每次注册提供一个方案(身份验证提供者密钥),例如: public void ConfigureServices(IServiceCollection services) { var authenticationProvide

  • ASP.NET Core3.1 Ocelot路由的实现

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能(将来可能是任何传输机制). Ocelot将一个请求路由到另一个请求.为了让Ocelot正常工作,您需要在配置中设置一个Route.下面我们就Ocelot基础项目构建简单介绍下路由功能. 2.Ocelot基础项目构建(APIGatewayBasicDemo) 现在我们根据GitHub贡献者开源项目来学

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

    1.负载均衡 Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求.负载均衡类型: LeastConnection:根据服务正在处理请求量的情况来决定哪个服务来处理新请求,即将新请求发送到具有最少现有请求的服务去处理.算法状态没有分布在Ocelot集群中. RoundRobin:遍历可用服务并发送请求.算法状态没有分布在Ocelot集群中. NoLoadBalancer:从配置或服务发现中获取第一个可用服务来处理新请求. CookieStickySess

  • asp.net实现负载均衡

    我的目标是我一个人搭建一个负载均衡网站.不接受这是网络部,或者运维,或者系统部的事情,所有事情都是我一个人来完成,包括掏钱,包括将来发展等等,同时也别告诉我有没有意义,just do  it !给我方案,给我方法. 拥有资源:不够可以买,多了可以先闲着. 现在我已经买了5台阿里云服务器,ip地址分别为 ip地址 名字简称 操作系统 iis服务器 cpu 内存DDR3 机械硬盘 111.13.101.204 ay1 window7 iis7 4核 8GB 1TB 111.13.101.205 ay

  • 如何解决asp.net负载均衡时Session共享的问题

    每个客户端在访问网站时,都会创建相应的Session,用来保存客户的状态信息,网站如果做了负载均衡,session共享是要做的,IIS对于session的存储有五种模式 一.ASP.Net session存储方式 1.InProc模式(进程内模式) .为默认设置. 会话状态存储在Web服务器上的内存中. 2.StateServer模式(状态服务器模式). 会话状态存储在一个名为ASP.Net状态服务的单独进程中.这确保了在重新启动Web应用程序时会保留会话状态,并让会话状态可用于网路场中的多个W

  • Nginx负载均衡详细介绍

    如果只有一台服务器时,这个服务器挂了,那么对于网站来说是个灾难.因此,这时候的负载均衡就会大显身手了,它会自动剔除挂掉的服务器. 下面简单的介绍下我使用Nginx做负载的体会 下载---安装Nginx这些不介绍了,前篇有介绍. windows和Linux下配置Nginx负载的写法一样,故不分开介绍. Nginx负载均衡一些基础知识: nginx 的 upstream目前支持 4 种方式的分配 1).轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.

  • Nginx负载均衡(架构之路)详解

    在大型网站中,负载均衡是有想当必要的.尤其是在同一时间访问量比较大的大型网站,例如网上商城,新闻等CMS系统,为了减轻单个服务器的处理压力,我们引进了负载均衡这一个概念,将一个服务器的压力分摊到几个服务器上,一方面减轻了宕机的几率,另一方面也使得宕机后还要其他服务器可以继续稳定运行,提高了系统的健壮性. [实现功能] 这篇文章将要介绍的主要内容如下: 1.配置三台服务器 2.分别在三台服务器上部署同样的服务代码 3.使用Nginx实现负载均衡 [实现思路] 我们的Nginx负载均衡器将部署在一台

  • nginx 负载均衡 多站点共享Session

    多站点共享Session常见的作法有: •使用.net自动的状态服务(Asp.net State Service); •使用.net的Session数据库: •使用Memcached. •使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下): 这里我们就 演练一下 以数据库的形来存储Session,来实现多站点共享Session. 首先我们 建好一下站点,如下图: Default.aspx 其中 有二个Button  ,SetSession 主要是用于给一个 S

  • linux负载均衡总结性说明 四层负载和七层负载有什么区别

    在常规运维工作中,经常会运用到负载均衡服务.负载均衡分为四层负载和七层负载,那么这两者之间有什么不同? 废话不多说,详解如下: 一.什么是负载均衡 1)负载均衡(Load Balance)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间:其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点

  • win2003 使用DNS服务器实现负载均衡

    解决方法有很多,如使用Windows2000或WindowsServer2003提供网络负载均衡服务,但该服务的设置非常复杂.而通过DNS服务器实现网络负载均衡则是一种比较简单的方法. 笔者以企业网中的Web服务器为例来介绍一下如何使用DNS服务器实现网络负载均衡.为了提高域名为"www.jb51.net"的网站的访问量,在企业网中部署三台内容相同的Web服务器,它们提供相同的服务,但每台服务器的IP地址都不一样.下面对企业网中的DNS服务器进行设置来实现三台Web服务器共同承担客户对

随机推荐