zookeeper+dubbo实现java分布式服务
ZooKeeper简介
ZooKeeper(Zookeeper 下载地址)是一个分布式的,开放源码的分布式应用程序协调服务,是 Apache Hadoop 的一个子项目,是Google的Chubby一个开源的实现,主要是用来解决分布式应用中经常遇到的一些数据管理问题,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户.
每个子目录项如 NameService 都被称作为znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号:
- 命名服务
- 配置管理
- 集群管理
- 分布式锁
- 队列管理
Zookeeper命名服务
在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现。
Zookeeper的配置管理
程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,
然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,
然后从 Zookeeper 获取新的配置信息应用到系统中就好。
tickTime=2000 dataDir= /zookeeper-3.4.8/data dataLogDir=/zookeeper-3.4.8/logs clientPort=2181 server.1=IP1:2888:3888 server.2=IP2:2888:3888
参数说明:
tickTime: zookeeper中使用的基本时间单位, 毫秒值.
dataDir: 数据目录. 可以是任意目录.
dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和#dataDir相同的设置.
clientPort: 监听client连接的端口号.
server.id=host:port:port解析.
每一行此配置表示一个集群中的一台服务器。其中id为Server ID,用来标识该机器在集群中的编号。同时,在所在服务器的数据目录(/tmp/zookeeper)下创建一个myid文件,该文件只有一行内容,并且是一个数字,就是对应每台服务器的Server ID数字。
比如server.1=IP1:2888:3888的myid中的内容就是1。不同服务器的ID需要保持不同,并且和zoo.cfg文件中server.id中的id和myid文件的内容保持一致。id的取值范围为1~255。
其中,server.id中配置参数的第一个port是集群中其他机器与Leader之间通信的端口,第二个port为当Leader宕机或其他故障时,集群进行重新选举Leader时使用的端口。
按照以上相同步骤,配置集群中的其他机器。每个集群的zoo.cfg文件都是相同的,可通过版本控制或其他工具保证每台zookeeper服务器的配置文件相同。集群中每台机器唯一不同的是server.id对应的myid文件中的数字不同,需要注意的是一般zookeeper集群由3~5台服务器组成,即2n+1台机器。
详细的客户端命令:https://zhuanlan.zhihu.com/p/...
Dubbo简介
Dubbo是阿里旗下的一个弹性的分布式服务框架,2012 年,阿里巴巴在 GitHub上开源了基于 Java的分布式服务治理框架 Dubbo,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
Dubbo透明化的远程方法调用,没有API侵入,就能像调用本地方法一样调用远程方法,软负载均衡及容错机制,可以在内网替代F5等硬件负载均衡器,降低成本,减少单点。
服务框架中,与业务相关,但与业务功能的整合无关的组件以外部服务形式引入(也就是说把一些业务分离出来,变成一种服务,供其他人调用该服务)。
调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Zookeeper+dubbo:
Dubbo的将注册中心进行抽象,是得它可以外接不同的存储媒介给注册中心提供服务,有ZooKeeper,Memcached,Redis引入了ZooKeeper作为存储媒介,也就把ZooKeeper的特性引进来。首先是负载均衡,单注册中心的承载能力是有限的,在流量达到一定程度的时候就需要分流,负载均衡就是为了分流而存在的,一个ZooKeeper群配合相应的Web应用就可以很容易达到负载均衡;资源同步,单单有负载均衡还不够,节点之间的数据和资源需要同步,ZooKeeper集群就天然具备有这样的功能;命名服务,将树状结构用于维护全局的服务地址列表,服务提供者在启动的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自己的URL地址,这个操作就完成了服务的发布。其他特性还有Mast选举,分布式锁等。
相关代码:
spring
Pom.xml
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.20.0-GA</version> </dependency>
Applicationcontext.xml
<dubbo:annotation package="com.bbs.service"/> <dubbo:application name="bbs"/> <dubbo:registry address="zookeeper://localhost:2181"/> <dubbo:protocol port="1213"></dubbo:protocol> <dubbo:consumer check="false" timeout="50000"></dubbo:consumer> <dubbo:provider timeout="50000"></dubbo:provider>
springboot
Pom.xml
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.4.10</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>io.dubbo.springboot</groupId> <artifactId>spring-boot-starter-dubbo</artifactId> <version>1.0.0</version> </dependency>
Application.properties
spring.dubbo.application.name=bootsec spring.dubbo.registry.address=zookeeper://localhost:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=3100 spring.dubbo.scan=com.emsoft.studentboot
服务端代码
#dubbo配置 spring.dubbo.application.name=bootthr spring.dubbo.registry.address=zookeeper://192.168.31.119:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=3200 spring.dubbo.scan=com.emsoft.stuthr.server 业务代码所在的包名 spring.dubbo.application.registries.timeout=10000 spring.dubbo.application.registries.session=10000
客户端代码
spring.dubbo.application.name=bootsec spring.dubbo.registry.address=zookeeper://localhost:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=3100 spring.dubbo.scan=com.emsoft.studentboot