一、服务注册中心介绍

  分布式服务框架部署在多台不同的机器上。例如服务A是订单相关的处理服务,服务B是订单的客户的相关信息服务。此时有个需求需要在服务A中获取订单客户的信息。如下图:

此时就面临以下几个问题:

  1、集群A中的服务调用者如何发现集群B中的服务提供者。

  2、集群A中的服务调用者如何选择集群B中的某一台服务提供者去调用。

  3、集群B中某台机器下线,集群A怎么避免下次调用不在使用这台掉线的机器?

  4、集群B提供的某个服务如何获知集群A中哪些机器正在消费该服务?

以上问题就需要通过注册中心来解决。

  首先在服务启动的时候,将服务提供者信息主动上报到服务注册中心进行服务注册。服务调用者启动的时候,将服务提供或者信息从注册中心下拉倒服务调用者本机缓存。当需要调用服务时,从本地缓存列表中找到服务提供者的地址列表,基于某种负载均衡策略(随机、轮询等)选择一台服务器发起远程调用。ZooKeeper就是实现这些功能的分布式协调服务。

二、ZooKeeper介绍

  ZooKeeper是由雅虎开发并开源的分布式协调服务。ZooKeeper提供了统一命名服务、配置管理、分布式锁等基础服务,基于这些基础服务,我们可以实现集群管理、软负载、发布/订阅、命名服务等功能。

  ZooKeeper维护着一种像文件系统的一种结构树。如下图:

图中每个都是一个节点(ZNode),节点可以包含数据,也可以没有,每个节点都有自己的权限。如上图,127.0.0.1:5000提供服务 GetGustomer。127.0.0.1:5002提供Order和GetOrder服务。服务发现就是将服务提供者信息主动上报到服务注册中心进行服务注册,如将其提供的服务和对应的IP和端口注册到ZooKeeper中,服务调用者启动的时候,将ZooKeeper注册中心信息下拉倒服务调用者本机缓存,到需要用到到某个服务时,通过某种算法,去选择其中一个IP+端口,然后调用。

2.1  Api概述

  reate/path data

    创建一个名为/path的znode节点,并包含数据data。

  delete/path

    删除名为/path的znode。 如果设置为true,我们就可以通过我们创建ZooKeeper句柄时所设置的Watcher对象得到事件,同时另一个版本的方法提供了以Watcher对象为入参,通过这个传入的对象来接收变更的事件

  exists/path

    检查是否存在名为/path的节点。

  setData/path data

    设置名为/path的znode的数据为data。

  getData/path

    返回名为/path节点的数据信息。

  getChildren/path

    返回所有/path节点的所有子节点列表。

  需要注意的是,ZooKeeper并不允许局部写入或读取znode节点的数据。当设置一个znode节点的数据或读取时,znode节点的内容会被整个替换或全部读取进来。

2.2 节点类型

  当新建znode时,还需要指定该节点的类型,不同的类型决定了znode节点的行为方式。节点类型分为4种:持久性、临时性、持久有序、临时有序节点。

  持久节点:可以通过持久类型的znode为应用保存一些数据,即使znode的创建者不再属于应用系统时,数据也可以保存下来而不丢失。持久的znode,如/path,只能通过调用delete来进行删除。

  临时节点:当创建该节点的客户端崩溃或关闭了与ZooKeeper的连接时,这个节点就会被删除。并且临时节点不允许有子节点。

  有序节点:一个znode还可以设置为有序节点。一个有序znode节点被分配唯一个单调递增的整数。当创建有序节点时,一个序号会被追加到路径之后。

2.3 版本号

  每一个znode都有一个版本号,它随着每次数据变化而自增。两个API操作可以有条件地执行:setData和delete。这两个调用以版本号作为转入参数,只有当转入参数的版本号与服务器上的版本号一致时调用才会成功。

三、Windows安装

  3.1 准备

    到ZooKeeper官网下载,下载地址为:https://zookeeper.apache.org/releases.html#download。 由于ZooKeeper需要JDK,所以还要下载JDK,然后需要配置系统的环境变量"JAVA_HOME"(名称需要完全一致),其值为JDK的文件夹所在路径。

  3.2 介绍

    Bin文件目录:以.sh结尾的脚本运行在UNIX平台,以.cmd结尾的脚本则用于Windows。

   Conf目录:保存配置文件。(zoo.cfg是默认配置。)

    Lib目录:包含了java的JAR文件,它们是运行ZooKeeper需要的第三方文件。

  3.3 配置

    Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。

  • tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • dataLogDir:顾名思义就是 Zookeeper 保存日志文件的目录
  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

    修改zoo.cfg文件内容为:

tickTime=

initLimit=

syncLimit=

dataDir=D:\\Software\\ZooKeeper\\data

clientPort=

  启动zookeeper服务,到/bin文件夹下,用命令行运行 zkService.cmd命令。看到Starting servicer 并且没有报错就说明启动成功。

接下来启动客户端,到/bin文件夹下,用命令行运行 zkCli.cmd命令.

3.4 用命令操作节点

  在客户端通过 ls / 命令查看节点:

[zk: localhost:2181(CONNECTED) 1] ls /
[MyApp, zookeeper]
[zk: localhost:2181(CONNECTED) 2] ls /zookeeper
[quota]
[zk: localhost:2181(CONNECTED) 3]

  创建节点:create [-s] [-e] path data acl

  path:路径

  data:节点的数据

  acl:权限

  -e:表示临时节点

  -s:表示顺序节点

