写点什么

LoadBalance

作者:Xiao8
  • 2022 年 6 月 14 日
  • 本文字数:1875 字

    阅读完需:约 6 分钟

1、 前言


负载均衡,英文:Load Balance,其含义是请求分发到多个粒度单元上进行执行操作,例如各种服务器、应用服务、中台服务、数据服务等,从而达到共同完成某项任务的目的。为了拓宽网络设备和服务器的带宽、增加吞吐量、加强网络请求处理能力、提高网络的灵活性和高可用性,负载均衡是一种廉价、有效、透明的方法,它为服务的高并发做了一次缓冲,让单个服务的压力瞬间减少,实现了服务的高可用,避免服务因为压力而面临宕机的危险。


2、负载均衡


2.1 基于网络的负载均衡大家都知道,OSI 模型有 7 层结构,每层都可以有几个子层。OSI 的 7 层从上到下分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层:


在这七层结构中,高层次都是依赖于低层次的。层次越高,使用起来越方便。


根据负载均衡技术实现在 OSI 七层模型的不同层次,是可以给负载均衡分类的。


常见的实现方式中,主要可以在应用层、传输层、网络层和数据传输层做文章。所以,工作在应用层的负载均衡,我们通常称之为七层负载均衡、工作在传输层的我们称之为四层负载均衡。我们一个个来看看:


七层负载均衡


七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 http、dns、ftp 等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个 Web 服务器的负载均衡,除了根据 IP 加 port 进行负载外,还可根据 URL 来决定是否要进行负载均衡。


四层负载均衡


四层负载均衡工作在 OSI 模型的传输层,由于在传输层,只有 TCP/UDP 协议,这两种协议中除了包含源 IP、目标 IP 以外,还包含源端口及目的端口。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。


2.2 负载均衡工具负载均衡的工具,常见的有 Nginx、k8s、Ribbon、Feign、HAProxy 等。


Nginx


Nginx 主要用来作七层负载均衡,反向代理 http、https 的协议链接,同时也提供了 IMAP/POP3/SMTP 的服务。


upstream proxy_demo_aaa {  server {{DEMO_SERVER_NODE1}} weight=5;  server {{DEMO_SERVER_NODE2}} weight=6;}
location ~ ^/demo-aaa/api(.*)$ { proxy_pass http://proxy_demo_aaa/api$1$is_args$args;}
复制代码


k8s 的负载均衡是基于 kube-proxy,其服务发现基于 kube-dns,最后由于每个 Service 对应的 pod 可以是多个,所以可以基于 kube-proxy 实现负载均衡,kube-proxy 进程其实就是一个智能的软件负载均衡器,他负责把 service 的请求转发到后端的某个 pod 实例。


Ribbon


Ribbon 是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做 ILoadBalance 的接口代表负载均衡器的操作,比如有添加服务器、选择服务器、获取所有的服务器列表、获取可用的服务器列表等等。


常见的,使用 RestTemplate 进行服务提供者、服务消费者之间的通信,只需为 RestTemplate 配置类添加 @LoadBalanced 注解即可。

@Bean@LoadBalanced  public RestTemplate restTemplate() {  return new RestTemplate();}
复制代码


Feign 是一个声明式负载均衡客户端使用 Feign 能让编写 WebService 的客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持 JAX-RS 标准的注解。Feign 也支持可拔插式的编码器和解码器。


@FeignClient(name = "provider-service", configuration = {Feign4HttpConfiguration.class, FeignLogConfiguration.class}, fallback = CustomerClientImpl.class)public interface CustomerClient {
@PostMapping("/save") String save();
@GetMapping("/api/user/getUserInfo") Response<Object> getUserInfo();}
复制代码


HAProxy


HAProxy 是一个使用 C 语言编写的自由、开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理的功能。


2.3 负载均衡算法


常见的几种负载均衡的算法有:随机、轮询、最少链接、Hash、加权、重试等。


随机:即请求随机分配到各台服务器上,这是默认的策略机制。


轮询:将所有请求,依次分发到每台服务器上,适合服务器硬件相同的场景,服务请求数相同。


最少链接:将本次请求分配到请求数最少的服务上,这种可以根据服务器当前的请求处理情况,动态分配。


Hash:根据 IP 地址进行 Hash 计算,得到 IP 地址,这种可以将来自同一 IP 地址的请求,同一会话期内,转发到同一服务器;实现会话粘滞。但目标服务器宕机后,会话也会随之丢失。


加权:在上面几种算法基础上,进行一定的加权比例分配。


重试:这种策略一般都会有,就是在调用失败后,进行二次重试机制。


当然,还有其他的动态的算法规则:最快模式、观察模式、动态性能分配等。

发布于: 刚刚阅读数: 3
用户头像

Xiao8

关注

God bless the fighters. 2020.03.11 加入

欢迎关注公众号:程序猿Damon,长期从事Java开发,研究Springcloud的微服务架构设计。目前主要从事基于K8s云原生架构研发的工作,Golang开发,长期研究边缘计算框架KubeEdge、调度框架Volcano、容器云KubeSphere研究

评论

发布
暂无评论
LoadBalance_6月月更_Xiao8_InfoQ写作社区