ribbon+nacos集成问题

由于项目问题,只能使用zuul做网关,所以还是使用的Netflix 这一套,但是要接入nacos做服务注册,这里就会导致一个问题

provider注册到nacos,还得让网关能从nacos拉取serverList,通过ribbon实现负载均衡的话,ribbon的serverList默认就是eureka实现的,想用nacos就得把ribbon的serverList用nacos实现一下。

这里根据这篇文章

扩展Ribbon支持Nacos权重的三种方式_Zen-CSDN博客Nacos支持权重配置,这是个比较实用的功能,例如:把性能差的机器权重设低,性能好的机器权重设高,让请求优先打到性能高的机器上去;某个实例出现异常时,把权重设低,排查问题,问题排查完再把权重恢复;想要下线某个实例时,可先将该实例的权重设为0,这样流量就不会打到该实例上了——此时再去关停该实例,这样就能实现优雅下线啦。当然这是为Nacos量身定制的优雅下线方案——Spring Cloud中,要想实现优雅下线还有很多姿势,详见:《实用技巧:Spring Cloud中,如何优雅下线微服务?》,里面笔.https://blog.csdn.net/cxionc123/article/details/107763370实现ribbon获取服务列表

由于nacos使用的是2.x版本,所以里面的实现需要改动,将nacosserver改成

new Server(instance.getIp(),instance.getPort());

然后加上注解@Configuration即可,顺便要在yml配置文件上关闭ribbon对eureka的支持

ribbon:
  eureka:
    enabled: false

例子:(这里的servicenamecontext是自定义的上下文类,获取当前请求线程的服务名)

@Slf4j
@Configuration
public class NacosWeightRandomV2Rule extends AbstractLoadBalancerRule {
    @Autowired
    private NacosDiscoveryProperties discoveryProperties;
 
    @Override
    public Server choose(Object key) {
        DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
        String name = loadBalancer.getName();
        try {
            if(ServiceNameContext.getServiceName()!= null){
                name = ServiceNameContext.getServiceName();
            }
            Instance instance = discoveryProperties.namingServiceInstance()
                    .selectOneHealthyInstance(name);
 
            log.info("选中的instance = {}", instance);
 
            return new Server(instance.getIp(),instance.getPort());
        } catch (NacosException e) {
            log.error("发生异常", e);
            return null;
        }
    }
 
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
    }
}

你可能感兴趣的:(java,ribbon,spring,cloud,java)