springcloud ribbon 配置直连策略

1.编写直连策略

package com.river.ribbon.server.configuration;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

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

@ConfigurationProperties(prefix = "ribbon.direct-servers")
public class DirectRule extends AbstractLoadBalancerRule {

    private static Logger log = LoggerFactory.getLogger(DirectRule.class);

    private String hostPort = "";

    public String getHostPort() {
        return hostPort;
    }

    public void setHostPort(String hostPort) {
        if (!StringUtils.hasText(hostPort)){
            throw new IllegalArgumentException("params [ribbon.direct-servers.hostPort] is null");
        }
        this.hostPort = hostPort;
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    @Override
    public Server choose(Object key) {
        return chooseServer(getLoadBalancer(), key);
    }

    public Server chooseServer(ILoadBalancer lb, Object key){
        if (lb == null) {
            log.warn("no load balancer");
            return null;
        }

        Server server = null;
        int count = 0;
        while (server == null && count++ < 10) {
            List<Server> reachableServers = lb.getReachableServers();
            List<Server> allServers = lb.getAllServers();
            int upCount = reachableServers.size();
            int serverCount = allServers.size();

            if ((upCount == 0) || (serverCount == 0)) {
                log.warn("No up servers available from load balancer: " + lb);
                return null;
            }

            server = targetServer();

            if (server == null) {
                /* Transient. */
                Thread.yield();
                continue;
            }

            if (server.isAlive() && (server.isReadyToServe())) {
                return (server);
            }

            // Next.
            server = null;
        }

        if (count >= 10) {
            log.warn("No available alive servers after 10 tries from load balancer: "
                    + lb);
        }
        return server;
    }

    private Server targetServer(){
        List<Server> serverList = getLoadBalancer().getAllServers().stream().filter(ele -> ele.getHostPort().equalsIgnoreCase(hostPort)).collect(Collectors.toList());
        if (!CollectionUtils.isEmpty(serverList)) {
            return serverList.get(0);
        }
        log.warn("no appoint balancer like this");
        return null;
    }

}

2.配置

package com.river.ribbon.server.configuration;

import com.netflix.loadbalancer.IRule;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

@Configuration
public class SelfConfig {


    @Lazy
    @Bean
    @ConditionalOnMissingBean
    public IRule ribbonRule() {
        System.out.println("随机的。。。。");
        return new DirectRule();
    }
}

3.配置文件,配置直连的服务

ribbon:
   direct-servers:
      hostPort:  PC-HEPENGFEI.ppmoney.com:9002

转载于:https://my.oschina.net/JackieRiver/blog/1863632

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值