TCP-IP学习笔记十:RPC架构WebService加入Zookeeper集群的管理
标签(空格分隔): TCP-IP Zookeeper
一、前言
了解了Zookeeper的使用场景之后,可以对RPC架构的WebService加入到Zookeeper中进行管理。实现服务器上线自动注册,进而通知客户度知道可以调度哪些服务器,同时服务器下线,通知客户端哪些服务器不可用。这一点也是利用了Zookeeper可以监控每个节点数据的变化和子节点变化的特点。
我们可已经服务器的启动注册到Zookeeper中,Zookeeper相当于一个注册中心,监控每个节点的数据和子节点的变化,监控到变化就通知到各个客户端。客户端启动从Zookeeper动态获取可用服务器列表,Zookeeper检测到变化的时候可以动态的通知客户度哪些服务器不可用或者新的服务器加入。
二、具体的代码实施
服务器端的修改
注入服务器IP:端口号,和Znode(应用所在的路径),在服务器启动的时候注入到Zookeeper中。
在NIOServerBootstrap的线程启动下添加如下代码:client=new ZkClient(servers); //判断节点是否存在,不存在则创建 if(!client.exists(serverPath)){ client.createPersistent(serverPath,true); } //注册服务 String tmpPath=serverPath+"/"+ InetAddress.getLocalHost().getHostAddress()+":"+port; //判断节点是否存在,不存在则创建 if(!client.exists(tmpPath)){ client.createEphemeral(tmpPath); }
客户端的修改
添加InvokeLoadBalancer类,获得可用连接和负载均衡策略。
负载均衡策略有很多实现方式(有很多算法),这里使用简单的随机数的方式实现。package com.motui.rpc.client; import org.I0Itec.zkclient.IZkChildListener; import org.I0Itec.zkclient.ZkClient; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * Created by MOTUI on 2016/10/24. * * 获取可用连接和实现负载均衡 */ public class InvokeLoadBalancer implements Serializable { //存储可用的服务列表 private static List<HostAndPort> hostAndPorts; private ZkClient zkClient; //监听的节点路径 private String serverPath; public InvokeLoadBalancer(String servers,String serverPath){ this.serverPath = serverPath; this.zkClient = new