栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring cloud 的自定义ribbon路由错误

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring cloud 的自定义ribbon路由错误

1、错误消息

Error creating bean with name 'ribbonLoadBalancingHttpClient' defined in org.springframework.cloud.netflix.ribbon.apache.HttpClientRibbonConfiguration: Unsatisfied dependency expressed through method 'ribbonLoadBalancingHttpClient' parameter 2; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ribbonLoadBalancer' defined in org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.loadbalancer.ILoadBalancer]: Factory method 'ribbonLoadBalancer' threw exception; nested exception is java.lang.RuntimeException: Unexpected exception creating rule for ZoneAwareLoadBalancer

2、IRule接口是实现要加无参数构造
IRule接口是实现类要加无惨构造,不然启动没有问题,调用就无法找到路由。
3、正确实例
package com.abc.balance;

import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class CustomRule  implements IRule {
    private ILoadBalancer ib;
    private List excludePorts;


    public CustomRule() {
    }

    public CustomRule(List excludePorts) {
        this.excludePorts = excludePorts;
    }

    @Override
    public Server choose(Object o) {
        List servers = ib.getReachableServers();
        List availableServices = getAvailableServices(servers);
        return getRandomService(availableServices);
    }

    private Server getRandomService(List availableServices) {
        int index = new Random().nextInt(availableServices.size());
        return availableServices.get(index);
    }

    private List getAvailableServices(List servers) {
        if (excludePorts == null || excludePorts.isEmpty()){
            return servers;
        }
        return servers.stream().filter(server -> excludePorts.stream().noneMatch(port->port==server.getPort())).collect(Collectors.toList());
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
        this.ib = iLoadBalancer;
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return this.ib;
    }
}
4、错误示例
package com.abc.balance;

import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class CustomRule  implements IRule {
    private ILoadBalancer ib;
    private List excludePorts;


    //public CustomRule() {
    //}

    public CustomRule(List excludePorts) {
        this.excludePorts = excludePorts;
    }

    @Override
    public Server choose(Object o) {
        List servers = ib.getReachableServers();
        List availableServices = getAvailableServices(servers);
        return getRandomService(availableServices);
    }

    private Server getRandomService(List availableServices) {
        int index = new Random().nextInt(availableServices.size());
        return availableServices.get(index);
    }

    private List getAvailableServices(List servers) {
        if (excludePorts == null || excludePorts.isEmpty()){
            return servers;
        }
        return servers.stream().filter(server -> excludePorts.stream().noneMatch(port->port==server.getPort())).collect(Collectors.toList());
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
        this.ib = iLoadBalancer;
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return this.ib;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/733238.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号