冰河技术
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
  • RPC框架介绍

    • 【置顶】这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架
  • 第一篇:整体设计

    • 第01章:开篇,从零开始手撸一个能在实际场景使用的高性能RPC框架
    • 第02章:高性能分布式RPC框架整体架构设计
    • 第03章:RPC服务核心注解的设计与实现
    • 第04章:实现RPC服务核心注解的扫描与解析
  • 第二篇:服务提供者

    • 第05章:服务提供者收发消息基础功能实现
    • 第06章:自定义网络传输协议的实现
    • 第07章:自定义网络编解码的实现
    • 第08章:模拟服务消费者与服务提供者之间的数据交互
    • 第09章:服务提供者调用真实方法的实现
    • 第10章:测试服务提供者调用真实方法
    • 第11章:服务提供者扩展支持CGLib调用真实方法
  • 第三篇:服务消费者

    • 第12章:实现服务消费者与服务提供者直接通信
    • 第13章:服务消费者异步转同步直接获取返回结果
    • 第14章:服务消费者异步转同步的自定义Future与AQS实现
    • 第15章:服务消费者同步、异步、单向调用的实现
    • 第16章:服务消费者回调方法的实现
    • 第17章:服务消费者实现动态代理功能屏蔽构建请求协议对象的细节
    • 第18章:服务消费者整合动态代理实现直接调用接口返回结果数据
    • 第19章:服务消费者动态代理实现异步调用
    • 第20章:服务消费者动态代理扩展优化
  • 第四篇:注册中心

    • 第21章:注册中心基础服务功能的实现
    • 第22章:服务提供者整合注册中心实现服务注册
    • 第23章:服务消费者整合注册中心实现服务发现
  • 第五篇:负载均衡

    • 第24章:服务消费者实现基于随机算法的负载均衡策略
  • 第六篇:SPI扩展序列化机制

    • 第25章:对标Dubbo实现SPI扩展机制的基础功能
    • 第26章:基于SPI扩展JDK序列化与反序列化机制
    • 第27章:基于SPI扩展Json序列化与反序列化机制
    • 第28章:基于SPI扩展Hessian2序列化与反序列化机制
    • 第29章:基于SPI扩展FST序列化与反序列化机制
    • 第30章:基于SPI扩展Kryo序列化与反序列化机制
    • 第31章:基于SPI扩展Protostuff序列化与反序列化机制
  • 第七篇:SPI扩展动态代理机制

    • 第32章:基于SPI扩展JDK动态代理机制
    • 第33章:基于SPI扩展CGLib动态代理机制
    • 第34章:基于SPI扩展Javassist动态代理机制
    • 第35章:基于SPI扩展ByteBuddy动态代理机制
    • 第36章:基于SPI扩展ASM动态代理机制
  • 第八篇:SPI扩展反射机制

    • 第37章:基于SPI扩展JDK反射机制调用真实方法
    • 第38章:基于SPI扩展CGLib反射机制调用真实方法
    • 第39章:基于SPI扩展Javassist反射机制调用真实方法
    • 第40章:基于SPI扩展ByteBuddy反射机制调用真实方法
    • 第41章:基于SPI扩展ASM反射机制调用真实方法
  • 第九篇:SPI扩展负载均衡策略

    • 第42章:基于SPI扩展随机算法负载均衡策略
    • 第43章:基于SPI扩展加权随机算法负载均衡策略
    • 第44章:基于SPI扩展轮询算法负载均衡策略
    • 第45章:基于SPI扩展加权轮询算法负载均衡策略
    • 第46章:基于SPI扩展Hash算法负载均衡策略
    • 第47章:基于SPI扩展加权Hash算法负载均衡策略
    • 第48章:基于SPI扩展源IP地址Hash算法负载均衡策略
    • 第49章:基于SPI扩展源IP地址加权Hash算法负载均衡策略
    • 第50章:基于SPI扩展Zookeeper的一致性Hash算法负载均衡策略
  • 第十篇:SPI扩展增强型负载均衡策略

    • 第51章:基于SPI扩展增强型加权随机算法负载均衡策略
    • 第52章:基于SPI扩展增强型加权轮询算法负载均衡策略
    • 第53章:基于SPI扩展增强型加权Hash算法负载均衡策略
    • 第54章:基于SPI扩展增强型加权源IP地址Hash算法负载均衡策略
    • 第55章:基于SPI扩展增强型Zookeeper一致性Hash算法负载均衡策略
    • 第56章:基于SPI扩展最少连接数负载均衡策略
  • 第十一篇:SPI扩展实现注册中心

    • 第57章:基于SPI扩展实现Zookeeper注册中心
    • 第57-X章:注册中心阶段性作业
  • 第十二篇:心跳机制

    • 第58章:心跳机制交互数据模型设计
    • 第59章:心跳机制增强数据模型与协议解析设计
    • 第60章:服务消费者向服务提供者发送心跳信息并接收心跳响应
    • 第61章:服务消费者心跳间隔时间配置化
    • 第62章:服务提供者向服务消费者发送心跳消息并接收心跳响应
    • 第63章:服务提供者心跳间隔时间配置化
    • 第63-X章:心跳机制阶段性作业
  • 第十三篇:增强型心跳机制

    • 第64章:服务提供者增强型心跳检测机制
    • 第65章:服务消费者增强型心跳检测机制
  • 第十四篇:重试机制

    • 第66章:服务消费者实现服务订阅的重试机制
    • 第67章:服务消费者连接服务提供者的重试机制
  • 第十五篇:整合Spring

    • 第68章:服务提供者整合Spring
    • 第69章:基于Spring XML接入服务提供者
    • 第70章:基于Spring注解接入服务提供者
    • 第71章:服务消费者整合Spring
    • 第72章:基于Spring XML接入服务消费者
    • 第73章:基于Spring注解接入服务消费者
    • 第73章-X:整合Spring阶段作业
  • 第十六篇:整合SpringBoot

    • 第74章:服务提供者整合SpringBoot
    • 第75章:基于SpringBoot接入服务提供者
    • 第76章:服务消费者整合SpringBoot
    • 第77章:基于SpringBoot接入服务消费者
    • 第77章-X:整合SpringBoot阶段作业
  • 第十七篇:整合Docker

    • 第78章:基于Docker接入服务提供者
    • 第79章:基于Docker接入服务消费者
    • 第79章-X:整合Docker阶段作业
  • 第十八篇:整合SpringCloud Alibaba

    • 第80章:整合SpringCloud Alibaba实际项目
    • 第80章-X:整合SpringCloud Alibaba阶段作业
  • 第十九篇:结果缓存

    • 第81章:结果缓存通用模型设计
    • 第82章:服务提供者支持结果缓存
    • 第83章:服务消费者支持结果缓存
    • 第83章-X:结果缓存阶段作业
  • 第二十篇:路由控制

    • 第84章:服务消费者直连某个服务提供者
    • 第85章:服务消费者直连多个服务提供者
    • 第85章-X:路由控制阶段作业
  • 第二十一篇:延迟连接

    • 第86章:服务消费者支持延迟连接服务提供者
    • 第87章:服务消费者支持非延迟连接服务提供者
    • 第87章-X:延迟连接阶段作业
  • 第二十二篇:并发控制

    • 第88章:并发控制基础模型设计
    • 第89章:服务提供者支持并发控制
    • 第90章:服务消费者支持并发控制
    • 第90章-X:并发控制阶段作业
  • 第二十三篇:流控分析

    • 第91章:流控分析后置处理器模型设计
    • 第92章:服务提供者整合流控分析
    • 第93章:服务消费者整合流控分析
    • 第93章-X:流控分析阶段作业
  • 第二十四篇:连接控制

    • 第94章:连接控制基础模型设计
    • 第95章:服务提供者整合连接控制
    • 第95章-X:连接控制阶段作业
  • 第二十五篇:SPI扩展连接淘汰策略

    • 第96章:基于SPI扩展最早连接淘汰策略
    • 第97章:基于SPI扩展最晚连接淘汰策略
    • 第98章:基于SPI扩展先进先出连接淘汰策略
    • 第99章:基于SPI扩展使用次数最少连接淘汰策略
    • 第100章:基于SPI扩展最近未被使用连接淘汰策略
    • 第101章:基于SPI扩展随机连接淘汰策略
    • 第102章:基于SPI扩展拒绝连接淘汰策略
    • 第102章-X:SPI扩展连接拒绝策略阶段作业
  • 第二十六篇:数据缓冲

    • 第103章:数据缓冲基础模型设计
    • 第104章:服务提供者整合数据缓冲
    • 第105章:服务消费者整合数据缓冲
    • 第105章-X:数据缓冲阶段作业
  • 第二十七篇:服务容错(降级)

    • 第106章:服务容错设计与研发
    • 第107章:服务容错效果测试
    • 第108章:服务容错失效问题修复
    • 第108章-X:服务容错阶段作业
  • 第二十八篇:服务限流

    • 第109章:服务限流基础模型设计
    • 第110章:服务提供者整合服务限流
    • 第111章:服务消费者整合服务限流
    • 第111章-X:服务限流阶段作业
  • 第二十九篇:基于SPI扩展限流策略

    • 第112章:基于SPI扩展Semaphore限流策略
    • 第113章:基于SPI扩展Guava限流策略
    • 第113章-X:基于SPI扩展限流策略阶段作业
  • 第三十篇:超出限流规则

    • 第114章:服务提供者超出限流上限触发的规则
    • 第115章:服务消费者超出限流上限触发的规则
    • 第115章-X:超出限流规则阶段作业
  • 第三十一篇:服务熔断

    • 第116章:服务熔断基础模型设计
    • 第117章:服务提供者整合服务熔断
    • 第118章:服务消费者整合服务熔断
    • 第118章-X:服务熔断阶段作业
  • 第三十二篇:基于SPI扩展熔断策略

    • 第119章:基于SPI扩展错误率熔断策略
    • 第119章-X:基于SPI扩展熔断策略阶段作业
  • 第三十三篇:异常监控

    • 第120章:异常监控后置处理器基础模型设计
    • 第121章:服务提供者整合异常监控
    • 第122章:服务消费者整合异常监控
    • 第122章-X:异常监控阶段作业
  • 维护篇:持续维护篇

    • 第fix-01章:修复服务消费者读取配置优先级的问题
    • 第fix-02章:修复Zookeeper一致性Hash负载均衡泛型类型不匹配的问题
    • 第fix-03章:修复自定义扫描器递归扫描文件标识不起作用的问题
    • 第fix-04章:修复基于SpringBoot启动服务消费者Netty Group多次连接的问题
    • 第fix-05章:修复基于计数器的限流策略不起作用的问题
    • 第fix-06章:修复基于SpringBoot启动服务消费者无法同时连接多个服务提供者的问题
    • 第fix-07章:更新基于Semaphore的限流策略
    • 第fix-08章:优化服务熔断半开启状态的执行逻辑
  • 番外篇

    • 《从零开始手写RPC框架》电子书重磅发布

