解析:首先会员服务在注册中心上注册,这个时候就在zookeeper上生成几个临时节点,节点名是/member/8080和/member/8081,值是127.0.0.1:8080,127.0.0.1:8081(zookeeeper每个节点都有节点名和节点值),/member是会员服务的入口,这个时候订单服务调用会员服务,使用本地负载均衡策略,如下所示:

使用Zookeeper实现负载均衡原理

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

    <dependencies><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.8</version></dependency></dependencies>

创建Server服务端

ZkServerScoekt服务

package com.itmayiedu;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.I0Itec.zkclient.ZkClient;
//##ServerScoekt服务端
public class ZkServerScoekt implements Runnable {private int port = 18080;public static void main(String[] args) throws IOException {int port = 18080;ZkServerScoekt server = new ZkServerScoekt(port);Thread thread = new Thread(server);thread.start();}public ZkServerScoekt(int port) {this.port = port;}// 将服务信息注册到注册中心上去public void regServer() {ZkClient zkClient = new ZkClient("127.0.0.1:2181", 6000, 1000);String path = "/member/server-" + port;if (zkClient.exists(path)) {zkClient.delete(path);}String value="127.0.0.1:" + port;zkClient.createEphemeral(path, "127.0.0.1:" + port);System.out.println("##服务注册成功###"+value);}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) {}}}
}

ServerHandler.java

package com.itmayiedu;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;//ServerHandler
public class ServerHandler implements Runnable {private Socket socket;public ServerHandler(Socket socket) {this.socket = socket;}public void run() {BufferedReader in = null;PrintWriter out = null;try {in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));out = new PrintWriter(this.socket.getOutputStream(), true);String body = null;while (true) {body = in.readLine();if (body == null)break;System.out.println("Receive : " + body);out.println("Hello, " + body);}} catch (Exception e) {if (in != null) {try {in.close();} catch (IOException e1) {e1.printStackTrace();}}if (out != null) {out.close();}if (this.socket != null) {try {this.socket.close();} catch (IOException e1) {e1.printStackTrace();}this.socket = null;}}}
}

ZkServerClient

package com.itmayiedu;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
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();}}}// 注册所有serverpublic static void initServer() {listServer.clear();// 从zk获取最新获取的注册服务连接final String memberServerPath = "/member";final ZkClient zkClient = new ZkClient("127.0.0.1:2181", 6000, 1000);// 获当前下子节点List<String> children = zkClient.getChildren(memberServerPath);listServer.clear();for (String p : children) {// 读取子节点value值listServer.add((String) zkClient.readData(memberServerPath + "/" + p));}System.out.println("最新服务信息listServer:" + listServer.toString());// 订阅子节点事件zkClient.subscribeChildChanges(memberServerPath, new IZkChildListener() {// 子节点发生变化public void handleChildChange(String parentPath, List<String> childrens) throws Exception {listServer.clear();for (String subP : childrens) {// 读取子节点value值listServer.add((String) zkClient.readData(memberServerPath + "/" + subP));}}});}// 服务调用次数private static int count = 1;// 会员服务集群数量,实际开发中不要写死,private static int memberServerCount = 2;// 获取当前server信息public static String getServer() {String serverName = listServer.get(count % memberServerCount);++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();}}}}
}

解析:当我们运行ZkServerScoekt.java后,再运行ZkServerClient.java,在ZkServerClient.java里面有一个main方法,接下来说执行流程:

这是client.send方法的定义

接下来我们来看服务器端的代码分析:

运行效果截图:
这是zkServerClient控制台:

这是18081服务器控制台:

这是18080服务器控制台:

从以上结果可以看出,实现了负载均衡的轮询机制

常见负载均衡算法:轮询、权重、IP绑定

zookeeper实现负载均衡相关推荐

  1. 使用Zookeeper实现负载均衡原理

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

  2. zookeeper 负载均衡 概念笔记

    (一)http://blog.csdn.net/zhangyu_ad/article/details/68942158 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它 ...

  3. 常见的服务器集群负载均衡技术:二三四七层负载均衡,DNS、LVS、F5、nginx负载均衡

    服务器集群负载均衡技术 LB:load balance负载均衡器.有时也叫做director. DNS负载均衡 DNS负载均衡,最基础的是轮询方式,循环返回不同的服务器IP地址.可以同时返回多个服务器 ...

  4. 【转】Dubbo_与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    原文链接:http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 ...

  5. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  6. Zookeeper实践与应用-- Nginx负载均衡差异

    Nginx/ZooKeeper 负载均衡的差异 Nginx 是我们常见的反向代理服务器,也被广泛的用作负载均衡服务器 ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡 Nginx Ngi ...

  7. 【JEECG dubbo专题】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  8. 转:Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    Dubbo与Zookeeper.SpringMVC整合和使用(负载均衡.容错) 标签: Dubbospringmvczookeeper负载均衡 2014-11-14 08:14 83517人阅读 评论 ...

  9. 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

最新文章

  1. 在某游戏公司面试游戏运营的感受
  2. 学一点Git–20分钟git快速上手
  3. Python学习之旅:用Python制作一个打字训练小工具
  4. iPhone13最新外观售价曝光:好看还便宜
  5. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
  6. 苹果从来不飙配置,也从不关注配置,即使一般的配置也能卖好价钱,为啥没人喷?
  7. [转]ie6下CSS存在的BUG
  8. word怎么把页面顺序倒过来_Word打印错乱——出现两个第1页
  9. 判断是否是空对象_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...
  10. cass转换jpg_【转】南方CASS作原有地形图数字化--对扫描栅格图像进行校正及矢量化...
  11. vtkdelaunay3d的参数设置_VTK 渲染体数据并加方位标注
  12. 用python做乘法口诀表_如何用python编写乘法口诀表
  13. 回忆2016:心怀梦想,奋力前行
  14. MySQL 那些监控参数 问 答 (4)REDO AHI latch 锁
  15. 关于window简体中文环境文件路径包含7种横杠的问题,及结论推广
  16. 磊科路由器dns服务器老要修复,路由器dns异常解决方法
  17. VMware winserver2016安装
  18. Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)
  19. 童鞋,做管理治大国如烹小鲜,一起穿越3600年,看看你能当啥官?
  20. 天正网络版怎么通过注册表修改服务器地址,如何修改天正的网络服务器地址

热门文章

  1. 实用性文章:精密电阻的特性与应用
  2. 关于OCM数量及OCM Profile登记
  3. 合作版机房收费系统——报表
  4. 智慧渲染,通用为“先”---- 象帝先推动 “通用、好用、高性能、自主可控” GPU解决方案
  5. 3D API,快速展示模型,实现3D模型在线可视化展示,还能进行各种测量视图等操作......
  6. css叠层_css z-index层重叠顺序
  7. Unity Netcode for GameObjects多人联机(源文件)
  8. 我的助理辞职了!——给不听话的下属看看
  9. 敏捷软件开发:原则、模式与实践——第14章 使用UML
  10. 百度云×百信银行:金融科技点亮智惠生活