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

视频资源获取失败

开篇词 | 别老想着怎么用好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 里面的应用。

如果我问你,你知道动态代理吗? 你可能会如数家珍般地告诉我动态代理的作用以及好处。那我现在接着问你,你在项目中用过动态代理吗?这时候可能有些人就会犹豫了。那我再换一个方式问你,你在项目中有实现过统一拦截的功能吗?比如授权认证、性能统计等等。你可能立马就会想到,我实现过呀,并且我知道可以用 Spring 的 AOP 功能来实现。

没错,进一步再想,在 Spring AOP 里面我们是怎么实现统一拦截的效果呢?并且是在我们不需要改动原有代码的前提下,还能实现非业务逻辑跟业务逻辑的解耦。这里的核心就是采用动态代理技术,通过对字节码进行增强,在方法调用的时候进行拦截,以便于在方法调用前后,增加我们需要的额外处理逻辑。

那话说回来,动态代理跟 RPC 又有什么关系呢?

远程调用的魔法

我说个具体的场景,你可能就明白了。

登录 后留言

全部留言(43)

  • 最新
  • 精选
雨霖铃声声慢
如果没有动态代理帮我们完成方法调用拦截,那么就需要使用静态代理来实现,就需要用户对原始类中所有的方法都重新实现一遍,并且为每个方法附加相似的代码逻辑,如果在RPC中,这种需要代理的类有很多个,就需要针对每个类都创建一个代理类。

作者回复: 很棒

2020-03-01
2
36
楼下小黑哥
没有动态代理的情况下,最简单的情况, 服务消费者将类信息序列化---》按照协议拼接报文----》调用网络程序发送报文----》收到提供者返回信息----》根据协议解析出返回信息-----》再反序列化成返回结果。 上面每一步都挺复杂的,RPC 框架使用动态代理帮我们屏蔽这种细节。

作者回复: 很棒

2020-03-06
15
hello
Byte Buddy,老师这个后起之秀,是怎么完成动态代理的,能否剖析下,多谢!

作者回复: 相比于其他框架,其API还是很简单的。举个例子:Class<? extends T> clazz = BYTE_BUDDY.subclass(clz) .method(ElementMatchers.isDeclaredBy(clz)) .intercept(MethodDelegation.to(new ByteBuddyInvocationHandler(invoker))) .make() .load(classLoader, ClassLoadingStrategy.Default.INJECTION) .getLoaded(); try { return clazz.newInstance(); } catch (Exception e) { throw new ProxyException("Error occurred while creating bytebuddy proxy of " + clz.getName(), e); }

2020-02-28
14
tongmin_tsai
老师,可以理解为,动态代理生成的类,就是stub吗?

作者回复: 作用是一样的

2020-04-26
5
番茄炒西红柿
为什么不用静态代理?aspectJ之类的。提前把代理类在编译的时候创建?

作者回复: 理论上编译期创建是可以的,但实际问题就是怎么确定哪些需要创建呢

2020-04-08
3
wusiration
如果没有动态代理完成方法拦截,那么被调用方需要有调用方的接口实现,就失去了面向接口编程的意义

作者回复: 很棒

2020-02-28
4
3
每天晒白牙
如果没有动态代理类帮我们完成方法调用拦截,需要用户自己加入远程调用的逻辑,这样就麻烦,且使用不方便了

作者回复: 是的,动态代理让用户API调用透明

2020-02-28
3
3
阿卧
从动态代理的原理和特点出发。动态代理帮我们生成代理类,屏蔽具体实现细节,在代理方法前实现统一封装。 如果没有动态代理,就需要手动实现每个接口类的远程调用细节了。 被面试官问到这个问题,没有回答上来...

作者回复: 现在可以了

2020-03-16
2
Json Dumps
看到过,GRPC,通过proto接口,生成了客户端静态代理代码。 与动态代理相比,接口变化除了更新接口文件,还要重新生成静态代理代码,并更新。 为什么非要动态代理呢?优点是什么?

作者回复: 动态代理可以面向接口编程

2020-03-02
2
Jackey
动态代理真是个神奇的技术,没有它的话用户就得自己写远程调用的实现了。 ps:SpringAOP也无从谈起了

作者回复: 是的

2020-03-01
2
收起评论