【架构设计】.Net Core负载均衡实现

文章目录

  • 简介
  • 利用Ocelot
    • 1.负载均衡(Load Balancer)
    • 2.服务发现
    • 3.项目演示
      • 3.1APIGateway项目
      • 3.2APIServicesA和APIServicesB下游服务项目
      • 3.3项目运行
    • 4.自定义负载均衡
  • 利用nginx
  • 来源

简介

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

下面介绍两种不同的实现方式。

利用Ocelot

1.负载均衡(Load Balancer)

Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求。负载均衡类型:

●LeastConnection:根据服务正在处理请求量的情况来决定哪个服务来处理新请求,即将新请求发送到具有最少现有请求的服务去处理。算法状态没有分布在Ocelot集群中。

●RoundRobin:遍历可用服务并发送请求。算法状态没有分布在Ocelot集群中。

●NoLoadBalancer:从配置或服务发现中获取第一个可用服务来处理新请求。

●CookieStickySessions:通过使用Cookie,确保特定的请求能够被分配到特定的服务上进行处理。

在​ ​Ocelot负载均衡项目​​示例中,通过APIGateway项目的路由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()
            .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

【架构设计】.Net Core负载均衡实现_第1张图片
●通过dotnet run命令启动APIServicesA项目

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

【架构设计】.Net Core负载均衡实现_第2张图片
●通过dotnet run命令启动APIServicesB项目

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

【架构设计】.Net Core负载均衡实现_第3张图片
通过浏览器查看轮询分发给下游服务返回的结果:
【架构设计】.Net Core负载均衡实现_第4张图片
【架构设计】.Net Core负载均衡实现_第5张图片
负载均衡轮询分发下游服务成功。

4.自定义负载均衡

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

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

在Ocelot中注册此类:

FuncloadBalancerFactoryFunc =(serviceProvider, Route, serviceDiscoveryProvider) => new CustomLoadBalancer(serviceDiscoveryProvider.Get);
s.AddOcelot().AddCustomLoadBalancer(loadBalancerFactoryFunc);

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

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

运行项目调试查看结果:

第一次请求时候分发到APIServicesA项目。
【架构设计】.Net Core负载均衡实现_第6张图片
第二次请求时候分发到APIServicesB项目。
【架构设计】.Net Core负载均衡实现_第7张图片
从上面结果来看,自定义负载均衡成功。

利用nginx

【架构设计】.Net Core负载均衡实现_第8张图片
首先,我们简单的创建一个控制器,实现一个简单方法,返回服务器IP和端口。

[Route("api/[controller]")]
[ApiController]
public class NginxController : ControllerBase
{
    [HttpGet]
    public string Get()
    {
        return $"{HttpContext.Connection.LocalIpAddress.ToString()}:{HttpContext.Connection.LocalPort.ToString()}";
    }
}

接下来,我们启动app001项目,分别打开cmd,打入以下命令,分别启动web服务器5011,5012,5013

dotnet app001.dll --urls="http://127.0.0.1:5011"
dotnet app001.dll --urls="http://127.0.0.1:5012"
dotnet app001.dll --urls="http://127.0.0.1:5013"

如下图:
【架构设计】.Net Core负载均衡实现_第9张图片
分别测试web服务器5011,5012,5013,分别返回“127.0.0.1:5011”,“127.0.0.1:5012”,“127.0.0.1:5013”。
【架构设计】.Net Core负载均衡实现_第10张图片

接下来,配置nginx。 找到nginx的安装路径,打开nginx.conf文件 添加upstream配置,配置用于负载均衡轮询的站点,即上一步骤中添加的3个站点

upstream webServer{
    server 127.0.0.1:5011;
    server 127.0.0.1:5012;
    server 127.0.0.1:5013;
}

server {
    listen       5010;
    server_name  localhost;
    location / {
        proxy_pass   http://webServer;
    }
}

接下来,启动ngnix,用cmd命令指定nginx的安装目录,然后start nginx
在这里插入图片描述
最后,测试http://localhost:5010/api/nginx,按次序轮询返回“127.0.0.1:5011”,“127.0.0.1:5012”,“127.0.0.1:5013”。
【架构设计】.Net Core负载均衡实现_第11张图片

demo:https://github.com/zcqiand/miscellaneous/tree/master/App001

来源

ASP.NET Core3.1 Ocelot负载均衡
手把手教你AspNetCore WebApi:Nginx(负载均衡)
负载均衡-百度百科

你可能感兴趣的:(开发,#,WEB_C#,负载均衡,.netcore,服务器)