zookeeper+dubbo实现java分布式服务

ZooKeeper简介

ZooKeeper(Zookeeper 下载地址)是一个分布式的,开放源码的分布式应用程序协调服务,是 Apache Hadoop 的一个子项目,是Google的Chubby一个开源的实现,主要是用来解决分布式应用中常常遇到的一些数据管理问题,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操做。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户.
每一个子目录项如 NameService 都被称做为znode,和文件系统同样,咱们可以自由的增长、删除znode,在一个znode下增长、删除子znode,惟一的不一样在于znode是能够存储数据的。
客户端与zookeeper断开链接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号:html

  1. 命名服务
  2. 配置管理
  3. 集群管理
  4. 分布式锁
  5. 队列管理

Zookeeper命名服务

在zookeeper的文件系统里建立一个目录,即有惟一的path。在咱们使用tborg没法肯定上游程序的部署机器时便可与下游程序约定好path,经过path即能互相探索发现。java

Zookeeper的配置管理

程序老是须要配置的,若是程序分散部署在多台机器上,要逐个改变配置就变得困难。如今把这些配置所有放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,
而后全部相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每一个应用程序就会收到 Zookeeper 的通知,
而后从 Zookeeper 获取新的配置信息应用到系统中就好。node

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/...git

Dubbo简介

Dubbo是阿里旗下的一个弹性的分布式服务框架,2012 年,阿里巴巴在 GitHub上开源了基于 Java的分布式服务治理框架 Dubbo,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
Dubbo透明化的远程方法调用,没有API侵入,就能像调用本地方法同样调用远程方法,软负载均衡及容错机制,能够在内网替代F5等硬件负载均衡器,下降成本,减小单点。
服务框架中,与业务相关,但与业务功能的整合无关的组件之外部服务形式引入(也就是说把一些业务分离出来,变成一种服务,供其余人调用该服务)。github

调用关系说明:算法

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册本身提供的服务。
  3. 服务消费者在启动时,向注册中心订阅本身所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,若是有变动,注册中心将基于长链接推送变动数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,若是调用失败,再选另外一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Zookeeper+dubbo:

Dubbo的将注册中心进行抽象,是得它能够外接不一样的存储媒介给注册中心提供服务,有ZooKeeper,Memcached,Redis引入了ZooKeeper做为存储媒介,也就把ZooKeeper的特性引进来。首先是负载均衡,单注册中心的承载能力是有限的,在流量达到必定程度的时候就须要分流,负载均衡就是为了分流而存在的,一个ZooKeeper群配合相应的Web应用就能够很容易达到负载均衡;资源同步,单单有负载均衡还不够,节点之间的数据和资源须要同步,ZooKeeper集群就自然具有有这样的功能;命名服务,将树状结构用于维护全局的服务地址列表,服务提供者在启动的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入本身的URL地址,这个操做就完成了服务的发布。其余特性还有Mast选举,分布式锁等。 spring

相关代码:
spring
Pom.xmlapache

<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.xmlspringboot

<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
相关文章
相关标签/搜索