前言
第三版中往框架加入Netty实现通信框架,Zookeeper实现服务的注册。Netty可以帮助我们快速完成NIO的通信编程,Zookeeper则可以可以实现服务的注册以及发现。代码上传至github,链接.
Zookeeper API
创建会话:1
2
3
4
5
6
7
8
9
10
11
12Zookeeper(String connectString,int sessionTimeout,Watcher watcher)
//指定的服务器列表,多个host:port之间用英文逗号分隔。还可以可选择的指定一个基路径
//如果指定了一个基路径,则所有后续操作基于这个及路径进行。
connectString -- host:port[,host:port][basePath]
//会话超时时间。以毫秒为单位。客户端和服务器端之间的连接通过心跳包进行维系
//如果心跳包超过这个指定时间则认为会话超时失效。
sessionTimeOut
//指定默认观察者。如果为null表示不需要观察者。
watcher
创建节点:1
2
3
4
5
6
7
8
9
10
11
12
13//同步方式创建
String create(final String path,byte data[],List<ACL> acl,CreateMode createMode);
//异步方式创建
void create(final String path,byte data[],List<ACL> acl,CreateMode createMode,StringCallback cb,Object ctx);
path 要创建的数据节点的路径
data [] 节点创建时初始数据内容
acl 节点acl安全策略
createMode 创建模式
PERSISTENT 持久
PERSISTENT_SEQUENTIAL 持久顺序
EPHEMERAL 临时
EPHEMERAL_SEQUENTIAL 临时顺序
读取数据:1
2
3
4
5
6
7
8List<String> getChildren(final String path,Watcher watcher)
path 要创建的数据节点的路径
watcher 观察者,一旦在本子节点获取之后,子节点列表发生变更,服务器端向客户端发送消息,触发watcher中的回调。
注意,仅仅是通知而已,如果需要新的子节点列表,需要自己再次去获取。允许传入null。
byte [] getData(final String path,Watcher watcher, Stat stat)
byte [] getData(String path,boolean watch, Stat stat)
检查节点是否存在:1
2public Stat exists(final String path,Watcher watcher)
public Stat exists(String path,boolean watch)
Netty的使用
针对于Netty对NIO的封装,刚理解还是不明白Netty各个组件的用意是什么。不过简单的去了解之后,还是可以完成通信的,先在这TODO,以后有机会深入学习一下。因为很多的框架中都能看到Netty的使用。而且Netty设计到很多设计模式如Facade、Futrue等。想要搞明白Netty这些都需要先了解清楚,在这个基础使用起来更加有底。
总结
这个版本还是存在一些问题,如java的序列化低效。但是我们也并不是要完成的多完美,主要是学习的过程中,可以获得很多知识点。这款RPC我也不打算继续迭代下去,希望能吸收Netty的一些实现模式以及理解组件的实现原理之后再去尝试去开发。不然只是停留在使用阶段,也很容易忘掉。
Zookeeper虽然实现了服务的注册和发现,但只是做了一个简单的随机轮询,应该有更好的方法实现负载均衡。不过通过对它的使用,对Zookeeper的理解也深刻了一点,看来做这个RPC框架收益的确是挺大的。
JDK反射、动态规划都有了一个实践过程,这种过程很好,至少比浅浅的看一些博客要来得深刻多。关于Futrue、Callable在Netty的使用,我还没理解到,后面先把这块解决把!只要在学习的路上就好了!