• 使用Zookeeper实现负载均衡轮询例子


    1.原理

    ​ 使用Zookeeper实现负载均衡原理,服务器端将启动的服务注册到,zk注册中心上,采用临时节点。客户端从zk节点上获取最新服务节点信息,本地使用负载均衡算法,随机分配服务器。

    2.实例代码相关

    Maven依赖:
    	<dependencies>
    		<dependency>
    			<groupId>com.101tec</groupId>
    			<artifactId>zkclient</artifactId>
    			<version>0.8</version>
    		</dependency>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.6</version>
            </dependency>
    	</dependencies>
    
    ZkServerScoekt:
    public class ZkServerScoekt implements Runnable {
        private static int port = 18081;
    
        public static void main(String[] args) throws IOException {
            ZkServerScoekt server = new ZkServerScoekt(port);
            Thread thread = new Thread(server);
            thread.start();
        }
    
        public ZkServerScoekt(int port) {
            this.port = port;
        }
    
        public void regServer() {
            // 向ZooKeeper注册当前服务器
            ZkClient client = new ZkClient("127.0.0.1:2181", 60000, 1000);
            String path = "/test/server" + port;
            if (client.exists(path))
                client.delete(path);
            client.createEphemeral(path, "127.0.0.1:" + port);
        }
    
        public void run() {
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(port);
                regServer();
                System.out.println("Server start port:" + port);
                Socket socket = null;
                while (true) {
                    socket = serverSocket.accept();
                    new Thread(new ServerHandler(socket)).start();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (serverSocket != null) {
                        serverSocket.close();
                    }
                } catch (Exception e2) {
    
                }
            }
        }
    
    }
    
    
    ZkServerClient:
    public class ZkServerClient {
        public static List<String> listServer = new ArrayList<String>();
    
        public static void main(String[] args) {
            initServer();
            ZkServerClient client = new ZkServerClient();
            BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                String name;
                try {
                    name = console.readLine();
                    if ("exit".equals(name)) {
                        System.exit(0);
                    }
                    client.send(name);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 注册所有server
        public static void initServer() {
            final String path = "/test";
            final ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 1000);
            List<String> children = zkClient.getChildren(path);
            listServer.clear();
            for (String p : children) {
                listServer.add((String) zkClient.readData(path + "/" + p));
            }
            // 订阅节点变化事件
            zkClient.subscribeChildChanges("/test", new IZkChildListener() {
    
                public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
                    listServer.clear();
                    for (String p : currentChilds) {
                        listServer.add((String) zkClient.readData(path + "/" + p));
                    }
                    System.out.println("####handleChildChange()####listServer:" + listServer.toString());
                }
            });
        }
    
        // 请求次数
        private static int count = 1;
        // 服务数量
        private static int serverCount=2;
    
        // 获取当前server信息
        public static String getServer() {
            String serverName = listServer.get(count%serverCount);
            ++count;
            return serverName;
        }
    
        public void send(String name) {
    
            String server = ZkServerClient.getServer();
            String[] cfg = server.split(":");
    
            Socket socket = null;
            BufferedReader in = null;
            PrintWriter out = null;
            try {
                socket = new Socket(cfg[0], Integer.parseInt(cfg[1]));
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(socket.getOutputStream(), true);
    
                out.println(name);
                while (true) {
                    String resp = in.readLine();
                    if (resp == null)
                        break;
                    else if (resp.length() > 0) {
                        System.out.println("Receive : " + resp);
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/charlypage/p/12286817.html
Copyright © 2020-2023  润新知