特别放送 | 谈谈我所经历过的 RPC

简介: 拥有多年开发经验,历经.NET到Java技术栈转型,亲历ICE、Hessian、Dubbo等RPC框架演进,主导自研RPC实现服务化落地。见证RPC从代码集成走向Mesh化的基础设施下沉,坚信其作为分布式系统基石的重要价值,持续探索微服务架构的未来演进。

因为我工作年限比较长,所以编程经历相对也比较丰富,在转 Java 之前我做过一段时间的.Net。早期因为主要做数字化办公软件,所以那时候用.Net 编程的机会比较多,主要是因为很多应用采用.Net 相对使用 Java 来说,开发效率会高很多。但后面应用复杂之后,.Net 在性能、可维护性上都不如 Java 有优势,而且.Net 在很长一段时间内并不支持在 Linux 环境下部署,所以我们就把应用都逐渐改成 Java 了。使用过的 RPC 如下:
ICE
这就存在一个问题,我们是怎么把.Net 应用平滑地切换到 Java 上呢?原本是.Net 应用之间的互相调用,需要改成.Net 跟 Java 之间互相通信。为了解决这个问题,我们当时选择了一个比较古老的 RPC 框架 ICE(https://zeroc.com),可能现在很多人都没有听说过了。
Hessian
后面使用 Java 开发应用的机会越来越多,而且随着 Spring 开发方式的大流行,在 Java 应用里面使用 ICE 来完成应用之间的 RPC 调用就变得比较鸡肋了。所以当时我们用了一种新的 RPC 框架 Hessian(http://hessian.caucho.com/),这时我们就把 Java 应用之间的 RPC 调用方式改成了 Hessian 方式。
用 Hessian 的原因就是因为它可以很好地跟 Spring 进行集成,对 Spring 项目的开发人员来说,开发一个 RPC 接口就变得很容易了,我们可以直接把 Java 类对外进行暴露,用作 RPC 接口的定义,而不需要像 ICE 一样先定义 Stub。
单纯的从 RPC 框架角度出发,Hessian 是一款很优秀的产品,即使放到今天,它的性能和鲁棒性都有着很强的参考意义。但当业务发展壮大到一定程度后,应用之间的调用就不仅仅需要考虑用什么 RPC 框架了,更多的是需要考虑怎么去完成服务治理。
另外一个原因就是因为 Hessian 是没有服务发现功能的,我们只能通过 VIP 暴露的方式完成调用,我们需要给每个应用分配一个 VIP,把同一接口的所有服务提供方实例挂载到同一个 VIP 上。这种集中式流量转发架构就会使得提供 VIP 服务的 LVS 存在很大的压力,而且集中式流量的转发会让调用方响应时间相对变长。
Dubbo
为了解决类似 Hessian 这种集中式问题,实现大规模应用服务化的落地,国内的 RPC 框架 Dubbo 的做法就显得比较先进了。随着业务越来越复杂,应用之间的调用关系也就变得更加错综复杂,所以后面我们也是选择基于 Dubbo 进行扩展,以完成 RPC 通信,而服务发现则通过接入 Zookeeper 集群来完成。通过这种现有框架的搭配,我们完成了应用服务化的快速落地,也同时完成了统一公司内部所有应用 RPC 框架的目标。
但随着微服务理念越来越流行,很多应用的接口也是越拆越细,导致我们 Zookeeper 集群需要接入的接口数量越来越多;还有就是因为我们每年的业务量是成倍增长,为了让应用能够抗足够的调用量应用,我们也需要经常扩容,从而导致 Zookeeper 集群接入的 IP 实例数也是呈数量级增长的,这使得我们的 Zookeeper 集群负荷特别重。
再有就是 Dubbo 相对有点复杂,而且性能还有提高空间,这使得我们不得不考虑新的方案。
自研 RPC
在这种背景下,我们决定自行研发一套适合自己业务场景的微服务解决方案,包括 RPC 框架、服务治理以及多语言解决方案。至此我们自研的 RPC 就一直平稳地支持着公司内的各种业务。
这几年,在以 K8S 为代表的基础设施演进过程中,一个重要的关键词就是应用基础设施能力的下沉。在过去我们给应用提供 RPC 能力的时候,都是需要应用引入 Jar 包方式来解决的,在 RPC 里面,我们要把服务发现、路由等一整套 RPC 解决方案都融入到这个 Jar 里面去。
未来
目前,K8S 已成为基础设施的事实标准。而原先通过 Jar 包的方式封装的各种基础设施能力,现在全都被 K8S 项目从应用层拽到了基础设施中。那对于我们 RPC 来说也是一样,我们需要把非业务功能从传统的 RPC 框架中剥离出来,下沉到基础设施并且融入基础设施,然后通过 Mesh 去连接应用和基础设施。
这也是 RPC 发展的下一个阶段,完成所有应用的 Mesh 化。所以说,RPC 这条路没有尽头,只有不断的挑战和乐趣。希望你也能爱上它!
那最后我还想和你谈谈我对 RPC 的看法。
可能大家在谈论 RPC 时候,都想着 RPC 只是解决应用之间调用的工具。从本质上来讲,这没有什么问题,但在现实中,我们需要 RPC 解决更多的实际问题,比如服务治理,这些东西都是在使用 RPC 的过程中需要考虑的问题,所以我个人认为 RPC 应该是一个比较泛的概念。
当然,可能我们中大多数人现在是没有机会去完整实现一个新的 RPC 的,这不仅是精力的问题,更多是实际需求的问题,那为什么我们还需要学好 RPC 呢?我的想法很简单也非常实在,就是因为 RPC 是我们构建分布式系统的基石,就好比我们每次都是从 Hello World 开始学习一门新的编程语言。期待你能打牢这个基础,总有一天你会体验到它的能量!

相关文章
|
负载均衡 Dubbo 应用服务中间件
【Dubbo 解析】Dubbo支持几种负载均衡策略?
【1月更文挑战第11天】【Dubbo 解析】Dubbo支持几种负载均衡策略?
|
28天前
|
存储 人工智能 监控
多智能体系统的三种编排模式:Supervisor、Pipeline 与 Swarm
2026年,多智能体系统成主流:单智能体易陷上下文污染、角色混乱与故障扩散;而Supervisor、Pipeline、Swarm三类编排模式,配合结构化通信、按能力拆分、置信度验证与全链路Tracing,可构建更可靠、可控、可扩展的AI协作系统。
541 2
多智能体系统的三种编排模式:Supervisor、Pipeline 与 Swarm
|
5月前
|
消息中间件 人工智能 Apache
Apache RocketMQ × AI:面向 Multi-Agent 的事件驱动架构
本文介绍基于Apache RocketMQ构建异步化Multi-Agent系统的新架构,通过语义化Topic实现Agent能力发现,利用Lite-Topic支持轻量级异步通信与结果反馈,结合InterestSet+ReadySet事件驱动模型,高效支撑任务闭环、状态恢复与动态编排,为Agentic AI提供高扩展、低延迟的协同机制。
|
Java Apache Maven
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
1835 0
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
|
人工智能 编解码 API
用行动回应“实体清单”,智谱发布了一系列新模型
1月15日,美国商务部将25个中国实体列入出口管制实体清单,其中包括智谱及其子公司。面对制裁,智谱迅速回应,表示不会影响业务,并于次日发布全新端到端模型GLM-Realtime、升级GLM-4-Air和GLM-4V-Plus模型,推出免费的Flash系列普惠模型。这些举措展示了智谱在多模态交互、视频理解、语音交互等领域的技术实力,体现了中国AI企业在自主创新和自主可控方面的坚定决心。此举不仅彰显了智谱的技术硬实力,也为中国AI产业的自立自强树立了榜样。
407 24
ly~
|
消息中间件 存储 供应链
RocketMQ 消息的重试机制有什么优缺点?
RocketMQ 消息重试机制提高了消息处理的可靠性和系统的适应性,简化了错误处理,但也会增加系统延迟、可能导致消息重复处理并占用系统资源。适用于需要高可靠性的场景,如金融交易和电商订单处理。
ly~
377 5
|
12月前
|
JSON API 开发者
天猫商品详情 API 接口:功能、调用与实战攻略
天猫商品详情API为电商从业者、开发者和数据分析人员提供高效的商品数据获取途径。通过商品ID,该接口可返回包括基本信息、价格、库存及图片等详细内容,具有高准确性、易集成和功能丰富的特点。示例代码展示了如何用Python调用此API,生成签名确保请求安全,助力用户优化定价策略、开发应用或分析市场趋势。
672 10
|
消息中间件 安全 API
Apache RocketMQ ACL 2.0 全新升级
RocketMQ 作为一款流行的分布式消息中间件,被广泛应用于各种大型分布式系统和微服务中,承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大,安全相关的挑战日益突出,消息系统的访问控制也变得尤为重要。然而,RocketMQ 现有的 ACL 1.0 版本已经无法满足未来的发展。因此,我们推出了 RocketMQ ACL 2.0 升级版,进一步提升 RocketMQ 数据的安全性。本文将介绍 RocketMQ ACL 2.0 的新特性、工作原理,以及相关的配置和实践。
14202 101
|
人工智能 测试技术 API
成功注册Google的SerpAPI实现AI Agent的tool
成功注册Google的SerpAPI实现AI Agent的tool
3793 6
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
424 3

热门文章

最新文章