负责均衡-手写简单的负载均衡和ribbon介绍
服务器负载均衡就是
nignx
客户端负载均衡
客户端负责,负载均衡规则,从服务列表里面选择具体的服务实例。
从nacos服务发现组件上,利用简单的随机负载均衡算法来获取服务地址。
List<ServiceInstance> instances = discoveryClient.getInstances("pay");
List<String> targerUrls = instances.stream().map(instance->instance.getUri().toString()+"/test")
.collect(Collectors.toList());
int i= ThreadLocalRandom.current().nextInt(targerUrls.size());
log.info("请求目标地址:"+targerUrls.get(i));
return restTemplate.getForObject(targerUrls.get(i),String.class);
使用ribbon实现负载均衡
ribbon是一个netflix开源的实现负载均衡的组件,
集成方式
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
return restTemplate.getForObject("http://pay/test",String.class);
pay是服务名称
ribbon 提供的自定义接口
| 接口 | 作用 | 默认值 |
| IClientConfig | 读取配置 | DefaultClientConfigImpl |
| IRule | 负载均衡规则,选择实例 | ZoneAvoidanceRule |
| IPing | 筛选Ping不通的实例 | DummyPing |
| ServerList<Server> | 交给Ribbon的实例列表 | Ribbon:ConfigurationBasedServerList,Spring Cloud Alibaba :NacosServerList |
| ServerListFilter<Server> | 过滤掉不符合条件的实例 | ZonePreferenceServerListFilter |
| ILoadBalancer | Ribbon的入口 | ZoneAwareLoadBalancer |
| ServerListUpdater | 更新交给Ribbon的List的策略 | PollingServerListUpdater |
ribbon 提供的默认负载均衡规则
| 规则名称 | 特点 |
| AvailabilityFilteringRule | 过滤掉一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的后端server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里面记录的各个server的运行状态 |
| BestAvailableRule | 选择一个最小的并发请求的server,逐个考察server,如果server被tripped了,跳过 |
| RandomRule | 随机选择一个server |
| ResponseTimeWeightedRule | 已废弃,作用同WeightedResponseTimeRule |
| RetryRule | 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
| RoundRobinRule | 轮询选择,轮询index,选择index对应位置的server |
| WeightedResponseTimeRule | 根据响应时间加权,响应时间越长,权重越小,被选中的可能性低 |
| ZoneAvoidanceRule | 复合判断server所zone的性能和server的可用选择性选择server,在没有zone的环境下,类似于轮询RoundRobinRule |
浙公网安备 33010602011771号