38.Ribbon
Ribbon默认是懒加载,所以初次请求时间最长,后续请求会变快,可以通过修改为饥饿加载
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=user-center
Ribbon策略的两种配置方式
- Java 配置Ribbon
package com.itmuch.contentcenter.configuration;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Configuration;
import ribbonconfiguration.RibbonConfiguration;
/**
* 局部配置,只针对 user-center 起作用
* @Configuration
* @RibbonClient(name = "user-center", configuration = RibbonConfiguration.class)
*/
/**
* 全局配置,对所有ribbon起作用
* 如果需要用的话,UserCenterRibbonConfiguration类名修改一下会更语义化
* @Configuration
* @RibbonClients(defaultConfiguration = RibbonConfiguration.class)
*/
public class UserCenterRibbonConfiguration {
}
- application.properties
# ribbon配置策略 <clientName>.ribbon.NFLoadBalancerRuleClassName
user-center.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule
自定义Nacos权重策略
/**
* Created by Guaguaerhao on 2022/4/27 2:36 下午
* 自定义Nacos权重策略
*/
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
//读取配置文件,并初始化NacosWeightedRule
}
@Override
public Server choose(Object key) {
try {
BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
// log.info("lb = {}", baseLoadBalancer);
// 想要请求的微服务的名称
String name = baseLoadBalancer.getName();
//拿到服务发现的相关api
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
// nacos client 自动通过基于权重的负载均衡算法,给我们选择一个实例
Instance instance = namingService.selectOneHealthyInstance(name);
log.info("port = {}, instance = {}", instance.getPort(), instance);
return new NacosServer(instance);
} catch (NacosException e) {
e.printStackTrace();
}
return null;
}
}