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

实现负载均衡的技术有哪些(负载均衡如何实现)

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

实现负载均衡的技术有哪些(负载均衡如何实现)

代码结构图:

Main类(程序入口)

package lb;

import lb.strategy.BalanceStrategy;
import lb.strategy.impl.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {
        //初始化候选服务器列表
        List servers=new ArrayList<>();
        servers.add(new Server("15.253.14.21",3306));
        servers.add(new Server("142.23.51.80",80));
        servers.add(new Server("88.92.123.72",8088));
        servers.add(new Server("211.163.5.77",2121));
        servers.add(new Server("91.63.24.16",3306));
        //初始化节点权重
        List weights=new ArrayList<>();
        weights.add(4);
        weights.add(2);
        weights.add(3);
        weights.add(7);
        weights.add(15);
        //初始化选择策略
        final BalanceStrategy ipHashRobin = new IPHashRobin(servers);
        final BalanceStrategy randomRobin= new RandomRobin(servers);
        final RandomWeightRobin randomWeightRobin = new RandomWeightRobin(servers, weights);
        final RoundRobin roundRobin = new RoundRobin(servers);
        final RoundWeightRobin roundWeightRobin = new RoundWeightRobin(servers, weights);
        LoadBalance lb=new LoadBalance();
        Scanner scanner = new Scanner(System.in);
        while (true)
        {
            System.out.println("请输入负载均衡策略:");
            String strategy=scanner.next();
            switch (strategy)
            {
                case BalanceStrategy.IP_HASH:
                    lb.setStrategy(ipHashRobin);
                    break;
                case BalanceStrategy.RANDOM:
                    lb.setStrategy(randomRobin);
                    break;
                case BalanceStrategy.WEIGHT_RANDOM:
                    lb.setStrategy(randomWeightRobin);
                    break;
                case BalanceStrategy.ROUND:
                    lb.setStrategy(roundRobin);
                    break;
                case BalanceStrategy.WEIGHT_ROUND:
                    lb.setStrategy(roundWeightRobin);
                    break;
                default:
                    System.exit(0);
            }
            System.out.println(lb.getServer());
        }
    }
}

Server类(用来表示服务器节点)

package lb;

public class Server
{
    private String ip;
    private int port;

    public Server(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }

    public String getIP() {
        return ip;
    }

    public int getPort() {
        return port;
    }

    @Override
    public String toString() {
        return "Server{" +
                "ip='" + ip + ''' +
                ", port=" + port +
                '}';
    }
}

LoadBalance类(用来进行负载均衡)

package lb;

import lb.strategy.BalanceStrategy;

public class LoadBalance
{
    private BalanceStrategy balanceStrategy;

    public void setStrategy(BalanceStrategy balanceStrategy) {
        this.balanceStrategy = balanceStrategy;
    }

    public Server getServer()
    {
        return balanceStrategy.select();
    }
}

BalanceStrategy接口(表示负载均衡策略的java接口)

package lb.strategy;

import lb.Server;

public interface BalanceStrategy
{
    static final String RANDOM="random";
    static final String WEIGHT_RANDOM="weight_random";
    static final String ROUND="round";
    static final String WEIGHT_ROUND="weight_round";
    static final String IP_HASH="ip_hash";
    Server select();
}

IPHashRobin类(ip哈希选择策略)

package lb.strategy.impl;

import lb.Server;
import lb.strategy.BalanceStrategy;

import javax.swing.*;
import java.util.List;
import java.util.Random;


public class IPHashRobin implements BalanceStrategy
{
    private List servers;
    public IPHashRobin(List servers)
    {
        this.servers=servers;
    }
    @Override
    public Server select() {
        String requestIP=String.valueOf(Math.random());
        int hash=Math.abs(requestIP.hashCode());
        return servers.get(hash%servers.size());
    }
}

RandomRobin类(随机策略)

package lb.strategy.impl;

import lb.Server;
import lb.strategy.BalanceStrategy;

import java.util.List;
import java.util.Random;


public class RandomRobin implements BalanceStrategy {
    private List servers;
    public RandomRobin(List servers)
    {
        this.servers=servers;
    }
    private Random random = new Random(System.currentTimeMillis());
    @Override
    public Server select() {
        return servers.get(random.nextInt(servers.size()));
    }
}

RandomWeightRobin类(加权随机算法)

package lb.strategy.impl;

import lb.Server;
import lb.strategy.BalanceStrategy;

import java.util.List;
import java.util.Random;


public class RandomWeightRobin implements BalanceStrategy
{
    private List servers;
    private List weights;
    private int totalWeight;
    private Random random = new Random(System.currentTimeMillis());
    public RandomWeightRobin(List servers,List weights)
    {
        this.servers=servers;
        this.weights=weights;
        totalWeight=0;
        for(int i=0;i weights.get(pos))
        {
            randomVal-=weights.get(pos);
            pos++;
        }
        return servers.get(pos);
    }
}

RoundRobin类(轮询策略)

package lb.strategy.impl;

import lb.Server;
import lb.strategy.BalanceStrategy;

import java.util.List;


public class RoundRobin implements BalanceStrategy
{
    private List servers;
    private int index;
    public RoundRobin(List servers)
    {
        this.servers=servers;
        index=0;
    }

    @Override
    public Server select() {
        Server server = servers.get(index);
        index++;
        if(index==servers.size())
        {
            index=0;
        }
        return server;
    }
}

RoundWeightRobin类(加权轮询策略)

package lb.strategy.impl;

import lb.Server;
import lb.strategy.BalanceStrategy;

import java.util.List;
import java.util.Random;


public class RoundWeightRobin implements BalanceStrategy
{
    private List servers;
    private List weights;
    private int nowWeight;
    private int totalWeight;
    private Random random = new Random(System.currentTimeMillis());
    public RoundWeightRobin(List servers,List weights)
    {
        this.servers=servers;
        this.weights=weights;
        nowWeight=1;
        totalWeight=0;
        for(int i=0;iweights.get(pos))
        {
            _weight-=weights.get(pos);
            pos++;
        }
        nowWeight++;
        if(nowWeight==totalWeight+1)
        {
            nowWeight=1;
        }
        return servers.get(pos);
    }
}

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

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

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