《RPC手撸专栏》第19章:服务消费者动态代理实现异步调用

作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.site
文章汇总:https://binghe.site/md/all/all.html

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

之前直接通过调用某个接口的方法实现了RPC远程调用,这次,我想直接通过方法名和参数进行RPC远程调用。

一、前言

我想在服务消费者端动态代理实现异步调用,这个可以吗?

在前面的章节中,我们不仅实现了服务消费者与服务提供者之间进行同步、异步、单向和回调调用,并且在外部服务调用服务消费者时,服务消费者也屏蔽了底层Netty通信的细节信息。实现了在服务消费者端基于动态代理的功能屏蔽了构建请求协议对象的细节。跟进一步,我们也将动态代理整合进了服务消费者,实现了直接调用接口返回结果数据。

但是,细心的读者可以发现,通过直接调用接口方法的方式调用远程方法,底层采用的都是同步调用的方式。本章,我们一起将服务消费者增加动态代理后的调用方式扩展为同步方式和异步方式两种方式。

说干就干,我们一起开始吧。

二、目标

目标很明确:就是在服务消费者端整合完动态代理后,支持同步调用的同时,也支持异步调用!

我们自己写的RPC框架,能够实现通过直接调用接口的方法来实现远程方法调用,这看起来比一般的RPC Demo程序强大。但是我们不能止步于此,细心的读者可能会发现,一个好的并且成熟的RPC框架,整合进动态代理后,也是可以支持同步调用和异步调用两种方式。

