首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Thrift 基于zookeeper改造模式(1)

Thrift 基于zookeeper改造模式(1)

对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行:
1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使用较为复杂,因此采用curator-recipes工具类进行处理服务的注册与发现。
2.客户端使用连接池对服务调用进行管理,提升性能,这里我们使用Apache Commons项目commons-pool,可以大大减少代码的复杂度。
3.关于Failover/LoadBalance,由于zookeeper的watcher,当服务端不可用是及时通知客户端,并移除不可用的服务节点,而LoadBalance有很多算法,这里我们采用随机加权方式,也是常有的负载算法,至于其他的算法介绍参考:常见的负载均衡的基本算法。
4.使thrift服务的注册和发现可以基于spring配置,可以提供很多的便利。
5.其他的改造如:
1)通过动态代理实现client和server端的交互细节透明化,让用户只需通过服务方提供的接口进行访问
2)Thrift通过两种方式调用服务Client和Iface
// *) Client API 调用  (EchoService.Client)client.echo("hello lilei");  ---(1)  // *) Service 接口 调用  (EchoService.Iface)service.echo("hello lilei");  ---(2)  Client API的方式, 不推荐, 我们推荐Service接口的方式(服务化)。
下面我们来一一实现:
一、pom.xml引入依赖jar包

View Code
二、使用zookeeper管理服务节点配置
RPC服务往平台化的方向发展, 会屏蔽掉更多的服务细节(服务的IP地址集群, 集群的扩容和迁移), 只暴露服务接口. 这部分的演化, 使得server端和client端完全的解耦合. 两者的交互通过ConfigServer(MetaServer)的中介角色来搭线。

注: 该图源自dubbo的官网
这边借助Zookeeper来扮演该角色, server扮演发布者的角色, 而client扮演订阅者的角色.
Zookeeper是分布式应用协作服务. 它实现了paxos的一致性算法, 在命名管理/配置推送/数据同步/主从切换方面扮演重要的角色。 其数据组织类似文件系统的目录结构:

[url=][/url]
每个节点被称为znode, 为znode节点依据其特性, 又可以分为如下类型:  1). PERSISTENT: 永久节点  2). EPHEMERAL: 临时节点, 会随session(client disconnect)的消失而消失  3). PERSISTENT_SEQUENTIAL: 永久节点, 其节点的名字编号是单调递增的  4). EPHEMERAL_SEQUENTIAL: 临时节点, 其节点的名字编号是单调递增的  注: 临时节点不能成为父节点  Watcher观察模式, client可以注册对节点的状态/内容变更的事件回调机制. 其Event事件的两类属性需要关注下:  1). KeeperState: Disconnected,SyncConnected,Expired  2). EventType: None,NodeCreated,NodeDeleted,NodeDataChanged,NodeChildrenChangedRPC服务端:  作为具体业务服务的RPC服务发布方, 对其自身的服务描述由以下元素构成.  1). namespace: 命名空间,来区分不同应用   2). service: 服务接口, 采用发布方的类全名来表示  3). version: 版本号  借鉴了Maven的GAV坐标系, 三维坐标系更符合服务平台化的大环境.   *) 数据模型的设计  具体RPC服务的注册路径为: /rpc/{namespace}/{service}/{version}, 该路径上的节点都是永久节点  RPC服务集群节点的注册路径为: /rpc/{namespace}/{service}/{version}/{ip:port:weight}, 末尾的节点是临时节点.[url=][/url]

1.定义Zookeeper的客户端的管理
ZookeeperFactory.Java
View Code
2.服务端注册服务
由于服务端配置需要获取本机的IP地址,因此定义IP获取接口
ThriftServerIpResolve.java
View Code
可以对该接口做不通的实现,下面我们基于网卡获取IP地址,也可以通过配置serverIp
ThriftServerIpLocalNetworkResolve.java
View Code
接下来我们定义发布服务接口,并实现将服务信息(服务接口、版本号,IP、port、weight)发布到zookeeper中。
ThriftServerAddressRegister.java
View Code
实现:ThriftServerAddressRegisterZookeeper.java
View Code
3.客户端发现服务
定义获取服务地址接口
ThriftServerAddressProvider.java
View Code
基于zookeeper服务地址自动发现实现:ThriftServerAddressProviderZookeeper.java
View Code
对此接口还做了一种实现,通过配置获取服务地址,参考附件:FixedAddressProvider.java
返回列表