蚂蚁金服开源sofa-rpc框架源码走读记录——Consumer

蚂蚁金服开源sofa-rpc框架源码走读记录——Consumer

版权声明:本文为博主原创文章,未经博主允许不得转载。

手动码字不易,请大家尊重劳动成果,谢谢

作者:http://blog.csdn.net/wang_wbq

最近两周在学习Hadoop源码时研究到了rpc框架,然后在网上发现了蚂蚁金服近期开源的sofa-rpc框架。这两天正好有点空闲,就走读了一遍源码进行学习,并写篇博客来记录下。

本文不介绍模块的使用方法,在官方github上已经有了相关示例,不过貌似不那么全。还是需要阅读源码来了更深入了解使用方法。

既然是rpc框架,自然逃不出固定的几个套路:
1、底层网络传输
2、序列化
3、代理框架

sofa-rpc中
1、网络使用了同样刚开源出来的sofa-bolt,里面代码简单走读了下,其基于Netty做了一些封装,提供了简洁的的网络请求接口。
2、序列化使用了同样开源的sofa-hessian框架
3、代理框架使用了javassist组件

除此以外,sofa-rpc还提供了
1、注册发现框架来自动寻找可用的服务端
2、负载均衡、过滤器、路由等功能
3、服务预热、故障隔离等
4、很多的扩展点
。。。等

Consumer模块的主要类结构和初始化过程

类结构

这个图是我在走读Consumer启动过程时画的图,大致表现了Consumer端的主要的一些类的加载启动过程。

sofa-rpc在代码中使用了类似Java中ServiceLoader的机制来进行扩展类加载,并预留了很多的扩展点来方便用户对框架进行扩展。图中黄色的方框就是其中的一些扩展类加载器,可以说是差不多所有模块都可以替换了。

sofa-rpc使用了类似Builder模式的方法,用户只用创建并填充指定的一些Config类,如ConsumerConfigRegistryConfig等类,然后最后调用其指定方法即可实现其提供的功能,感觉这种方式确实很实用。

蚂蚁金服开源sofa-rpc框架源码走读记录——Consumer_第1张图片

Consumer模块的启动

既然是rpc框架,自然要生成一个接口的实现类,这个类是通过调用:

consumerConfig.refer()

来生成的,那么这里就是我们的出发点了。

在初始化过程中大致进行了以下动作,默认流程:
1、使用扩展工厂加载BoltConsumerBootStrap类(图中①)并调用其refer方法(ConsumerConfig.class)
2、做一些基本的检查(DefaultConsumerBootstrap.class)
3、使用扩展工厂加载Cluster (图中②)、ConfigListener、ProviderInfoListener(DefaultConsumerBootstrap.class)
4、初始化Cluster(DefaultConsumerBootstrap.class)
5、使用扩展工厂加载RouterChain、LoadBalancer、AddressHolder、ConnectionHolder、FilterChanin (图中③④⑤⑥⑦)(AbstractCluster.class)
6、调用consumerBootstrap类进行注册中心的注册(AbstractCluster.class)
7、调用扩展工厂加载ZookeeperRegistry (图中⑧),将ConfigListener、ProviderInfoListener注册到注册中心,并获取当前服务提供者列表(DefaultConsumerBootstrap.class)
8、得到初始化时的服务提供者列表并初始化AddressHolder和ConnectionHolder(AbstractCluster.class)
9、创建代理调动对象DefaultClientProxyInvoker (图中⑨)(DefaultConsumerBootstrap.class)
10、创建代理对象(图中⑩)(DefaultConsumerBootstrap.class)

注册中心使用了zookeeper来进行分布式协调,其中使用了curator包来进行zookeeper的使用。使用curator进行子节点的监控,并在子节点数目变化时通知订阅者,这样就使用观察者达到了动态监听并改变服务提供列表的目的。

Consumer模块的消息发送流程

借用sofa-rpc的wiki中的一张图来说明调用过程,感觉这个图已经描述得很详细了:

蚂蚁金服开源sofa-rpc框架源码走读记录——Consumer_第2张图片

一个消息的调用会经过几个主要的模块
1、DefaultClientProxyInvoker进行简单包装并调用cluster的invoke方法
2、FailOverCluster或者FailFastCluster的doInvoke方法,快速失败或者重试调用
3、调用AbstractCluster的select方法来选择要发送给哪个服务提供者
3.1、调用路由链获取可用的服务列表,默认路由会生成可用服务列表,自定义路由可以对其进行改变
3.2、调用负载均衡器进行服务选择,最终返回一个目标服务
4、调用过滤器链
4.1、内置的一些过滤器进行发送前修改
4.2、调用到最后一个过滤器ConsumerInvoker将消息代理到cluster类的sendMsg方法上
5、从connectionHolder里获得目标服务对应的实际链接并进行消息发送

以上就是我所看到的sofa-rpc的消费者端的代码流程。相比于消费者端,提供者端的代码流程好像会简单很多,之后有时间也会整理下。

你可能感兴趣的:(网络编程)