RPC 实战与核心原理
何小锋
京东云混合云首席架构师
41883 人已学习
新⼈⾸单¥59
课程目录
已完结/共 29 讲
RPC 实战与核心原理
登录|注册
留言
65
收藏
沉浸
阅读
分享
手机端
回顶部
付费课程,可试看

视频资源获取失败

开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
07 | 架构设计:设计一个灵活的RPC框架
08 | 服务发现:到底是要CP还是AP?
09 | 健康检测:这个节点都挂了,为啥还要疯狂发请求?
10 | 路由策略:怎么让请求按照设定的规则发到不同的节点上?
11 | 负载均衡:节点负载差距这么大,为什么收到的流量还一样?
12 | 异常重试:在约定时间内安全可靠地重试
13 | 优雅关闭:如何避免服务停机带来的业务损失?
14 | 优雅启动:如何避免流量打到没有启动完成的节点?
15 | 熔断限流:业务如何实现自我保护?
16 | 业务分组:如何隔离流量?
答疑课堂 | 基础篇与进阶篇思考题答案合集
17 | 异步RPC:压榨单机吞吐量
18 | 安全体系:如何建立可靠的安全体系?
19 | 分布式环境下如何快速定位问题?
20 | 详解时钟轮在RPC中的应用
21 | 流量回放:保障业务技术升级的神器
22 | 动态分组:超高效实现秒级扩缩容
23 | 如何在没有接口的情况下进行RPC调用?
24 | 如何在线上环境里兼容多种RPC协议?
结束语 | 学会从优秀项目的源代码中挖掘知识
加餐 | 谈谈我所经历过的RPC
加餐 | RPC框架代码实例详解
本节摘要

你好,我是何小锋。在上一讲中,我讲了“怎么设计一个灵活的 RPC 框架”,总结起来,就是怎么在 RPC 框架中应用插件,用插件方式构造一个基于微内核的 RPC 框架,其关键点就是“插件化”。

今天,我要和你聊聊 RPC 里面的“服务发现”在超大规模集群的场景下所面临的挑战。

为什么需要服务发现?

先举个例子,假如你要给一位以前从未合作过的同事发邮件请求帮助,但你却没有他的邮箱地址。这个时候你会怎么办呢?如果是我,我会选择去看公司的企业“通信录”。

同理,为了高可用,在生产环境中服务提供方都是以集群的方式对外提供服务,集群里面的这些 IP 随时可能变化,我们也需要用一本“通信录”及时获取到对应的服务节点,这个获取的过程我们一般叫作“服务发现”。

对于服务调用方和服务提供方来说,其契约就是接口,相当于“通信录”中的姓名,服务节点就是提供该契约的一个具体实例。服务 IP 集合作为“通信录”中的地址,从而可以通过接口获取服务 IP 的集合来完成服务的发现。这就是我要说的 RPC 框架的服务发现机制,如下图所示:

  1. 服务注册:在服务提供方启动的时候,将对外暴露的接口注册到注册中心之中,注册中心将这个服务节点的 IP 和接口保存下来。
  2. 服务订阅:在服务调用方启动的时候,去注册中心查找并订阅服务提供方的 IP,然后缓存到本地,并用于后续的远程调用。
登录 后留言

全部留言(65)

  • 最新
  • 精选
冰河时代
记得之前在京东的时候,服务挂了,在注册中心上还得要手动删除下死亡节点,如果zk的话,服务没了,就代表会话也没了,临时节点的特性,应该会被通知到呀?为什么还要手动删除呢

作者回复: 临时节点是需要等到超时时间之后才删除的,不够实时。

2020-03-21
4
18
雨霖铃声声慢
如果要能切换流量,那么要服务端配置有权重负载均衡策略,这样服务器端可以通过调整权重来安排流量

作者回复: 很好的思路

2020-03-07
15
🌀Pick Monster 🌀
消息总栈类似一个队列,队列表示是递增的数字,注册中心集群的任何一个节点接收到注册请求,都会把服务提供者信息发给消息总栈,消息总栈会像队列以先进先出的原则推送消息给所有注册中心集群节点,集群节点接收到消息后会比较自己内存中的当前版本,保存版本大的,这种方式有很强的实效性,注册中心集群也可以从消息总栈拉取消息,确保数据AP,个人理解这是为了防止消息未接收到导致个别节点数据不准确,因为服务提供者可以向任意一个节点发送注册请求,从而降低了单个注册中心的压力,而注册和注册中心同步是异步的,也解决了集中注册的压力,在Zookeeper中,因为Zookeeper注册集群的强一致性,导致必须所有节点执行完一次同步,才能执行新的同步,这样导致注册处理性能降低,从而高I/O操作宕机。 以上是我的个人理解,老师给看一下是否正确。 还有一个问题:当集中注册时,消息总栈下发通知给注册中心集群节点,对于单个节点也会不停的收到更新通知,这里也存在高I/O问题,会不会有宕机?

作者回复: 上面理解的很棒。event bus可以改造成主从模式保证高可用

2020-03-07
3
12
楼下小黑哥
服务消费者都是从注册中心拉取服务提供者的地址信息,所以我们要切走某些服务提供者数据,只需要将注册中心这些实例的地址信息删除(其实下线应用实例,实际也是去删除注册中心地址信息),然后注册中心反向通知消费者,消费者受到拉取最新提供者地址信息就没有这些实例了。 老师,提问一个问题:现有开源注册中心是不是还没有消息总线这种实现方式?消息总线有没有开源实现?

作者回复: 通过服务发现来摘除流量是最常见的手段,还可以上下线状态、权重等方式。现成的MQ也是可以充当消息总线来用

2020-03-06
11
松花皮蛋me
路由负载

作者回复: 很棒

2020-03-06
10
南桥畂翊
消息总线策略是啥,老师能指点下么,怎么保证消息总线全局版本递增

作者回复: 最简单的就用时间戳

2020-03-30
8
君言
老师,在AP实现中“两级缓存,注册中心和消费者的内存缓存,通过异步推拉模式来确保最终一致性”能展开讲一下具体实现吗?另外请教下CP可以基于zk实现,AP在业内的实现方式有哪些呢?

作者回复: 推主要实现callback,拉的动作在客户端,像Eurek属于AP

2020-03-06
8
小结一下 1:注册中心的核心作用? 完成服务消费者和服务调用者,两者的路径匹配 2:注册中心的核心指标? 高效、稳定、高可用,使服务消费者及时感知节点的变化 3:路径匹配需要的信息? 服务提供者IP、端口、接口、方法+服务分组别名 服务消费者IP、端口 路径匹配可以把分组别名利用上,即使提供者实例上线,不过由于设置的别名和服务消费者需要的不一致流量也不会打过去,什么时候打过去可以通过配置中心来自由的控制。分组内也是有多个服务提供者的,这里可以再利用相关的负载均衡策略来具体分发流量。

作者回复: 准确👍

2020-05-14
5
阿卧
zookeeper注册中心实现原理 1. 服务平台向zookeeper创建服务目录 2. 服务提供者向zookeeper创建临时节点 3. 服务调用者订阅zookeeper,创建临时节点,拉取服务全量数据,watch服务全部节点数据 4. zookeeper节点发生变化会通知服务调用者 切掉服务流量,只需要将注册中心的配置节点下掉就好了

作者回复: 这还是利用了服务发现

2020-03-06
4
knife
稍微做点压测作为参考,我说的未必是对的,zookeeper写要是zab协议的, 提交要大多数成功才能提交,所以越多节点效率可能越慢,

作者回复: 所以zk有observer

2020-05-14
3
收起评论