[zk: localhost:(CONNECTED) ] create -e /Microheart MH
Created /Microheart
[zk: localhost:(CONNECTED) ] ls /
[MyApp, zookeeper, Microheart] 这里创建的是临时节点,如果当前客户端关闭,则此节点就会消失。

  删除节点:

[zk: localhost:(CONNECTED) ] delete /Microheart
[zk: localhost:(CONNECTED) ] ls /
[MyApp, zookeeper]

这篇文章主要是对ZooKeeper的初步了解和认识,使用命令去操作节点,下篇文章写两个微服务,将微服务注册到ZooKeeper中,使用随机算法,实现微服务之间的调用。

如果你觉得写得还行,请点个推荐!

服务注册中心之ZooKeeper系列(一)的更多相关文章

  1. 服务注册中心之ZooKeeper系列(二) 实现一个简单微服务之间调用的例子

    上一篇文章简单介绍了ZooKeeper,讲了分布式中,每个微服务都会部署到多台服务器上,那服务之间的调用是怎么样的呢?如图: 1.集群A中的服务调用者如何发现集群B中的服务提供者呢? 2.集群A中的服 ...

  2. 服务注册中心之ZooKeeper系列(三) 实现分布式锁

    通过ZooKeeper的有序节点.节点路径不回重复.还有节点删除会触发Wathcer事件的这些特性,我们可以实现分布式锁. 一.思路 zookeeper中创建一个根节点Locks,用于后续各个客户端的 ...

  3. [源码阅读] 阿里SOFA服务注册中心MetaServer(1)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 0x00 摘要 0x01 服务注册中心 1.1 服务注册中心简 ...

  4. [源码阅读] 阿里SOFA服务注册中心MetaServer(2)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 0x00 摘要 0x01 MetaServer 注册 1.1 ...

  5. [源码阅读] 阿里SOFA服务注册中心MetaServer(3)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 0x00 摘要 0x01 概念 1.1 分布式一致性 1.2 ...

  6. 服务注册中心Eureka vs Zookeeper vs Consul

    前言 在现在云计算和大数据快速发展的今天,业务快速发展和变化.我们以前的单一应用难以应对这种快速的变化, 因此我们需要将以前单一的大应用不断进行差分,分成若干微小的应用或者服务,这就是微服务的思想.但 ...

  7. 基于ZooKeeper的服务注册中心

    本文介绍基于ZooKeeper的Dubbo服务注册中心的原理. 1.ZooKeeper中的节点 ZooKeeper是一个树形结构的目录服务,支持变更推送,因此非常适合作为Dubbo服务的注册中心. 注 ...

  8. 作为服务注册中心,Eureka比Zookeeper好在哪里

    CAP是Consistency.Availablity和Partition Tolerance的缩写.一般的分布式系统最多满足其中两条.而Partition Tolerance是分布式系统的关键,因此 ...

  9. 学习一下 SpringCloud (二)-- 服务注册中心 Eureka、Zookeeper、Consul、Nacos

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

随机推荐

  1. copy与mutableCopy的区别总结

    1.不可变类型(不管是集合还是非集合),copy结果,不产生新对象,浅拷贝:不可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝.2.可变类型(不管是集合还是非集合),c ...

  2. Docker安装ngnix使用ping报错

    最近在学习docker时,由于docker维护的dockerHub远程仓库的镜像文件比普通的文件小得多,所以经常碰到的情况是,一般常用的命令,会出现no command的情况.今天安装ping的时候就 ...

  3. 如何解决PeopleSoft Process Scheduler发布问题

    常见PeopleSoft进程调度程序发布问题 此发布问题中遇到的一些常见错误是: 将HTTP响应转换为UCS2时出错 XML文档对象创建失败. 无法处理来自Report Repository的HTTP ...

  4. ionic-基于angularjs实现的多级城市选择组件

    大家都知道在移动端的选择地区组件,大部分都是模拟IOS选择器做的城市三级联动,但是在IOS上比较好,在Android上因为有的不支持ion-scroll.所以就会出现滚动不会自动回滚到某一个的正中间. ...

  5. 微信小程序中的AJAX——POST,GET区别

    注意:发送服务器时的DATA 最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String .转换规则如下: 对于 GET 方法的数据,会将数 ...

  6. Springboot 拦截器 依赖注入失败

    解决方案2种. ====1 https://blog.csdn.net/shunhua19881987/article/details/78084679 ====2 https://www.cnblo ...

  7. ubuntu解压时中文出现乱码

    一.乱码类似这样的:╫╩┴╧╖┤╤▌▓т╒╛╦┘╢╚│ 今天遇到需要上传十几G的图片,在wins上压缩成zip格式,在上传到服务器上,结果出现乱码.然后各种百度心塞. 最初查到原因: 这个主要是因为z ...

  8. linux下SS 网络命令详解

    ss命令用来显示处于活动状态的套接字信息. ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容. 但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比n ...

  9. C语言面试题分类->回调

    本文主要讲解如果实现回调,特别是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此 ...

  10. 老司机带路:《axios从入门到开车 嘀嘀~~》

    前言:axios vue.axios 跨域.axios.js.axios get.axios post.axios中文文档 之前当vue更新到2.0之后,作者就宣告不再对vue-resource更新, ...