为了讲清楚Zookeeper周末手绘了11张图.docx
《为了讲清楚Zookeeper周末手绘了11张图.docx》由会员分享,可在线阅读,更多相关《为了讲清楚Zookeeper周末手绘了11张图.docx(10页珍藏版)》请在第一文库网上搜索。
1、为了讲清楚Zookeeper周末手绘了 11张图对微服务稍有了解的小伙伴应该都听说过Zookeeper,我们来看看在官网上是如何介绍的:Zookeeper是一个分布式的、开源的分布式应用程序协调服务。作为一个协调服务,常常用来配合其他中间件来用,比如:Dubbo + Zookeeper,Hadoop + Zookeeper等,Zookeeper可以实现:服务注册发现、分布式锁、配置中心等功能。今天我们重点来学习一下Zookeeper是如何实现服务注册发现的。分布式带来的问题先正式介绍Zookeeper之前,我们先引入一个业务场景:订单服务需要调用用户服务的接口。要实现这个功能非常简单,我们只需
2、要知道用户服务的ip和port就可以了。突然有一天,用户数量激增,用户服务扛不住了,这个时候只能进行扩容,多部署几个实例,这个时候问题就来了,订单服务该调用哪个用户服务的实例?最简单的办法就是在订单服务中配置所有的用户服务实例,然后使用某种算法(比如说轮询)从配置列表中选择一个就可以了。看似问题解决了,其实隐患很大:用户服务的实例数会根据负载进行动态调整,每次调整完都要更新配置列表,非常麻烦,也容易出错。某些服务实例down掉了,如果没来得及从配置列表中清除掉,就会造成调用者请求接口报错。如何解决呢?往往解决这类分布式问题都需要一块公共的区域来保存这些信息。用Redis解决需要一块公共的区域保
3、存这些信息,那利用Redis是否可以实现?每个服务实例启动之后都向Redis注册信息,停止时也从Redis中删除数据。存放在Redis中的信息简单来说就是服务实例的ip + port,订单服务需要调用用户服务时直接从Redis中获取即可。简单流程如下图所示:每次调用的时候都去Redis查询一次,频繁的查询可能会导致性能瓶颈,为了解决这个问题我们可以在查询之后在本地缓存一份数据,这样每次调用可以优先从本地获取数据。但这样又会出现新的问题,本地缓存如何刷新呢,如果服务提供者某些实例down掉了或者扩容新增了一批实例,那服务消费者如何才能快速感知到呢?要想解决这个问题,最先想到的一个办法就是让服务消
4、费者定时轮询Redis,发现有更新了就去更新本地缓存,看起来也能解决本地缓存刷新的问题,但是多久轮询一次呢,1秒或者10秒?轮询时间太短依然有性能瓶颈问题,这样本地缓存也没有存在的必要了;轮询时间太长,本地缓存来不及更新,就会存在脏数据。以上的方案都不完美,并且不优雅,主要有以下儿点:基于定时任务会导致很多无效的查询。定时任务存在周期性,没法做到实时,这样就可能存在请求异常。如果服务被强行kill,没法及时清除Redis,这样这个看似可用的服务将永远不可用!所以我们需要一个更加靠谱的解决方案。用Zookeeper解决用过Dubbo的小伙伴对这张图肯定很熟悉,步骤0到4是服务注册发现的核心流程。
5、4. invoke2. subscribe / 3. notify:0. start这个流程与我们上面讨论的不谋而合,那Dubbo是如何实现的呢?实际上Dubbo作为一个通用的框架提供了多种解决方案,如:Zookeeper、Nacos等。不管是哪种方案,总结起来都是一种套路,基本流程如下:每个服务实例启动之后将自己的信息(ip+port)写入公共区域;调用者订阅自己感兴趣的服务实例,获取服务实例信息列表后缓存在自己本服务实例停止或者down调后将公共区域自己的信息清除掉;公共区域通知调用者你感兴趣的信息已经发生变更,请更新一下本地的缓Zookeeper的重点特性(1)树状目录结构Zookeep
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 为了 清楚 Zookeeper 周末 手绘 11