负载均衡-interview
2019-06-11 本文已影响0人
上山走18398
简介
Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。
- 服务器负载均衡Nginx:
a. nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发
b. Nginx可以使用负载均衡分配流量
- 客户端负载均衡Ribbon:
a. ribbon为客户端提供负载均衡
b. 从注册中心(eureka)获取服务注册信息列表,缓存到本地,然后在本地实现轮询等负载均衡策略
Nginx适合于服务端实现负载均衡,如Tomcat
Ribbon适合与在微服务中RPC远程调用实现本地服务端负载均衡
优势:
- 当集群里的一台或者多台服务器down机的时候,剩余正常运行的服务器可以保证服务的继续使用
- 使用了更多的机器保证了机器的良性使用,不会由于某一高峰时刻导致??系统cpu急剧上升??
负载均衡的几种策略
- 随机(Random)
- 轮询(RoundRobin)
- 一致性哈希(ConsistentHash)
- 哈希(Hash)
- 加权(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