在前面的文章中,在服务消费者整合动态代理的部分,使用的同步调用的方式,那只支持同步调用的方式是远远不够的,我们还需要在自己写的RPC框架中支持异步调用。

本章,我们就要在服务消费者整合动态代理后,实现异步调用。

三、设计

如果让你设计基于动态代理的异步调用,你会怎么设计呢?

消费者整合动态代理后,能够在RPC框架层面屏蔽掉构建请求协议对象的细节,直接通过接口的方法调用远程方法。在异步化设计上,可以基于接口的Class对象,通过RPC客户端生成异步化调用的对象,然后通过异步化调用对象的方法,传入要调用的方法名和参数实现异步调用,最终会返回一个RPCFuture对象,通过RPCFuture对象的get()方法获取最终的结果数据。

整个流程如图19-1所示。

图19-1

由图19-1所示的流程可以看出,图19-1与第18章的图18-1整体流程相差不大,图19-1的整体流程如下所示。

(1)外部服务通过服务消费者RPC客户端构建异步化调用对象。

(2)外部服务通过异步化调用对象的方法,传入方法名和参数调用接口方法,实际上是通过动态代理调用远程方法。

(3)服务消费者端的动态代理模块,会根据外部服务传递过来的参数构建请求协议对象,这样就在RPC框架层面对外屏蔽了构建请求协议对象的细节。

