负载均衡-interview

简介

Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。

  1. 服务器负载均衡Nginx:

a. nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发
b. Nginx可以使用负载均衡分配流量

  1. 客户端负载均衡Ribbon:

a. ribbon为客户端提供负载均衡
b. 从注册中心(eureka)获取服务注册信息列表,缓存到本地,然后在本地实现轮询等负载均衡策略
Nginx适合于服务端实现负载均衡,如Tomcat
Ribbon适合与在微服务中RPC远程调用实现本地服务端负载均衡

优势:

  1. 当集群里的一台或者多台服务器down机的时候,剩余正常运行的服务器可以保证服务的继续使用
  2. 使用了更多的机器保证了机器的良性使用,不会由于某一高峰时刻导致??系统cpu急剧上升??

负载均衡的几种策略

  1. 随机(Random)
  2. 轮询(RoundRobin)
  3. 一致性哈希(ConsistentHash)
  4. 哈希(Hash)
  5. 加权(Weighted):响应时间等

Ribbon介绍
ribbon是一个为客户端提供负载均衡功能的服务

ILoadBalance接口:比如有添加服务器操作,选择服务器操作,获取所有的服务列表资源,获取可用的服务器列表等
BaseLoadBalancer具体实现类
setupPingTask() -> 执行pingTask任务 -> 默认情况下pingIntervalSeconds为10s,向EurekaClient发送一次“ping”,查看服务的可用性和服务数量
??ping什么??
-------------

ILoadBalance(BaseloaderBalancer)从EurekaClient(EurekaClient的实现类为DiscoveryClient)获取服务信息,并且每10s的心跳检测,并且根据ping判断服务的可用性来判断是否重新拉取,LoadBalancerClient获取这些服务列表,再根据IRule去路由,进行负载均衡
间隔多久去获取注册表信息 (默认情况为10s) => ping,All servers =>

IRule路由
 public interface IRule{
  public Server choose(object key);
  public void setLoadBalancer(ILoadBalancer lb);
  public ILoadBalancer getLoadBalancer();

}
RandomRule 随机策略
RoundRobinRule 轮询策略_每次请求都去下一个服务器(第一次第1台,第二次第2台,依次循环)
WeightedResponseTimeRule 加权策略_集成RoundRobinRule
BestAvailableRule 请求数最少策略


使用Ribbon提供的负载均衡策略
// 1. 创建具有负载均衡功能的RestTemplate
@Bean
@LoadBalanced
RestTemplate restTemplate() {
  
  return new ResrTemplate();

} // 使用RestTemplate进行rest操作时,会自动使用负载均衡策略,它内部在RestTemplate中加入LoadBalanceerInterceptor拦截器,作用就是负载均衡
// 默认使用轮询策略,可以通过IRule指定策略
@Bean
public IRule ribbonRule(){
  return  new BestAvailableRule();
}





Ribbon和Feign的区别

Ribbon是一个基于HTTP和TCP客户端的负载均衡器
需要自己构件http请求
他可以在客户端配置RibbonServerList(服务端列表),然后以负载均衡规则实现负载
Feign

Feign是一个使用起来更加方便的HTTP客户端
Feign中也使用Ribbon

你可能感兴趣的:(负载均衡-interview)