人肉告知的方式:如果你发现你的服务一台机器不够,要再添加一台,这个时候就要告诉调用者我现在有两个ip了,你们要轮询调用来实现负载均衡;调用者咬咬牙改了,结果某天一台机器挂了,调用者发现服务有一半不可用,他又只能手动修改代码来删除挂掉那台机器的ip。现实生产环境当然不会使用人肉方式。

有没有一种方法能实现自动告知,即机器的增添、剔除对调用方透明,调用者不再需要写死服务提供方地址?当然可以,现如今zookeeper被广泛用于实现服务自动注册与发现功能!

简单来讲,zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(ip+端口)去访问具体的服务提供者。如下图所示:

具体来说,zookeeper就是个分布式文件系统,每当一个服务提供者部署后都要将自己的服务注册到zookeeper的某一路径上: /{service}/{version}/{ip:port}, 比如我们的HelloWorldService部署到两台机器,那么zookeeper上就会创建两条目录:分别为/HelloWorldService/1.0.0/100.19.20.01:16888  /HelloWorldService/1.0.0/100.19.20.02:16888。

zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除,比如100.19.20.02这台机器如果宕机了,那么zookeeper上的路径就会只剩/HelloWorldService/1.0.0/100.19.20.01:16888。

服务消费者会去监听相应路径(/HelloWorldService/1.0.0),一旦路径上的数据有任务变化(增加或减少),zookeeper都会通知服务消费方服务提供者地址列表已经发生改变,从而进行更新。

更为重要的是zookeeper 与生俱来的容错容灾能力(比如leader选举),可以确保服务注册表的高可用性。

最新文章

  1. iOS逆向工程之App脱壳
  2. 玩转 H5 下拉上滑动效
  3. 关于cin,getchar(),scanf()的注意事项(转)
  4. java学习粗略路线
  5. iOS toolbar
  6. Android中通过进程注入技术改动广播接收器的优先级
  7. java使用javamail读取邮箱(收件箱为例)
  8. 第4章 同步控制 Synchronization ----事件(Event Objects)
  9. php设计模式 工厂模式和单例模式
  10. 人脸姿态校正算法 附完整C++示例代码
  11. 数据库常用的事务隔离级别和原理?&&mysql-Innodb事务隔离级别-repeatable read详解
  12. SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差
  13. zookeeper原理与安装
  14. PGP NO_PUBKEY
  15. Python+OpenCV图像处理(十六)—— 轮廓发现
  16. 组队项目,Main队伍
  17. linux内存源码分析 - 页表的初始化
  18. 记一次 mysql 启动没反应
  19. _talent_req
  20. JavaScript初探一

热门文章

  1. Linux下Jenkins与GitHub自动构建Node项目(Vue)
  2. 转 Solr vs. Elasticsearch谁是开源搜索引擎王者
  3. vmware虚拟机安装Windows 7后虚拟机自动挂起
  4. python入门:输出1-10的所有数(自写)
  5. 《Spring源码深度解析》第三章 默认标签的解析
  6. 如何用纯 CSS 创作一个文本淡入淡出的 loader 动画
  7. cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
  8. 9-11.Yii2.0框架控制器分配视图并传参xss攻击脚本视图的过滤
  9. and和or运算
  10. socketserver的使用