周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

33 | 服务发现如何做到持续维护服务地址在动态运维中的时效性?

你好,我是周志明。
前面的两节课,我们已经学习了与分布式相关的算法和理论,掌握了一致性、共识、Paxos 等共识算法,为了解分布式环境中的操作共享数据打好了理论基础。那么从这一讲开始,我们就来一起了解下,在使用分布式服务构造大型系统的过程中,都可能会遇到哪些问题,以及针对这些问题,都可以选择哪些解决方案。
好,那在正式开始学习之前呢,让我们先来思考一个问题:为什么在微服务应用中,需要引入服务发现呢?它的意义是什么?

服务发现解耦对位置的依赖

事实上,服务发现的意义是解耦程序对服务具体位置的依赖,对于分布式应用来说,服务发现不是可选项,而是必须的。
要理解分布式中的服务发现,那不妨先以单机程序中的类库来类比,因为类库概念的普及,让计算机实现了通过位于不同模块的方法调用,来组装复用指令序列的目的,打开了软件达到更大规模的一扇大门。无论是编译期链接的 C/CPP,还是运行期链接的 Java,都要通过链接器(Linker),把代码里的符号引用转换为模块入口或进程内存地址的直接引用。
而服务概念的普及,让计算机可以通过分布于网络中的不同机器互相协作来复用功能,这是软件发展规模的第二次飞跃。此时,如何确定目标方法的确切位置,便是与编译链接有着等同意义的问题,解决该问题的过程,就被叫做“服务发现”(Service Discovery)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

