蚂蚁金服开源sofa-rpc框架源码走读记录——Provider
版权声明:本文为博主原创文章,未经博主允许不得转载。
手动码字不易,请大家尊重劳动成果,谢谢
最近两周在学习Hadoop源码时研究到了rpc框架,然后在网上发现了
蚂蚁金服近期开源的sofa-rpc框架
。这两天正好有点空闲,就走读了一遍源码进行学习,并写篇博客来记录下。
本文不介绍模块的使用方法,在官方github上已经有了相关示例,不过貌似不那么全。还是需要阅读源码来了更深入了解使用方法。
上篇博客介绍了Consumer部分的初始化过程,这篇博客将介绍Provider部分的初始化过程。
相比于Consumer部分,Provider的结构就简单多了,这里说的简单仅仅指rpc适配的部分,构建一个高性能高并发的服务端还是有很对细节需要去考虑的。感觉有部分功能还埋藏在sofa-bolt框架里,之后还要深入bolt源码来探索一番。
Provider模块的主要类结构和初始化过程
类结构
这个图是我在走读Provider启动过程时画的图,大致表现了Provider端的主要的一些类的加载启动过程。
sofa-rpc在代码中使用了类似Java中ServiceLoader的机制来进行扩展类加载,并预留了很多的扩展点来方便用户对框架进行扩展。图中
黄色的方框
就是其中的一些扩展类加载器,可以说是差不多所有模块都可以替换了。
sofa-rpc使用了类似Builder模式的方法,用户只用创建并填充指定的一些Config类,如
ProviderConfig
、
RegistryConfig
等类,然后最后调用其指定方法即可实现其提供的功能,感觉这种方式确实很实用。
Provider模块的启动
既然是rpc框架,自然最终是要启动一个连接来向外提供一个服务的:
providerConfig.export();
在初始化过程中大致进行了以下动作,默认流程:
1、使用扩展工厂加载BoltProviderBootStrap类
(图中①)
并调用其export方法(ProviderConfig.class)
2、做一些基本的检查(DefaultProviderBootstrap.class)
3、创建代理调用对象ProviderProxyInvoker
(图中②)
,并在构造函数里使用扩展工厂加载FilterChain
*(图中③)
(DefaultProviderBootstrap.class)
4、初始化注册中心
(图中④)
5、使用扩展工厂加载Server
(图中⑤)
6、将3中创建的代理调用对象注册到Server里
(图中⑥)
7、启动Server
8、向注册中心注册服务提供
(图中⑦)
Consumer模块的消息发送流程
一个消息的调用会经过几个主要的模块
1、bolt模块接收到消息会调用BoltServerProcessor类进行处理
2、BoltServerProcessor调用BoltServer的findInvoker来获取实际的服务类调用者
3、BoltServer返回对应的ProviderProxyInvoker
4、BoltServerProcessor获取了Invoker,调用其invoke方法获取结果
5、ProviderProxyInvoker将调用委托给FilterChain
6、FilterChain最后一个Filter为ProviderInvoker,它会通过反射来将接口方法调用在providerConfig.getRef()所存储的类上
由于服务提供者需要面临高并发的场景,因此在服务端没有看到很多的逻辑,因为服务端重要的还是为尽快为客户端提供服务返回。
到这里sofa-rpc的简单介绍已经做完了,这两篇文章没有深入分析细节,只是将整体结构进行介绍,希望能给读者一些引导,随着知识面的增大,每个人对细节的关注点都不一样。