美文网首页开源源码
(1)SOFARPC 框架之总体设计与扩展机制(源码部分看的好简

(1)SOFARPC 框架之总体设计与扩展机制(源码部分看的好简

作者: hedgehog1112 | 来源:发表于2019-06-19 19:07 被阅读22次

    二、RPC 是什么

    三、通用 RPC 框架原理

    四、SOFARPC 框架设计

    五、SOFARPC 扩展机制

    一、前言

    在内网节点间通信。底层通信框架,已在SOFABolt 实践,提供通信协议与框架,在 SOFABolt 的基础上,我们研发了自己的 RPC 框架,提供了负载均衡,流量转发,链路追踪,链路数据透传,故障剔除等基础能力。

    项目地址:

    SOFARPC:https://github.com/alipay/sofa-rpc

    SOFABolt:https://github.com/alipay/sofa-bolt

    二、RPC 是什么

    1. 简单、 高效、通用(不同的远程通信调用)。RPC框架应该包含的几个部分:

    User(下面将 User 改成 Client )、User-stub、 RPC-Runtime、Server-stub、 Server

    Client通过本地调用 Client-stub发起远程调用,Client-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPC-Runtime 实例传输到远端的实例。

    远端 RPC-Runtime 实例收到请求后交给 Server-stub 进行解码后发起本地端调用,Java中可以认为就是反射调用,结果返回给 Client 端。

    三、通用 RPC 框架原理

    1.Stub 怎么出现?创建代理

    2.怎么打包参数?序列化、网络协议编码

    3.怎么传输?Bolt,Netty 

    4.怎么知道目标地址?  服务发现路由寻址

    5.怎么发布RPC 服务? Registry 

    还有:熔断,限流,故障剔除,数据透传等能力

    四、SOFARPC 框架设计

    4.1 SOFARPC RoadMap现状和一些正在做的事情

    4.2 SOFARPC 结构设计

    core和 core-impl :核心功能,包含 API 和一些扩展机制。

    extension-impl :包含了不同的实现和扩展, 对http,rest, metrics,其他注册中心的集成和扩展。如 bootstrap 中对协议的支持,remoting 中对网络传输的支持,registry 中对注册中心的支持等。

    RPC 框架涉及服务端和客户端,结合 SOFARPC 的处理流程:

    4.3客户端调用流程

    当使用方对服务进行了引用配置之后:

    1.RPC 生成 Proxy,作为用户可操作入口

    2.向服务中心订阅这个 RPC 的地址信息

    3.使用方发起调用,经过路由,负载均衡,各类 Filter 发起调用。

    4.2服务端处理流程

    在服务端看来,通过 TCP 监听端口后:

    1.接到 RPC 请求后,进行解码和反序列化

    2.选择线程池,进行分发

    3.经过 Filter,进行反射调用

    4.将结果序列化编码,进行写回

    五、SOFARPC 扩展机制

    RPC的扩展机制:每部分有多种实现

    为了对 RPC 各个环节的都有充足的可扩展性,提供 SPI (串行外设接口)的能力,自己SPI 机制,相比原生功能更强大:

    1、按需加载

    2、可有别名

    3、可有优先级进行排序和覆盖

    4、可控制是否单例

    5、可在某些场景下使用编码

    6、可指定扩展配置位置

    7、可排斥其他扩展点

    启动加载阶段,RPC 会根据对应的配置,加载需要调用方法ExtensionLoader(Class<T> interfaceClass, ExtensionLoaderListener<T> listener)逻辑如下:

    1、首先读取rpc-config-default.jsonrpc-config.json,找到扩展描述文件存放的文件夹:extension.load.path属性。

    2、找到接口类对应的扩展描述文件的文件名(默认就是接口名,也可以自己指定)。

    3、循环加载这个文件下的扩展描述文件按行读取。(同一个接口的同一个别名对应唯一的一个实现类,可以重复,允许覆盖。)

    4、保存扩展实现类的alias实现类的对应关系。

    5、如果 ExtensionLoaderListener 不为空,则通知 Listener

    1 1 2 3 5

    构造出各个不同的 Filter,Invoker 等

    其中我们首先设计了一个扩展,代表这个类或者接口是可扩展的,默认单例、不需要编码

    同时,针对具体的扩展实现,定义一个扩展注解

    通过核心类ExtensionLoader的加载过程。完成对扩展的加载:

    当我们或者其他使用者想要实现一个自己的扩展点的时候,只需要按照如下的步骤即可开始

    1、指定扩展点

    2、指定扩展实现类

    3、扩展描述文件META-INF/services/sofa-rpc/com.aliapy.sofa.rpc.client.Client

    直接调用即可:Client failoverClient = ExtensionLoaderFactory.getExtensionLoader(Client.class).getExtension("failover");

    基于这套扩展加载机制,我们可以实现自定义扩展点,实现 SOFARPC 内部及第三方的自由扩展。

    1、SOFARPC 同步异步实现剖析

    2、SOFARPC 线程模型剖析

    3、SOFARPC 连接管理与心跳剖析

    4、SOFARPC 单机故障剔除剖析

    5、SOFARPC 路由实现剖析

    6、SOFARPC 序列化比较

    7、SOFARPC 注解支持剖析

    8、SOFARPC 优雅关闭剖析

    9、SOFARPC 链路追踪剖析

    10、SOFARPC 数据透传剖析

    11、SOFARPC 跨语言支持剖析

    12、SOFARPC 泛化调用实现剖析

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

    相关文章

      网友评论

        本文标题:(1)SOFARPC 框架之总体设计与扩展机制(源码部分看的好简

        本文链接:https://www.haomeiwen.com/subject/igqkqctx.html