RPC实战与核心原理
何小锋
京东技术架构部首席架构师
立即订阅
3914 人已学习
课程目录
已更新 18 讲 / 共 28 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
免费
基础篇 (6讲)
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
进阶篇 (11讲)
07 | 架构设计:设计一个灵活的RPC框架
08 | 服务发现:到底是要CP还是AP?
09 | 健康检测:这个节点都挂了,为啥还要疯狂发请求?
10 | 路由策略:怎么让请求按照设定的规则发到不同的节点上?
11 | 负载均衡:节点负载差距这么大,为什么收到的流量还一样?
12 | 异常重试:在约定时间内安全可靠地重试
13 | 优雅关闭:如何避免服务停机带来的业务损失?
14 | 优雅启动:如何避免流量打到没有启动完成的节点?
15 | 熔断限流:业务如何实现自我保护?
16 | 业务分组:如何隔离流量?
答疑课堂 | 基础篇与进阶篇思考题答案合集
RPC实战与核心原理
登录|注册

08 | 服务发现:到底是要CP还是AP?

何小锋 2020-03-06
你好,我是何小锋。在上一讲中,我讲了“怎么设计一个灵活的 RPC 框架”,总结起来,就是怎么在 RPC 框架中应用插件,用插件方式构造一个基于微内核的 RPC 框架,其关键点就是“插件化”。
今天,我要和你聊聊 RPC 里面的“服务发现”在超大规模集群的场景下所面临的挑战。

为什么需要服务发现?

先举个例子,假如你要给一位以前从未合作过的同事发邮件请求帮助,但你却没有他的邮箱地址。这个时候你会怎么办呢?如果是我,我会选择去看公司的企业“通信录”。
同理,为了高可用,在生产环境中服务提供方都是以集群的方式对外提供服务,集群里面的这些 IP 随时可能变化,我们也需要用一本“通信录”及时获取到对应的服务节点,这个获取的过程我们一般叫作“服务发现”。
对于服务调用方和服务提供方来说,其契约就是接口,相当于“通信录”中的姓名,服务节点就是提供该契约的一个具体实例。服务 IP 集合作为“通信录”中的地址,从而可以通过接口获取服务 IP 的集合来完成服务的发现。这就是我要说的 PRC 框架的服务发现机制,如下图所示:
RPC服务发现原理图
服务注册:在服务提供方启动的时候,将对外暴露的接口注册到注册中心之中,注册中心将这个服务节点的 IP 和接口保存下来。
服务订阅:在服务调用方启动的时候,去注册中心查找并订阅服务提供方的 IP,然后缓存到本地,并用于后续的远程调用。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《RPC实战与核心原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • 每天晒白牙
    今天这个思考题好像是在说负载均衡策略,那是不是可以加个权重,把想下线的ip权重置为0,这样服务调用方就不会调用这个节点了
    2020-03-06
    1
    6
  • 如果要能切换流量,那么要服务端配置有权重负载均衡策略,这样服务器端可以通过调整权重来安排流量

    作者回复: 很好的思路

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

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

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

    作者回复: 很棒

    2020-03-06
    1
  • 阿卧
    zookeeper注册中心实现原理
    1. 服务平台向zookeeper创建服务目录
    2. 服务提供者向zookeeper创建临时节点
    3. 服务调用者订阅zookeeper,创建临时节点,拉取服务全量数据,watch服务全部节点数据
    4. zookeeper节点发生变化会通知服务调用者

    切掉服务流量,只需要将注册中心的配置节点下掉就好了

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

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

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

    2020-03-06
    1
  • 雪域飞鸿
    注册中心的选型可以采用现有的nacos;或者基于gossip协议来搞
    2020-03-26
  • 王大伟
    看了隔壁的分布式协议算法与实战,感觉可以基于gossip协议实现多节点分布式服务注册中心:
    1. 注册中心与服务消费/服务提供节点用netty tcp长连接
    2. 注册中心之间的消息通过gossip协议传播
    3. 注册中心接到消息,看是否需要投递到服务发现/服务提供节点,有需要就投递

    老师,目前有没有较为成熟的gossip开源实现呢?
    2020-03-25
  • 王大伟
    通知rpc调用端限流
    2020-03-24
  • 鸳鸯戏水蝶双飞
    讲的zk这个例子似曾相识,才想起来讲师是京东的。
    2020-03-22
  • 冰河时代
    记得之前在京东的时候,服务挂了,在注册中心上还得要手动删除下死亡节点,如果zk的话,服务没了,就代表会话也没了,临时节点的特性,应该会被通知到呀?为什么还要手动删除呢

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

    2020-03-21
  • kevin
    注册中心作为rpc框架的核心依赖,如果有问题整体的功能会收到影响,其可用性是一个非常重要的指标,所以更加关注AP,那么在进行技术选型时考虑一些支持AP模式的中间件,例如Redis

    作者回复: 不错的主意。

    2020-03-17
  • kevin
    切流方案是控制流量进行路由,可以通过路由控制或者是给服务提供方设置权重达到目的

    作者回复: 想一想有没有更好的办法。

    2020-03-16
  • Sean
    可以给每个节点加一个weight 有服务发现方控制修改 这个weight还可以用来帮助做负载测试和normalize不同的硬件SKU

    老师 请问用AP的方法 怎样可以最快的发现节点消失 比如说crash或长GC

    作者回复: 需要跟rpc来配合,不用注册中心来判断,在调用方来判断。

    2020-03-12
  • etdick
    EURAKA就是AP模型

    作者回复: 是的

    2020-03-12
  • 成熟中的猪
    如文中描述: ZooKeeper 的节点数量特别多,对 ZooKeeper 读写特别频繁,且 ZooKeeper 存储的目录达到一定数量的时候,ZooKeeper 将不再稳定,CPU 持续升高,最终宕机。
    这里有点笼统,是否有量化的压测数据或者实际经验值可以分享?

    作者回复: 这个跟很多因素有关系,比如zk node数,机器内存大小等

    2020-03-09
  • 忆澜
    老师,求解答……我看到这个思考题,第一反应是负载均衡,我看评论很多也是,也得到了老师的肯定,由此我有几个问题
    1.在这种rpc框架中,是不是客户端和注册中心都会有负载均衡?(如果是的话,那这道题答案应该是客户端的吧)如果都有,那他们各自职责怎么明确呢,感觉总会有一些交集?
    2.如果客户端有负载均衡,那这些配置也是存在注册中心上么?如果是的话,比如像题中的摘掉流量,应该是也会有一些延时才退给客户端,对么?

    谢谢老师~

    作者回复: 配置信息由客户端配置,也可由配置中心管理

    2020-03-09
  • wusiration
    负载均衡,将对应节点的流量切为0

    作者回复: 很棒

    2020-03-08
  • Reason
    要把服务流量切走还可以采用客户端服务负载均衡和服务路由的方式。服务路由则采取面向标签的路由方式,根据标签值确定选择访问的服务端实例

    作者回复: 很棒

    2020-03-08
  • 问心
    老师,DNS+负载均衡的灵活性差体现在哪呢。现在负载均衡都提供了接口去注册,配置负载百分比,同时还可以使用http、tcp、udp的健康检查用于自动上下线。是有哪些高级玩法,这样不能用么?

    作者回复: 这样负载均衡自身就有瓶颈,而且很难满足个性需求,比如:分组、路由等

    2020-03-08
收起评论
28
返回
顶部