用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>");

%>
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Nacos 中实现负载均衡需要配置生产者和消费者的信息,具体步骤如下: 1. 配置生产者 生产者需要在 Nacos 中注册服务,可以使用以下代码注册: ```java String serverAddr = "localhost:8848"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); NacosServiceRegistry registry = new NacosServiceRegistry(properties); // 注册服务 registry.register("serviceName", "127.0.0.1", 8080); ``` 在注册时,需要指定服务名(`serviceName`)、IP 地址和端口号。Nacos 会自动为该服务创建一个实例并记录在注册中心中。 2. 配置消费者 消费者需要在 Nacos 中查询服务信息,可以使用以下代码查询: ```java String serverAddr = "localhost:8848"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); NacosServiceDiscovery discovery = new NacosServiceDiscovery(properties); // 查询服务 List<Instance> instances = discovery.getInstances("serviceName"); ``` 在查询时,需要指定服务名(`serviceName`),Nacos 会返回该服务的所有实例列表。每个实例包含 IP 地址和端口号等信息。 3. 实现负载均衡 在获取到服务的实例列表后,可以使用负载均衡算法选择一个实例进行调用。常见的负载均衡算法有轮询、随机等,可以根据实际需求选择合适的算法。 例如,以下代码使用轮询算法选择一个实例进行调用: ```java Instance instance = instances.get(index); index = (index + 1) % instances.size(); String url = "http://" + instance.getIp() + ":" + instance.getPort() + "/api"; String result = restTemplate.getForObject(url, String.class); ``` 其中,`restTemplate` 是 Spring Framework 提供的 HTTP 请求工具,可以使用其他 HTTP 请求工具代替。`index` 变量用于记录上一次选择的实例索引,下一次选择时会从下一个实例开始,实现轮询的效果。 需要注意的是,以上代码只是一个简单的示例,实现了基本的负载均衡功能。在实际应用中,还需要考虑服务故障、容错等情况,以保证系统的稳定性和可靠性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值