zookeeper实现负载均衡
解析:首先会员服务在注册中心上注册,这个时候就在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实现负载均衡相关推荐
- 使用Zookeeper实现负载均衡原理
思路 使用Zookeeper实现负载均衡原理,服务器端将启动的服务注册到,zk注册中心上,采用临时节点.客户端从zk节点上获取最新服务节点信息,本地使用负载均衡算法,随机分配服务器. 创建项目工程 M ...
- zookeeper 负载均衡 概念笔记
(一)http://blog.csdn.net/zhangyu_ad/article/details/68942158 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它 ...
- 常见的服务器集群负载均衡技术:二三四七层负载均衡,DNS、LVS、F5、nginx负载均衡
服务器集群负载均衡技术 LB:load balance负载均衡器.有时也叫做director. DNS负载均衡 DNS负载均衡,最基础的是轮询方式,循环返回不同的服务器IP地址.可以同时返回多个服务器 ...
- 【转】Dubbo_与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
原文链接:http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 ...
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- Zookeeper实践与应用-- Nginx负载均衡差异
Nginx/ZooKeeper 负载均衡的差异 Nginx 是我们常见的反向代理服务器,也被广泛的用作负载均衡服务器 ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡 Nginx Ngi ...
- 【JEECG dubbo专题】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- 转:Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
Dubbo与Zookeeper.SpringMVC整合和使用(负载均衡.容错) 标签: Dubbospringmvczookeeper负载均衡 2014-11-14 08:14 83517人阅读 评论 ...
- 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
最新文章
- 在某游戏公司面试游戏运营的感受
- 学一点Git–20分钟git快速上手
- Python学习之旅:用Python制作一个打字训练小工具
- iPhone13最新外观售价曝光:好看还便宜
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
- 苹果从来不飙配置,也从不关注配置,即使一般的配置也能卖好价钱,为啥没人喷?
- [转]ie6下CSS存在的BUG
- word怎么把页面顺序倒过来_Word打印错乱——出现两个第1页
- 判断是否是空对象_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...
- cass转换jpg_【转】南方CASS作原有地形图数字化--对扫描栅格图像进行校正及矢量化...
- vtkdelaunay3d的参数设置_VTK 渲染体数据并加方位标注
- 用python做乘法口诀表_如何用python编写乘法口诀表
- 回忆2016:心怀梦想,奋力前行
- MySQL 那些监控参数 问 答 (4)REDO AHI latch 锁
- 关于window简体中文环境文件路径包含7种横杠的问题,及结论推广
- 磊科路由器dns服务器老要修复,路由器dns异常解决方法
- VMware winserver2016安装
- Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)
- 童鞋,做管理治大国如烹小鲜,一起穿越3600年,看看你能当啥官?
- 天正网络版怎么通过注册表修改服务器地址,如何修改天正的网络服务器地址
热门文章
- 实用性文章:精密电阻的特性与应用
- 关于OCM数量及OCM Profile登记
- 合作版机房收费系统——报表
- 智慧渲染,通用为“先”---- 象帝先推动 “通用、好用、高性能、自主可控” GPU解决方案
- 3D API,快速展示模型,实现3D模型在线可视化展示,还能进行各种测量视图等操作......
- css叠层_css z-index层重叠顺序
- Unity Netcode for GameObjects多人联机(源文件)
- 我的助理辞职了!——给不听话的下属看看
- 敏捷软件开发:原则、模式与实践——第14章 使用UML
- 百度云×百信银行:金融科技点亮智惠生活