前言
Ribbon 本不支持权重,因为spring-cloud里没有权重的概念。
spring-cloud-alibaba遵循了spring-cloud标准,所以spring-cloud-alibaba本身也没有权重的概念.
自己写代码扩展Ribbon来支持Nacos的权重
一、使用步骤
1.基于yml配置的方式
- 创建类:NacosWeightedRule
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties;
import org.springframework.cloud.alibaba.nacos.ribbon.NacosServer;
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object o) {
try {
//loadBalancer 是Ribbon的入口
BaseLoadBalancer loadBalancer = (BaseLoadBalancer)this.getLoadBalancer();
// 想要请求的微服务的名称
String name = loadBalancer.getName();
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
// 拿到服务发现的相关API
Instance instance = namingService.selectOneHealthyInstance(name);
log.info("NacosWeightedRule.instance.url:{},port:{}",instance.getIp(),instance.getPort());
return new NacosServer(instance);
}catch (NacosException e){
log.info("NacosWeightedRule.instance.error:"+e.getMessage());
return null;
}
}
}
- 添加yml 配置
user-center: #细粒度的配置,只在请求userCenter微服务时生效
ribbon:
NFLoadBalancerRuleClassName: com.itmuch.contentcenter.configuration.NacosWeightedRule
2.基于JAVA代码的方式
注意:在java代码方式和yml方式都有的时候,java代码的方式优先生效。
- 创建3个文件,
NacosWeightedRule 与上面一样。
UserCenterRibbonConfiguration:
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import ribbonconfiguration.RibbonConfiguration;
@RibbonClient(name = "user-center" ,configuration = RibbonConfiguration.class)
public class UserCenterRibbonConfiguration {
}
RibbonConfiguration:
import com.itmuch.contentcenter.configuration.NacosWeightedRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule(){
return new NacosWeightedRule();
}
}
- 在Nacos上设置微服务的权重
不要忘了,两种方式的启动类里要加:
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}