什么是负载均衡,为何要做负载均衡?

一、什么是负载均衡当单个节点的服务,无法支持当前的大量请求时,我们会部署多个节点,即所谓的集群,此时要使每个节点收到的请求均匀的算法,这个策略就是所谓的负载均衡了。负载均衡常见的负载均衡算法,有权重随机、Hash、轮询。1.权重随机这个是最简单,也是最常用的负载均衡算法,即每个请求过来,会随机到任何一个服务节点上,主流的rpc框架Dubbo,默认使用基于权重随机算法。

2.Hash可以将客服端即请求端的ip,通过hash计算,得到一个数值,再取服务节点数的模,分配到对应的服务节点上。3.轮询将请求按照顺序,依次分配到节点1、节点2、节点3等节点上,如此循环往复。二、为什么要做负载均衡想想如果没有负载均衡算法,我们的请求有可能都打到同一节点上,有可能将这个节点给打死,而其他节点的机器闲置着没有提供服务,浪费资源。

微服务架构如何实现客户端负载均衡?

微服务框架还是蛮多的,比较了解spring cloud一些,所以就以springcloud为例,实现下客户端的负载均衡!负载均衡我们都知道,就是一种使用一个管理者将多台机器联系起来对外统一提供服务的架构!那么什么是客户端的负载均衡呢?就是在我们多个微服务之间,以服务本身作为服务注册中心的客户端,维持与注册中心的服务列表通信,然后在客户端自己轮询的进行服务的均衡调用,实现从客户端的负载均衡,调用Http服务犹如调用本地方法一样的效果!一般有两种实现方式ribbon和feign client实现这种负载均衡,下面以feign client为例,说明怎么配置和使用客户端负载均衡!1,引用相应的feign,eureka的依赖包! spring-cloud-starter-eureka和 spring-cloud-starter-feign2,application.yml文件中加配置文件eureka: client: service-url: defaultZone: instance: appname: feign-client3,在启动类中加入加入注解,以开启负载均衡!@EnableFeignClients4,在接口中加入注解,并在暴露的接口上加入restful地址@FeignClient("system") public interface UserFeignClient @RequestMapping(value = "/simple/{id}。

要做负载均衡,代码要满足什么条件?

当我们的程序只部署一套,不再能满足访问量(调用量)的时候,最简单的横向扩容的方法就是部署多套应用环境,负载均衡将用户(客户端)的访问平均地分配到每台服务器上,这样就可以利用多台机器的资源,增加系统的负载能力。那么要做负载均衡,对我们的系统有什么要求么?或者说我们的代码需要做什么改造么?大部分时候我们的代码是不需要改造的,但是也要注意这么几点。

我们的服务最好是无状态的,也就是每一次的调用,不依赖于前一次的调用结果,如果前后有依赖,则需要后面的请求携带着前一次请求的结果,作为参数进行访问。除非负载均衡开启了会话保持,或者通过一些负载均衡路由策略,让同一个 IP 的请求始终路由到同一台服务器上,但是这并不是一个好的解决方案。通常我们需要保持服务的无状态性,如果需要做权限认证的话,建议采用 Token 或使用 Redis 做 Session 共享(推荐使用 Token)。

还有一点,可能不一定必须的,不过我觉得也是个不错的方案,供大家参考。假如我们有两台应用服务器 A 和 B,前面挂一台负载均衡,当我们需要做应用升级的话,通常可以怎么做?通常的办法是停掉服务器 A,这时候负载均衡会监控到这台服务器 A 已经无法使用了(比如监控到端口消失),再来的请求会发送给服务器 B;对服务器 A 升级并启动,负载均衡监控到 A 恢复了,会将请求发送给 A 和 B;对服务器 B 做相同的操作。

这样看似没有问题,因为在服务器升级的时候,负载均衡不在发送请求到这台服务器上;但是大家仔细想一想这个过程,如果在停服务器的那一刻,已经有请求进来了并进行处理,但是还没有返回,这时候停掉服务器,会导致这部分请求发生异常,那么这个问题如何解决呢?这就需要对程序进行一定的改造了。应用提供一个接口,返回一个静态变量的值,只要 true 或 false 两个状态;负载均衡不再监控端口是否消失,而是监控剪口返回的状态,返回 true 表示应用正常,false 或没有返回表示不正常;每次停服务之前,通过接口修改当前应用静态变量的值为 false;负载均衡认为该服务器状态不正常,将不再发送请求到这台服务器上;等待几十秒,这段时间相当于等待当前请求都处理并返回,再停止服务。

“停止服务时,不再接受新的请求,等现有请求都处理完成后再真正停止服务”,这只是一个笨办法,想要避免以上问题还有更好的办法,并且对代码没有侵入性;有些中间件本身提供了类似的功能,我们只需执行对应的停止服务的命令即可;或者需要在代码中添加监听类,当收到 kill 信号的时候,拒绝新的请求,等待一段时间,再结束程序等等。


文章TAG:实现负载均衡的几种方式  如何实现负载均衡  实现  负载均衡  均衡  
下一篇