用java实现简单url负载均衡以及容错

公司的服务器经常出问题,只好写了一个负载均衡器(无法安装apache)
package com.sourceware.httploadbalance;
import java.util.Hashtable;

import java.util.Collection;

import java.util.Iterator;
/**
 * <p>Title: 负载均衡器</p>
 *
 * <p>Description: </p>
 *

 * <p>Copyright: Copyright (c) 2006</p>

 *
 * <p>Company: </p>
 *
 * @author 黑山

 * @version 1.0

 */
public class Dispatcher {
    private java.util.Hashtable allClienct = new Hashtable();
    //负载均衡地址;
    private Collection allHTTPURLs;
    //一旦所有均衡都无法工作时的地址;
    private Collection allBackURLs;

    private Collection allLiveURLs;

    private int refreshSeconds = 60;
    private static long latestCheckTime = 0;

    private String page600 = "600.html";

    private String page601 = "601.html";

    private String page602 = "602.html";

    private String page603 = "603.html";

    private String page604 = "604.html";
 
    private Dispatcher() {
        allHTTPURLs = new java.util.ArrayList();

        allBackURLs = new java.util.ArrayList();

        int lbsize = Integer.parseInt(com.sourceware.util.ConfigProperties.
                                      getProperty("lb.size"));

        int backupsize = Integer.parseInt(com.sourceware.util.ConfigProperties.
                                          getProperty("backup.size"));
 

        for (int i = 0; i < lbsize; i++) {
            String s = com.sourceware.util.ConfigProperties.getProperty(
                    "work" +
                    i);
            if (s != null && s.trim().length() != 0) {
                allHTTPURLs.add(s);

            }
        }
        for (int i = 0; i < backupsize; i++) {
            String s = com.sourceware.util.ConfigProperties.getProperty(
                    "backup" +
                    i);

            if (s != null && s.trim().length() != 0) {
                allBackURLs.add(s);

            }
        }
        refreshSeconds = Integer.parseInt(com.sourceware.util.ConfigProperties.
                                          getProperty("refresh.seconds"));


    }

    private static Dispatcher dis = new Dispatcher();

    public static Dispatcher getInstance() {
        return dis;
    }
    public String route() {

        if (System.currentTimeMillis() - latestCheckTime >
            refreshSeconds * 1000) {
            checkURLs();

        }
        //随机挑一个地址;然后检测地址是否可用;如可用则返回该地址;

        if (allLiveURLs.size() == 0) {
            if (allBackURLs.size() == 0) {
                return page601;

            }
            int random = (int) java.lang.Math.random() *
                    allBackURLs.size();


            String url = (String) allBackURLs.toArray()[random];

            return url;
        }
        int random = (int) java.lang.Math.random() *
                                                allLiveURLs.size();
        System.out.println(allLiveURLs.size() + ":" + random);

        String url = (String) allLiveURLs.toArray()[random];
 
        if (isLive(url)) {

            return url;

        } else {

            checkURLs();

            if (allLiveURLs.size() == 0) {

                random = (int) java.lang.Math.random() *
                        allBackURLs.size();

                url = (String) allBackURLs.toArray()[random];

                return url;
            }

            random = (int) java.lang.Math.random() *
                                                allLiveURLs.size();


            url = (String) allLiveURLs.toArray()[random];
 
            return url;

        }
    }
    public static void main(String[] args) {

        String url = Dispatcher.getInstance().route();
        System.out.println(url);
    }

    private void checkURLs() {
        allLiveURLs = new java.util.ArrayList();

        Iterator it = allHTTPURLs.iterator();

        while (it.hasNext()) {
            String url = (String) it.next();
 
            if (isLive(url)) {

                allLiveURLs.add(url);

                System.out.println("check true:" + url);
 
            }
        }
    }
    private boolean isLive(String url) {
        for (int i = 0; i < 3; i++) {
            try {
                java.net.HttpURLConnection urlconn = (java.net.
                        HttpURLConnection)new java.net.URL(url).openConnection();
                int code = urlconn.getResponseCode();
                if (code == 200) {
                    return true;
                }
            } catch (Exception ex) {
            }
        }
        return false;
    }
}
 

config.properties

refresh.seconds=60

lb.size=1

backup.size=1

work0=http://sms.i6688.com

backup0=http://www.i6688.com:8080/cmvp

test.jsp

<%@ page contentType="text/html; charset=GBK" %>

<%
String url = com.sourceware.httploadbalance.Dispatcher.getInstance().route();
 
out.println("<script>");

out.println("window.location='"+url+"'");
 
out.println("</script>");

%>
 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值