共计 3047 个字符,预计需要花费 8 分钟才能阅读完成。
Ribbon 饥饿加载
默认情况下 Ribbon 是懒加载的。当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多。
解决方式:开启饥饿加载
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: server-1,server-2,server-3 #为哪些服务的名称开启饥饿加载, 多个用逗号分隔
Ribbon 组成
接口 | 作用 | 默认值 |
---|---|---|
IclientConfig |
读取配置 | DefaultClientConfigImpl |
IRule |
负载均衡规则,选择实例 | ZoneAvoidanceRule |
IPing |
筛选掉 ping 不通的实例 |
DumyPing (该类什么不干,认为每个实例都可用,都能 ping 通) |
ServerList<Server> |
交给 Ribbon 的实例列表 |
Ribbon:ConfigurationBasedServerList Spring Cloud Alibaba: NacosServerList
|
ServerListFilter<Server> |
过滤掉不符合条件的实例 | ZonePreferenceServerListFilter |
ILoadBalancer |
Ribbon 的入口 | ZoneAwareLoadBalancer |
ServerListUpdater |
更新交给 Ribbon 的 List 的策略 | PollingServerListUpdater |
这里的每一项都可以自定义 IclientConfig
Ribbon 支持非常灵活的配置就是由该组件提供的IRule
为 Ribbon 提供规则,从而选择实例、该组件是最核心的组件
举例:
代码方式
@Configuration
public class RibbonRuleConfig {
@Bean
public IRule ribbonRulr() {return new RandomRule();
}
@Bean
public IPing iPing(){return new PingUrl();
}
}
配置属性方式
<clientName>:
ribbon:
NFLoadBalancerClassName: #ILoadBalancer 该接口实现类
NFLoadBalancerRuleClassName: #IRule 该接口实现类
NFLoadBalancerPingClassName: #Iping 该接口实现类
NIWSServerListClassName: #ServerList 该接口实现类
NIWSServerListFilterClassName: #ServiceListFilter 该接口实现类
在这些属性中定义的类优先于使用@RibbonClient(configuration=RibbonConfig.class)
Spring 定义的 bean 以及由 Spring Cloud Netflix 提供的默认值。描述:配置文件中定义 ribbon 优先代码定义
Ribbon 负载均衡的八种算法,其中 ResponseTimeWeightedRule
已废除
ResponseTimeWeightedRule
规则名称 | 特点 |
---|---|
AvailabilityFilteringRule |
过滤掉一直连接失败的被标记为 circuit tripped(电路跳闸)的后端 Service,并过滤掉那些高并发的后端 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 ) |
实现负载均衡 < 细粒度 > 配置 - 随机
方式一:JAVA 代码方式
首先定义 RestTemplate,并且添加注解@LoadBalanced
,这样 RestTemplate 就实现了负载均衡
@LoadBalanced
@Bean
public RestTemplate restTemplate() {//template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));// 解决中文乱码
return new RestTemplate();}
在 SpringBootApplication 主类下添加配置类。该类主要作用于为哪个服务做负载均衡。默认的是轮训
@Configuration
@RibbonClient(name = "${服务名称}", configuration = GoodsRibbonRuleConfig.class)//configuration: 指向负载均衡规则的配置类
public class GoodsRibbonConfig {}
添加 Ribbon 的配置类,注意该类必须配置在 @SpringBootApplication
主类以外的包下。不然的话所有的服务都会按照这个规则来实现。会被所有的 RibbonClient 共享。主要是主类的主上下文和 Ribbon 的子上下文起冲突了。父子上下文不能重叠。相关连接:https://blog.csdn.net/qq_3258…
@Configuration
public class GoodsRibbonRuleConfig {
@Bean
public IRule ribbonRulr() {return new RandomRule();
}
}
或者使用自定义注解排除该类
方式一:配置属性方式
server-1: # 服务名称 Service-ID
ribbon:
# 属性配置方式【推荐】NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 配置文件配置负载均衡算法 - 我这里使用的是自定义的 Ribbon 的负载均衡算法,默认
优先级:配置(不会影响其他服务)>(大于) 硬编码(类得写在 SpringBoot 启动类包外,不然会影响其他服务)
总结:
配置方式 | 有点 | 缺点 |
---|---|---|
代码配置 | 基于代码,更加灵活 | 有坑(父子上下文) 线上修改得重新打包,发布 |
属性配置 | 易上手 配置更加直观 线上修改无需重新打包,发布 优先级更高 |
极端场景下没有配置配置方式灵活 |
实现负载均衡 < 全局 > 配置 - 随机
方式一:Ribbon 的配置类定义在主类下
让 ComponentScan 上下文重叠(强烈不建议使用)
方式二:
@Configuration
@RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon 负载均衡全局粒度配置(所有服务都按照这个配置)public class RibbonConfig {}
赵小胖个人博客
正文完
发表至: java
2019-10-11