SpringCloud初体验(二)Ribbon

作者: z七夜 | 来源:发表于2018-08-06 12:11 被阅读3次

写在前面

SpringCloud,微服务全家桶,很火,来学一下,本文只是简单使用,并没有仔细研究其原理,还请各位多指教

Ribbon是一个客户端负载均衡,啥意思,就是由客户端来做负载均衡,你自己看着办,那个好,就访问那个

1. 搭建环境

前面我们已经搭建了springboot项目,而且集成了eureka的集群,现在我们集成一下Ribbon负载均衡,既然是客户端负载均衡,那么我们就要在客户端做准备

客户端

1.修改pom文件

image.png

2.修改yml文件

image.png

3.修改访问前缀

image.png

4.修改配置

我们通过RestTemplate访问数据,在这上面添加负载均衡


image.png

这样即可,进行客户端的负载均衡

Ribbon默认的负载均衡算法是轮询,Ribbon自带了好多的负载均衡算法,如果想要切换,需要配置一下


image.png

如果想要自定义负载均衡算法

要求,还是轮询,但是需要每个服务端执行五次
我们需要自定义一个算法,我们只需要自定义一个Rule,但是这个配置文件一定要在启动类的外面,不能再同一个包下

image.png

编写规则

public class MyRadomLoadBalanceRule extends AbstractLoadBalancerRule {


    private int total = 0;          // 总共被调用的次数,目前要求每台被调用5次
    private int currentIndex = 0;   // 当前提供服务的机器号

    public Server choose(ILoadBalancer lb, Object key)
    {
        if (lb == null) {
            return null;
        }
        Server server = null;

        while (server == null) {
            if (Thread.interrupted()) {
                return null;
            }
            List<Server> upList = lb.getReachableServers();
            List<Server> allList = lb.getAllServers();

            int serverCount = allList.size();
            if (serverCount == 0) {
                /*
                 * No servers. End regardless of pass, because subsequent passes only get more
                 * restrictive.
                 */
                return null;
            }

//          int index = rand.nextInt(serverCount);// java.util.Random().nextInt(3);
//          server = upList.get(index);


//          private int total = 0;          // 总共被调用的次数,目前要求每台被调用5次
//          private int currentIndex = 0;   // 当前提供服务的机器号
            if(total < 5)
            {
                server = upList.get(currentIndex);
                total++;
            }else {
                total = 0;
                currentIndex++;
                if(currentIndex >= upList.size())
                {
                    currentIndex = 0;
                }
            }


            if (server == null) {
                /*
                 * The only time this should happen is if the server list were somehow trimmed.
                 * This is a transient condition. Retry after yielding.
                 */
                Thread.yield();
                continue;
            }

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

            // Shouldn't actually happen.. but must be transient or a bug.
            server = null;
            Thread.yield();
        }

        return server;

    }

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

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig)
    {
        // TODO Auto-generated method stub

    }
}

在客户端启动类加入注解


image.png

指明那个微服务,使用哪一种负载均衡算法,这样即可完成客户端的负载均衡

QQ群:552113611

相关文章

网友评论

    本文标题:SpringCloud初体验(二)Ribbon

    本文链接:https://www.haomeiwen.com/subject/mubwvftx.html