[译] 服务发现在微服务架构中的意义
source link: https://mp.weixin.qq.com/s/zr65O0T19muXTM3zwLSW-w?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
http://allenlsy.com/service-discovery
你如果想和你所有的朋友失去联系,最简单的办法就是换个电话号码,然后不通知任何人。
在微服务架构中也一样,如果一方换了 IP 地址,其他 service 就找不到它了。
Service discovery 的作用,就是帮忙在网络中寻找 service 。
为什么需要 service discovery
如果网站的架构都是在物理主机的基础上搭建的,那么配置、IP 地址,在多数时候都是相对稳定不变的。
但如果 app 在云端,因为 service 会经历重启、崩溃、伸缩,所以很多 service 都是使用动态的 IP。那么手动再来配置每台服务器就不方便了。
Service discovery 的组成
它由3部分组成:
-
service registry,维护一个列表,存储各个 service 的位置信息
-
service provider 提供服务。服务开始时把自己 register 到 registry 上。服务断线时 de-register 。
-
service consumer 使用其他服务。它需要从 registry 获取其他服务的位置
Service discovery 的设计
其实我们需要做的就是维护一个 service name -> [ server IPs ] 的 hash table。注意这里使用的是 server IPs 集合,因为一个 service 可能由很多太 server 提供。
当需要获取一个 service IP 时,直接从数组中随机选择一个即可。
这样的话,用一个 redis 都可以实现一个简单的 service discovery。
但这里有以下一些复杂的情况要考虑:
-
service 掉线时,多半不能 de-register 。那么 service discovery 如何知道它掉线了?现在的解决方案是, service discovery 会时不时对 service 做 health check ,比如每5秒一次。如果 service 无法连接,那么就 de-register
-
consumer 是不是每次查询其他 service 都要向询问 register?为了减小 register 的压力,consumer 可以维护一份本地的 provider 位置信息
-
在 2) 的基础上,如果 provider 信息变了,如何通知 consumer?其实实现方法挺多的。1) 如果 consumer 主动更新自己,那么consumer 可以时不时和 registry 同步信息,比如每1分钟一个。这样 registry 压力还是挺大。也可以是只有当 consumer 发现,使用本地提供的信息仍然无法连接 provider 时才向 registry 同步信息。这更像是一个 cache 的设计。 2) 如果 provider 主动更新 consumer,那么可以使用 pub-sub 模式。设计一个message queue,所有 consumer 监听这个queue。provider 位置信息变化时发一个 message,consumer 收到后更新自己。不过这样,每个 consumer 需要多一个 thread 来 listen to queue
-
如何避免 registry 的 single point of failure?使用分布式系统来实现 registry ,比如 zookeeper / etcd / consul
另一种实现方法,是使用 client-side discovery ,从客户端的角度实现 discovery。每一个客户端都有一份 provider 的位置信息,由客户端来实现 load balance 。Airbnb 的 SmartStack 和 Netflix 的 Eureka 就类似这个思路。这个方法有利有弊吧。
Netflix 的 Eureka:https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication
Recommend
-
147
思索了这两个问题良久,也去知乎找了一些相关话题的问答,但并没有标准答案。所以,我这里也只是记录一些我对此的看法,也许会随着 RTFSC 阅历的丰富而发生变化,我会记录更新于 github.com/mzlogin/rtf…。 意义 在我看来,阅读源码的意义在于学
-
141
个性化推荐系统(三)---推荐系统意义一点思考 杉枫...
-
66
傅立叶变换的物理意义 Original ya...
-
9
欧雷说:「活着的意义体现在两方面:个体层面,要自由,至少是精神自由;群体层面,对人类社会产生正向影响。如果这两...」 欧雷 发表于 2021-05-06 12:54 活着的意义体...
-
5
AMD Navi 31出现在更新日志,RDNA 3架构显卡准备中
-
2
V2EX › 程序员 现在还有人在搞区块链吗?区块链存在的意义到底是什么?
-
4
分布式协调服务的存在意义 精选 原创 分布式协调服务是分布式应用中不可缺少的...
-
5
V2EX › 程序员 微服务的意义是什么?例如获取商品信息或者处理支付的服务挂了整个商城不照样用不了
-
3
大家想体验RISC-V架构电脑的话,现在可以考虑849元起的Lichee Pi 4A
-
4
解码数据库架构:揭示表结构及其意义 在复杂的
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK