剖析 | 高可扩展性、高性能、生产级的 SOFARPC 框架

本文涉及的产品
可观测链路 OpenTelemetry 版,每月50GB免费额度
简介: SOFARPC 框架扮演的重要角色。


小蚂蚁说:

SOFAScalable Open Financial Architecture)是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。

本篇文章整理自《剖析 | SOFARPC 框架》系列文章,由SOFA 团队和源码爱好者们共同出品,项目代号:<SOFA:RPCLab/>。由于原文 系列篇幅较长,小蚂蚁为大家节选了部分内容,想要了解更多有关 SOFARPC 框架内容,可通过文中链接跳转获取~

相关阅读:

开源 | 蚂蚁金服启动分布式中间件开源计划,用于快速构建金融级云原生架构

开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系

目录

一、前言

二、SOFARPC 总体设计与扩展机制

三、SOFARPC 链路追踪

四、SOFARPC 连接管理与心跳

五、SOFARPC 同步异步实现

六、SOFARPC 线程模型

七、SOFARPC 单机故障剔除

八、SOFARPC 泛化调用实现

九、SOFARPC 数据透传

十、SOFARPC 优雅关闭

十一、SOFARPC 路由实现

十二、SOFARPC 注解支持

十三、《剖析 | SOFARPC 框架》系列历史文章

一、前言

SOFA(Scalable Open Financial Architecture)是蚂蚁金服自主研发的金融级分布式中间件,专注为金融用户提供安全、稳定、可靠、高效、敏捷的基础架构能力,帮助金融用户解决传统集中式架构转型的困难,打造大规模高可用的分布式系统架构,加快金融互联网+推进的速度。

RPC 框架作为分布式技术的基石,在分布式和微服务环境下,扮演着非常重要的角色。RPC 的概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出,他在论文 "Implementing Remote Procedure Calls" 中提到3点:简单、高效和通用,并认为 RPC 框架应包含 User、User-stub、RPC-Runtime、Server-stub、Server 5个部分。

SOFARPC 蚂蚁金服开源的一个高可扩展性、高性能、生产级的 Java RPC 框架,是蚂蚁金服服务化架构的基石。致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用方案。SOFARPC 提供了负载均衡,流量转发,链路追踪,链路数据透传,故障剔除等基础能力。

二、SOFARPC 总体设计与扩展机制

了解更多 SOFARPC 总体设计与扩展机制内容,点击链接:

https://mp.weixin.qq.com/s/ZKUmmFT0NWEAvba2MJiJfA

总体设计

从下图目前的 RPC 框架结构图来看,core 和 core-impl 是核心的功能,包含 API 和一些扩展机制,extension-impl 中,则包含了不同的实现和扩展,比如对 http、rest、对 metrics,以及其他注册中心的集成和扩展。

022539c43ef911b8eb69ecc5ec385f3213b48224

扩展机制

为了 RPC 各个环节都有充足的可扩展性,提供 SPI 的能力,所有内部的实现和第三方实现都是绝对平等的,我们实现了一套自己的 SPI 机制。基于这套扩展加载机制,我们可以实现自定义扩展点,实现 SOFARPC 内部及第三方的自由扩展。

三、SOFARPC 链路追踪

了解更多 SOFARPC 链路追踪技术内容,点击链接:

https://mp.weixin.qq.com/s/JNuibHtkBH3YsGS5m_hbmw

SOFARPC 的依靠集成 SOFATrace 来实现链路追踪技术,SOFARPC 作为公共组件在整个链路追踪技术系统中负责数据埋点工作。依赖 SOFARPC 自身强大的可扩展性设计,如微内核设计和事件总线设计,使得 SOFARPC 在不破坏开发封闭原则的基础上快速实现了链路追踪埋点工作。 SOFARPC 的链路追踪技术具有以下特点:

1、作为公共基础的通讯组件,SOFARPC 的链路追踪埋点对业务代码实现零侵入。

2、采用日志数据异步刷新机制,不影响正常业务性能。

3、采用了自适应采样设计,巧妙平衡了数据采集和性能的问题。

4、支持数据上报 zipkin, 通过与 zipkin 结合可以快速构建一个完整的连续追踪系统。

5、解决了异步线程链路调用数据问题。

6、采用了 OpenTracing 规范,因此可以和其他链路追踪手机和展示的技术框架快速整合。

四、SOFARPC 连接管理与心跳

了解更多 SOFARPC 连接管理与心跳内容,点击链接:

https://mp.weixin.qq.com/s/2aZz9Slxh8XlhU5U1993uw

在 RPC 调用过程中,我们经常会和多个服务端进行远程调用,如果在每次调用的时候,都进行 TCP 连接,会对 RPC 的性能造成比较大的影响。因此,实际的场景中,我们经常要对连接进行管理和保持。

SOFARPC 应用心跳包以及断线重连实现,结合系统 tcp-keepalive 机制,可以实现对 RPC 连接的管理和保持。

五、SOFARPC 同步异步实现

了解更多 SOFARPC 同步异步实现内容,点击链接:

https://mp.weixin.qq.com/s/446N2dA0gA17EO0D5wteNw

SOFARPC 以基于 Netty 实现的网络通信框架 SOFABolt 用作远程通信框架,使用者不用关心如何实现私有协议的细节,直接使用内置 RPC 通信协议,启动客户端与服务端,同时注册用户请求处理器即可完成远程调用。

SOFARPC 服务调用提供同步 Sync、异步 Future、回调 Callback 以及单向 Oneway 四种调用类型:

1、在 Sync 上,支持方法级别,接口级别,方法级别的超时设置。调用会阻塞请求线程,待响应返回后才能进行下一个请求。这是最常用的一种通信模型。

2、在 Callback 上,支持方法级别,接口级别,线程级别的回调设置。是真正的异步调用,永远不会阻塞线程,结果处理是在异步线程里执行。

3、在 Future 上,对用户提供了统一的 API 操作。支持原生 Future 和自定义 Future。用户 可以直接在当前线程上下文获取。在调用过程不会阻塞线程,但获取结果的过程会阻塞线程。

4、在 Oneway 上,设置简单。直接支持。为了防止应用出现类型转换异常,根据返回值设置不同的默认值。不关心响应,请求线程不会被阻塞,但使用时需要注意控制调用节奏,防止压垮接收方。

六、SOFARPC 线程模型

了解更多 SOFARPC 线程模型内容,点击链接:

https://mp.weixin.qq.com/s/yEu1RedULcljHsyY--F0Ww

对于 SOFARPC 来说,和底层的 SOFABolt 一起,在使用 Netty 的 Reactor 主从模型的基础上,支持业务线程池的选择。

4760439553cc4b5cc2a215f6210d41dc12201ed7

目前 SOFARPC 服务端的线程模型在综合考虑,和一些历史压测的数据支撑的情况下,我们选了主从线程模型,并对序列化和业务代码执行使用一个 BizThreadPool(允许对线程池的核心线程数,队列等进行调整),或者自定义的线程池。将序列化,反序列化等这些耗时的操作全部放在了Biz线程池中,这样可以有效地提高系统的整体吞吐量。

七、SOFARPC 单机故障剔除

了解更多 SOFARPC 单机故障剔除内容,点击链接:

https://mp.weixin.qq.com/s/WusXmhMnsvQ1tQh5wiCyDw

SOFARPC 5.3.0 支持故障剔除功能,能够将存在长连接但因为处于亚健康状态的服务进行降级,使得客户端的请求更多地指向健康节点。当这些异常节点恢复正常后,故障剔除功能会对该节点进行恢复,使得客户端请求逐渐将流量分发到该节点。这种策略类似软负责,所有的逻辑都在客户端执行。

SOFARPC 的内核设计和事件总线设计,能够在不破坏开发封闭性的情况下轻松引入故障剔除功能。FaultToleranceModule 包含了两部分:

1、事件订阅,负责订阅同步和异步结果事件,作为入口统计手机 RPC 调用信息。

2、调节器。根据收集的信息,以及内置的一些策略完成服务的降级和恢复操作。其中包含了信息收集器、计算策略、度量策略、降级策略和恢复策略。

八、SOFARPC 泛化调用实现

了解更多 SOFARPC 泛化调用实现内容,点击链接:

https://mp.weixin.qq.com/s/li1Ob7O9R1AyQkwq7xAjDg

在 RPC 调用中,客户端需要加载服务端提供的接口定义类衍生了泛化调用的需求,一个成熟的、功能完善的 RPC 框架一般都会支持泛化调用。

当客户端因为某种原因无法得到服务提供方的接口 jar 包时,或者是客户端是一个比较通用的系统,并不想依赖每个服务提供方提供的 facade 接口,但是又需要进行调用,那么此时就需要进行泛化调用。

SOFARPC 的泛化设计与实现

1、设计目标是:服务端无需感知是否泛化,一切都是由客户端进行处理。

带来的好处是:应用如果想要支持泛化,不需要改动服务端,只需要修改客户端即可。这是和其他 RPC 框架泛化调用最大的区别。

2、实现方式:通过 SOFA-Hessian 序列化支持泛化序列化,在进行泛化调用时,bolt 会根据上下文的序列化标记来使用对应的序列化器,SOFA-Hessian 特有的泛化序列化器可将 GenericObject 对象序列化成目标对象的字节流,服务端按正常反序列化即可。SOFA-Hessian 特有的泛化反序列化器也可将目标返回值反序列化成 GenericObject 等对象。

九、SOFARPC 数据透传

了解更多 SOFARPC 数据透传内容,点击链接:

https://mp.weixin.qq.com/s/WzhzJtawjRf-jC1jWMrVuw

在 RPC 调用中,数据的传递是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以。数据透传功能,就是指数据不需要以作为方法参数的形式在调用链路中进行传递,而是直接存储到调用上下文中,之后通过 RPC 的内置对象,进行传递,调用双端可从上下文中获取数据而不需要去关注数据的传输过程。SOFARPC 提供的数据透传支持请求数据透传(客户端向服务端)和响应数据透传(服务端向客户端)。

十、SOFARPC 优雅关闭

了解更多 SOFARPC 优雅关闭内容,点击链接:

https://mp.weixin.qq.com/s/7hs2eVRYQOo_XZrxGtbQSA

在微服务架构中,假如应用没有支持优雅停机,则会带来譬如数据丢失,交易中断、文件损坏以及服务未下线等情况。微服务的优雅停机需要遵循"注销发布服务 → 通知注销服务 → 更新服务清单 → 开启请求屏蔽 → 调用销毁业务服务 → 检查所有请求是否完成 → 超时强制停机"应用服务停机流程。

SOFARPC 提供服务端/客户端优雅关闭功能特性,用来解决 kill PID,应用意外自动退出譬如 System.exit() 退出 JVM,使用脚本或命令方式停止应用等使用场景,避免服务版本迭代上线人工干预的工作量,提高微服务架构的服务高可靠性。

在设计优雅关闭的时候,可以考虑按照如下几个约定来进行实现。

(1) 应用能够支持优雅停机

(2) 优先注销注册中心注册的服务实例

(3) 待停机的服务应用的接入点标记拒绝服务

(4) 上游服务支持故障转移因优雅停机而拒绝的服务

(5) 根据实际业务场景提供适当的停机接口。

十一、SOFARPC 路由实现

了解更多 SOFARPC 路由实现内容,点击链接:

https://mp.weixin.qq.com/s/kjAYRxLwiSgFAjqJU-z41Q

RPC 框架需要创造一种调用远程服务如同调用本地般的体验,因此在实现一个基于 RPC 框架的微服务架构的系统时,服务消费者(客户端)往往只需要知道服务端提供了哪些接口和方法,并不需要知道服务具体由哪些 IP 在提供。RPC 框架本身的服务发现和路由寻址功能解决了如何知道目标地址的问题,该过程对于 RPC 客户端调用方来说应该是完全透明的。整个路由寻址过程的阶段如下图所示。

7a64e57047ee199c17a205a89527acddd07e2ccc

在这个过程中,RPC 框架需要接入注册中心来完成服务发现和路由寻址的功能。同时,在应用大规模请求时,微服务系统还需要对请求服务集群化,同时通过负载均衡来达到降低访问压力的效果。

十二、SOFARPC 注解支持

了解更多 SOFARPC 注解支持内容,点击链接:

https://mp.weixin.qq.com/s/ccOHOWIUb-TQLPToX2y5kw

通过 XML 的方式去配置 SOFA 的 JVM 服务和引用非常简洁,但是多了一定的编码工作量。

因此,除了通过 XML 方式发布 JVM 服务和引用之外,SOFA 还提供了 Annotation 的方式来发布和引用 JVM 服务。@SofaService 注解省去了<sofa:service> 声明,但 bean 的定义还是必须要有的。

SOFA 实际上是注册了一个BeanPostProcessor 来处理@SofaService 和 @SofaReference注解。需要发布引用的对象属于当前 bean 的实例变量,使用 xml 的方式进行服务发布和引用,可以直接通过 Bean 生命周期的 InitializingBean#afterPropertiesSet 方法进行扩展。在工程中注解扫描是一个对所有 bean 的操作,只能通过实现 spring 的 beanpostprocessor 这个接口,另外有些属性可能在发布时需要用到。

因此使用注解的方式进行服务发布和引用,分别基于 Bean 生命周期的 BeanPostProcessor#postProcessAfterInitialization#postProcessBeforeInitialization方法进行扩展。

十三、《剖析 | SOFARPC框架》系列历史文章

  • 【剖析 | SOFARPC 框架】之总体设计与扩展机制

链接:https://mp.weixin.qq.com/s/ZKUmmFT0NWEAvba2MJiJfA

  • 【剖析 | SOFARPC 框架】系列之链路追踪剖析

链接:https://mp.weixin.qq.com/s/JNuibHtkBH3YsGS5m_hbmw

  • 【剖析 | SOFARPC 框架】系列之连接管理与心跳剖析

链接:https://mp.weixin.qq.com/s/2aZz9Slxh8XlhU5U1993uw

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 同步异步实现剖析

链接:https://mp.weixin.qq.com/s/446N2dA0gA17EO0D5wteNw

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 线程模型剖析

链接:https://mp.weixin.qq.com/s/yEu1RedULcljHsyY--F0Ww

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 单机故障剔除剖析

链接:https://mp.weixin.qq.com/s/WusXmhMnsvQ1tQh5wiCyDw

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 泛化调用实现剖析

链接:https://mp.weixin.qq.com/s/li1Ob7O9R1AyQkwq7xAjDg

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 数据透传剖析

链接:https://mp.weixin.qq.com/s/WzhzJtawjRf-jC1jWMrVuw

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 优雅关闭剖析

链接:https://mp.weixin.qq.com/s/7hs2eVRYQOo_XZrxGtbQSA

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 路由实现剖析

链接:https://mp.weixin.qq.com/s/kjAYRxLwiSgFAjqJU-z41Q

  • 【剖析 | SOFARPC 框架】系列之 SOFARPC 注解支持剖析

链接:https://mp.weixin.qq.com/s/ccOHOWIUb-TQLPToX2y5kw


— END —

相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
相关文章
|
消息中间件 Kafka Apache
微服务消息驱动:构建弹性、可扩展的分布式应用
在当今的软件开发世界中,微服务架构已经成为了构建大型应用的流行方式。随着应用规模的不断扩大,微服务架构引入了一些挑战,其中之一是确保各个微服务之间的通信高效、可靠和可扩展。微服务消息驱动架构应运而生,它为解决这些挑战提供了强大的工具和方法。
|
Web App开发 弹性计算 编解码
最佳实践:如何扩展你的SRS并发能力?
当我们用SRS快速搭建了视频服务,业务也开始上线运行了,很快就会遇到一个问题:如何支持更多的人观看?如何支持更多的人推流?这本质上就是系统的水平扩展能力,SRS当然是支持的,而且有多种扩展的方法,这篇文章就就详细分析各种扩展的方案,以及各种方案的应用场景和优缺点。
2502 0
最佳实践:如何扩展你的SRS并发能力?
|
8天前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
22 3
|
4月前
|
中间件 微服务 缓存
中间件性能和可扩展性
【6月更文挑战第1天】
67 9
|
2月前
|
设计模式 关系型数据库 持续交付
构建高效可靠的微服务架构:策略与实践
【7月更文挑战第60天】在现代软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发者将应用程序拆分成一组小型、松散耦合的服务。本文将深入探讨如何构建一个高效且可靠的微服务系统,涵盖关键设计原则、技术选型以及实践中的注意事项。我们将通过分析具体案例来揭示微服务的优势与挑战,并提供实用的解决方案和最佳实践。
|
2月前
|
存储 API 持续交付
探索微服务架构:构建灵活、可扩展的后端系统
【8月更文挑战第25天】 本文将引导您理解微服务架构的核心概念,探讨其对现代后端系统设计的影响。我们将从基础讲起,逐步深入到微服务的高级应用,旨在启发读者思考如何利用微服务原则优化后端开发实践。
45 4
|
2月前
|
存储 监控 安全
|
3月前
|
缓存 负载均衡 数据库
构建高性能后端系统的策略与实践
在数字化时代的浪潮中,后端系统作为支撑现代应用程序的核心,其性能的优劣直接影响用户体验和业务发展。本文将深入探讨如何构建一个既高效又可靠的后端系统,通过具体的策略和技术手段,指导读者理解并实施后端优化的最佳实践。我们将一起探索代码优化、数据库设计、缓存应用、异步处理以及负载均衡等关键领域,旨在帮助开发者打造能够应对高并发挑战的后端架构。 【7月更文挑战第27天】
65 5
|
5月前
|
监控 中间件
选择中间件性能和可扩展性
【5月更文挑战第20天】
61 1
|
5月前
|
XML 负载均衡 数据库
构建高性能微服务架构:挑战与策略
【5月更文挑战第17天】 在当今的软件开发领域,微服务架构已成为实现系统模块化和解耦的重要手段。它允许开发团队独立地开发、部署和扩展应用的各个部分,从而提高了整体系统的灵活性和可维护性。然而,随着服务的增多和分布式环境的复杂性提升,确保这些微服务高效运作面临着不少挑战。本文将探讨在构建高性能微服务架构时常见的问题,并提出一系列解决策略,以帮助开发者优化其系统性能和稳定性。