Ribbon
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon</artifactId>
<version>2.2.2</version>
</dependency>
ribbon 特性
负载均衡算法
- 区域权衡策略: ZoneAvoidanceRule
- 最低并发策略: BestAvailableRule
- 响应时间加权策略: WeightedResponseTimeRule
- 轮询策略: RoundRobinRule
- 随机策略: RandomRule
- 重试策略: RetryRule
- 可用过滤策略: AvailabilityFilteringRule
ribbon 禁用 eureka
ribbon:
eureka:
enabled: false
listOfServers: localhost:81,localhost:82
Ribbon 负载均衡
负载均衡的两种方式
-
服务器负载; -
客户端负载; -
api:
discoverClient.getInstances("service-name") 获取服务的所有实例- 在 restTemplate 上增加注解
@LoadBalanced -
Ribbon 的重要接口:
ribbon 配置项
自定义负载均衡规则
-- rule 类 --
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
-- config 类--
service-name:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 全局配置:
- 直接在 规则类上加
@Configuration 注解; - 不推荐这样使用, 因为它使用覆盖的方式实现, 不太优雅; 可以使用
@RibbonClients(defaultConfiguration= xxx.Class) 进行设置
配置优先级
- java 配置优先级 > 配置优先级; 源码里基于springboot 进行实现的;
- java配置: org.springframework.cloud.context.named.NamedContextFactory#createContext
- 配置文件: RibbonCLientConfiguration.ribonRule
饿加载和懒加载
ribbon:
eager-load
enable: true
clients: xxx_name
Ribbon 源码
- 拿到服务 ip+端口 列表(ribbon 有一个线程, 每隔30s 从注册中心更新一下服务列表);
- 选择一个具体的服务实例;
- 替换服务名称为具体的 ip+端口号;
- 发送请求
|