Ribbon
- nacos:注册中心,解决服务的注册与发现
- Ribbon:客户端的负载均衡器,解决的是服务实例列表的负载均衡的问题
Ribbon简介
Ribbon是Netflix公司开源的一个负载均衡的项目,是一个"客户端"负载均衡器,运行在客户端上
Ribbon在项目中的使用案例
首先是pom依赖:springcloud alibaba 对Ribbon做了兼容,只需要@LoadBalanced注解,在RestTemplate类上加注解即可。在nacos官网——Nacos Spring Cloud菜单下也有介绍
Ribbon的工作流程
- Ribbon拦截所有的远程调用
- 解析URL中的host,获取servicename
- 根据servicename获取实例列表(先从本地缓存中获取),如果有,则获取列表,然后通过相应的均衡策略,获取一个实例;如果没有,必须请求nacos-server,获取实例列表,然后cache到本地缓存中
- 发送远程调用
切换Ribbon负载均衡策略
- Ribbon核心组件IRule:根据特定算法从服务列表中选取一个需要访问的服务;
- 其中IRule是一个接口,有七个自带的落地实现类,可以实现不同的负载均衡算法规则:
策略名 | 策略声明 | 策略描述(算法) |
---|---|---|
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule | 选择一个最小的并发请求的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务进行轮询 |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据平均响应时间计算服务的权重。统计信息不足时会按照轮询,统计信息足够会按照响应的时间选择服务 |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 正常时按照轮询选择服务,若过程中有服务出现故障,在轮询一定次数后依然故障,则会跳过故障的服务继续轮询。 |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | 轮询规则 |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule | 随机 |
ZoneAvoidanceRule(默认) | public class ZoneAvoidanceRule extends PredicateBasedRule | ZoneAvoidanceRule中的过能条作是以ZoneAvoidancePredicate,为主过滤条件和以AvailabilityPredicate为次过滤条件组成的—个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询的方式从过滤结果中选择一个出来。 |
第一步:新建类MyRule
注意这个配置类必须放在@ConponentScan默认扫描的范围外
package com.rule;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//注意这个配置类必须放在@ConponentScan默认扫描的范围外
@Configuration
public class MyRule {
@Bean
public IRule getRule() {
return new BestAvailableRule();
}
}
第二步:在启动类加注解
name指定调用的服务名称,configuration加载的配置信息。 意思是将来调用cloud-goods服务时,采用的负载均衡策略是MyRule.class里设置的
@RibbonClient(name = "cloud-goods",configuration = {MyRule.class})