Motan In Action - Registry

2017/12/19

Registry

Motan的服务注册中心,提供服务注册、服务订阅、服务心跳发送、服务变更通知。Motan目前提供两种服务注册方式:Zookeeper和Consul。

Zookeeper

学习目标:这里我只要知道Zookeeper是干什么的,提供了什么功能就可以了。然后motna是如何使用zookeeper来实现它上面描述的四个功能。

Zookeeper是一个开源的分布式协调服务,分布式数据一致性的解决方案,可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举,分布式锁和分布式队列等功能。

Zookeeper使用树型结构来存储节点,使用时会将全部数据加载到内存中,以此提高服务的吞吐、减少延迟。

Zookeeper集群只要超过一半的机器能够工作,那么整个集群就能够正常对外服务。Zookeeper客户端会选择和集群中任意一台机器进行连接,当连接断开后客户端会自动选择集群中其他机器进行连接。

集群角色

典型的集群模式Master/Slave模式(主备模式),能够处理写操作的机器称为Master机器,然后通过异步复制方式获取最新数据,并只能提供读服务的机器称为Slave机器。

Zookeeper引入了Leader、Follower和Observer三种角色。所有Follwer机器通过选举产生Leader,由Leader负责客户端的读和写服务,Follower和Observer负责读服务,Observer不参与选举也不参与写操作的“过半写成功”策略,因此Obsever在不影响写性能的情况下可以提升集群的读性能。

Leader选举

服务器启动时的选举: 1)每台机器发出一个投票(myid,ZXID),myid表示投给那台机器的id(投给谁),ZXID表示当前事件,每次会递增,越大的表示最新的事件。第一次默认都是投给自己,所以myid都是本台机器的id。 2)收到其他机器的投票后,检查投票的有效性。 3)处理投票:ZXID越大的,机器作为优先Leader;ZXID相同,myid大的作为优先Leader。下一轮投票就投优先Leader。再次投票(优先Leader id,ZXID)。 4)统计投票,投优先Leader数量过半的,则将优先Leader作为Leader。 5)改变机器状态,确定Leader后,每个机器会更新自己的状态,Follower变为FOLLOWING,Leader变为LEADING。

服务器运行期间的选举: 运行过程中如果Leader挂了就要进行重新选举。 1)如果Leader挂了,其余Follower机器就把自己状态变为LOOKING,然后开始新的一轮选举。 2)投票,ZXID表示事务ID,运行期间每台机器可能不相同。第一轮投票还是都都给自己(自己id,ZXID)。 3)收到其他机器的投票后,检查投票的有效性。 4)处理投票,ZXID越大的,机器作为优先Leader;再次投票(优先Leader id,ZXID)。 5)统计投票,投优先Leader数量过半的,则将优先Leader作为Leader。 6)改变机器状态,确定Leader后,每个机器会更新自己的状态,Follower变为FOLLOWING,Leader变为LEADING。

通常哪台机器上的数据越新,那么越有可能成为Leader。因为数据越新,ZXID越大,越能保证数据的恢复。在Zookeeper中,事务是指能够改变Zookeeper服务器状态的操作。每一个事务请求,Zookeeper都会为其分配一个全局唯一的事务ID-ZXID,每一个ZXID对应一次更新操作。可以通过ZXID间接的识别这些更新操作的请求顺序。

会话(Session)

Session是指客户端的会话,客户端与服务器建立连接后,会话开始。会话都有一个超时时间,即使客户端与服务器断开连接后,只需要在这个时间内重新连接上服务器,之前创建的会话仍然有效。

数据节点(Znode)

Zookeeper的数据都是存储在对应的数据节点Znode中,Znode以树结构形式存储在文件中,节点可以包含子节点。Znode分为持久节点和临时节点(以及顺序节点)。临时节点的声明周期随Session开始而创建,Session失效而删除。

版本

Zookeeper所有数据都存储在Znode,Znode内部会维护一个叫做Stat的数据结构,里面记录着Znode的版本号。Znode的版本表示节点被修改的次数,每次修改都会递增。

Watcher

Watcher(事件监听器)发布/订阅功能,Zookeeper通过Watcher允许客户端向Znode注册事件监听,当事件发生时,Zookeeper会通知这些客户端。

ACL

Zookeeper采用ACL(Access Control Lists)进行权限控制。

motan zookeeper

motan使用Zookeeper实现了服务的订阅和发布。Provider根据自己的url在Zookeeper上创建节点,Consumer监听这些url的节点。motan使用ZkClient客户端。

服务注册: 实际就是在Zookeeper上创建了一个Znode节点,该节点存储了该服务的IP、端口、调用方式等信息。

key:GroupName@ServiceName value:url (https://www.cnblogs.com/lihao007/p/9775352.html)

motan-registry-zookeeper要做的事情是实现服务的订阅/发布功能、监听功能、心跳维护。监听功能和心跳维护zkClient.subscribeChildChanges(serverTypePath, zkChildListener);

IZkStateListener handleStateChanged、handleNewSession IZkChildListener handleChildChange (https://my.oschina.net/u/2277632/blog/1532162)

Post Directory