服务发现在动态运维中的时效性是如何实现的?本文从解耦对位置的依赖出发,阐述了服务发现的重要性,并对服务发现的两种理解进行了比较。文章指出,随着微服务的流行,服务的非正常宕机重启和正常的上下线操作变得更加频繁,传统的基础设施已经无法满足服务变动的需求。因此,文章介绍了ZooKeeper、Eureka、Consul和Nacos等服务发现框架的发展历程,以及它们的功能和特点。最后,文章提到了云原生时代对基础设施和网络协议层面的要求,以及服务发现的三个关键子问题。 本文详细介绍了服务发现的三大功能问题:服务的注册、维护和发现。服务注册中心在整个系统中扮演着特殊的角色,作为其他所有服务直接依赖的基础服务,其可用性对整个系统至关重要。在服务发现框架的选择上,文章提到了AP和CP两种取舍,以及不同的实现形式对系统的可用性和可靠性的影响。 通过本文的总结,读者可以快速了解服务发现的重要性,不同服务发现框架的发展历程和特点,以及在选择服务发现框架时需要考虑的AP和CP取舍,为读者提供了指导和参考。 在微服务架构中,服务发现是将固定的代表服务的标识符转化为动态的真实服务地址,并持续维护这些地址在动态运维过程中的时效性。为了完成这个目标,服务发现需要解决注册、维护和发现三大功能问题,并且需要妥善权衡分布式环境下一致性与可用性之间的矛盾,由此派生出了以DNS、专有服务等不同形式,AP和CP两种不同权衡取向的实现方案。 欢迎在留言区分享你的思考和见解。如果你觉得有收获,也欢迎把今天的内容分享给更多的朋友。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 樊野
    老师您好!我们原有的应用是使用zookeeper来做服务发现的,随着应用向k8s迁移,目前纠结是继续使用zk做服务发现,还是该用k8s的DNS机制来做服务发现,想请教一下老师这两种方案的考量。

    作者回复: 没有具体场景的话,这个比较很难言之有物。 zk和dns各自的优势在文章中多提到了,你可以自己把握一下。如果只说一个大方向的话,我的意见是如无必要,勿增实体。如果向k8s迁移是既定的方案,如果k8s的dns能满足需要,那拆除掉zk是值得的,哪怕花费一点测试的成本,在日后的运维中也能找补回来。。

    2021-02-01
    17
  • longslee
    老师您好!恕我愚笨,不知道理解是否有误:我的理解 DNS 只能翻译到 IP 级,那是不是同一个服务只能放不同的 IP 上;而 Eureka 这样的框架,可以在一个 IP 下挂多个进程(端口不一样) ?

    作者回复: 大家最常说的域名查询,没有特定上下文的话,一般是指DNS的A记录和AAAA记录,它们返回的是IPv4\IPV6地址,这个确实是只到IP层面的,但DNS并不只能做到这些,如返回SRV记录,用来标识某台服务器使用了某个服务,这个就可以包含端口。

    2021-02-23
    2
    15
  • neohope
    感觉其实要解决的问题并不一样: 1、基于DNS,其实要解决的问题是流量的流向,可以做到流量监控,但无法管理到具体业务,功能简单,效率更高;正好符合K8S的需要; 2、服务发现框架,其实是深入到业务层面,在应用框架集成、业务监听支持、健康检查、服务保护等功能。而且基于业务需求,进一步提供配置管理、环境管理等、多数据中心管理、业务紧密结合的功能; 有点像前面说的四层负载和七层负载的意思。 一个功能简单,效率高花头少;一个功能复杂,效率低可发挥空间更大;
    2021-04-05
    15
  • 大力水手Jerry
    “Consul 采用的是Raft 协议,要求多数派节点写入成功后,服务的注册或变动才算完成,这就严格地保证了在集群外部读取到的服务发现结果一定是一致的”好像有点问题,首先“在集群外部读取到的服务发现结果一定是一致的”指的是强一致性,但consul实际提供了三种一致性模式。 其次所有分布式共识算法从集群内部看,我理解应该都是异步且弱一致的。要想给外界强一致的感觉,必须在共识机制之上增加额外的限制条件,比如W+R>N,相当于牺牲读的速度,保证强一致性。 再次,CAP中的C是linearizability,如果我们把服务注册与发现系统视为一个黑盒,将客户发起请求操作的先后顺序作为语义正确性条件,那么它实际是一个sequential consistency,我觉得中文世界有很多对CAP的错误理解和过度使用。如果将外部的强弱一致性与内部一致性/共识的具体实现分开讲,这样会更简单清晰。AP和CP真把我看迷糊了。。
    2021-04-12
    4
  • zhanyd
    ZooKeeper、Doozerd、Etcd、SkyDNS、CoreDNS、Eureka、Consul、Necos 仅仅一个服务发现就有这么种方案,真是百家争鸣,好不热闹。 不过这么多方案,对新人来说也太不友好了,光听这么多名字就快把我劝退了,会不会有个带头大哥出来统一江湖呢?
    2021-02-01
    4
  • Jxin
    1.DNS无法及时感知服务集群的增减变动。 2.DNS由于多级缓存的问题应该是不适合服务发现的场景的。如果必须要有DNS的参与,感觉得在DNS后面挂一层负载均衡器集群,负责完成时效性更好的服务发现功能。链路就变成请求->DNS->负载均衡器->服务集群。多一跳,也别扭。
    2021-02-10
    2
  • Zhi Liu
    DNS的问题应该是TTL和多级缓存。公司实际应用过程中是DNS返回负载均衡器的地址,负载均衡器再负责分派到服务。一次一台负载均衡器背后的服务在部署的时候被暂停了导致所有发送到这个负载均衡器的http request 都失败,我们把这个负载均衡器的IP从DNS中删除,但是并没有作用,因为IP已经在多级缓存中了。 我没用过consul或者其他的框架和工具,但是应该可以避免DNS协议的这个缺点。
    2023-08-22归属地:美国
    1
  • lecury
    consul相对于DNS来说, 1)优势:它以服务为主体提供了服务信息查询、注册、健康检查等众多管理工具,功能较为强大,也提供了WebUI界面。 2)劣势:对于轻量级、低延迟要求业务场景下,有一些较高的管理成本。
    2022-11-18归属地:上海
    1
  • 静心
    最后的问题是个好问题啊。
    2021-11-23
    1
  • hillwater
    dns相比框架集成,我倾向于后者,后者性能高、功能丰富、开发量小,包括长链接加持,元数据管理,web UI,微服务治理功能;dns尽管透明,但是周边隐藏开发量很高
    2023-08-22归属地:浙江
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部