ribbon的核心接口
接口名 | 作用 | 默认值 |
---|---|---|
IClientConfig | 读取配置 | DefaultClientConfig |
IRule | 负载均衡 | ZoneAvoidanceRule |
IPing | 筛选ping不同的实例 | DummyPing |
ServerList<Server> | 实例列表 | ConfigurationBasedServerList/NaocsServerList |
SErverListFilter<Server> | 过滤掉不符合的实例 | ZonePreferenceServerListFilter |
ILoadBalancer | Ribbon入口 | ZoneAwareLoadBalancer |
ServerListUpdater | 更新交给ribbon的List的策略 | PollingServerListUpdater |
RestTemplate集成Ribbon的方式
直接在Spring的配置文件中添加bean
即可
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
Ribbon的定制化配置
1. 配置负载均衡规则
- java方式
/**
* 此时自定义ribbon的配置扫描包必须在SpringBoot默认包之外,
*避免父子上下文重新扫描(Ribbon有自己的Spring上下文,类似SpringMvc),
*造成配置成为全局配置。
*/
// 细粒度的ribbon配置
// @RibbonClient(name = "user-center",configuration = CustomRibbonConfiguration.class)
@Configuration
//全局ribbon配置
@RibbonClients(defaultConfiguration = CustomRibbonConfiguration.class)
public class RibbonLoadBalanceRuleConfiguration {
}
该CustomRibbonConfiguration
必须配置在SpringBoot
默认扫描包之外,避免Spring上下文冲突
@Configuration
public class CustomRibbonConfiguration {
@Bean
public IRule ribbonRule() {
//指定负载均衡规则
return new RandomRule();
}
}
这里可以使用NacosRule
来使用nacos提供的权重,相同集群优先访问以及使用nacos.metadata
元数据来控制版本访问等规则
@Override
public Server choose(Object key) {
try {
DynamicServerListLoadBalancer lb = (DynamicServerListLoadBalancer) this.getLoadBalancer();
//获取服务名称
String name = lb.getName();
//获取当前应用的集群名称
String clusterName = nacosDiscoveryProperties.getClusterName();
//扩展元数据来保证版本一致
String targetVersion = nacosDiscoveryProperties.getMetadata().get("targetVersion");
//1.获取所有实例
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
List<Instance> allInstances = namingService.getAllInstances(name, true);
List<Instance> canBeChoose = allInstances;
//优先获取版本一致的所有实例
List<Instance> sameVersionInstances = canBeChoose.stream()
.filter(instance -> Objects.equals(instance.getMetadata().get("version"), targetVersion))
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(sameVersionInstances)) {
canBeChoose = sameVersionInstances;
} else {
log.warn("没有找到版本一致的实例,请确定!");
return null;
}
//2.过滤过当前集群且版本一致的所有实例,若不为空则返回当前集群的实例
List<Instance> sameClusterInstances = canBeChoose.stream()
.filter(instance -> Objects.equals(instance.getClusterName(), clusterName))
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(sameClusterInstances)) {
canBeChoose = sameClusterInstances;
} else {
log.warn("有实例跨越集群访问..");
}
Instance result = ExtendBalancer.getHostByRandomWeight2(canBeChoose);
//3.若为空则返回当前实例
return new NacosServer(result);
} catch (Exception e) {
log.error("ribbon选择负载均衡实例异常 e : [{}]", e.getMessage());
return null;
}
}
# 用于集群和metadata控制版本的配置文件
spring:
application:
name: content-center
cloud:
nacos:
discovery:
server-addr: 192.168.18.91:8848
cluster-name: NJ
metadata:
version: v1
targetVersion: v2
-
application.yml
配置方式
<clientName>:
ribbon:
NFLoadBalancerRuleClassName: <IRule实现类的全类名>
- 支持的配置项集合
配置组件 | 配置项 |
---|---|
ILoadBalancer | NFLoadBalancerClassName |
IRule | NFLoadBalancerRuleClassName |
IPing | NFLoadBalancerPingClassName |
ServerList | NIWSServetListClassName |
ServerListFilter | NIWSServetListFilterClassName |
2.Ribbon的饥饿加载
Ribbon客户端默认为延迟加载,会导致第一次访问过慢,采用配置让Ribbon直接加载
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: user-center #要饥饿加载的服务名称