(4)服务消费端代理模块构建完请求协议对象后,服务消费者会通过自定义网络传输协议和数据编解码将数据编码成二进制字节流,传输到服务提供者。

(5)服务提供者接收到二进制数据流后,通过自定义网络传输协议和数据编解码对数据进行解码,将解码出的数据作为参数调用真实方法。

(6)真实方法经过业务逻辑处理后,会将结果数据返回给服务提供者。

(7)服务提供者接收到真实方法返回的结果数据后,会通过自定义网络传输协议和数据编解码对数据进行编码,将数据编码成二进制字节流后传输给服务消费者。

(8)服务消费者接收到服务提供者响应的二进制流数据后,通过自定义网络传输协议和数据编解码对数据进行解码,将数据解码成明文数据,再通过异步化调用对象将封装有最终结果数据的RPCFuture对象返回给外部服务。

四、实现

说了这么多,具体要怎么实现呢?

核心类实现关系

服务消费者整合动态代理后,实现异步调用的类关系如图19-2所示。

图19-2

查看完整文章

加入冰河技术知识星球,解锁完整技术文章与完整代码

在 GitHub 上编辑此页
上次更新: 2026/4/29 16:18
Contributors: binghe001
Prev
第18章:服务消费者整合动态代理实现直接调用接口返回结果数据
Next
第20章:服务消费者动态代理扩展优化
阅读全文
×

扫码或搜索:冰河技术
发送:290992
即可立即永久解锁本站全部文章

星球会员
跳转链接