前言:
提到分布式、微服务,大部分人首先想到的可能是SpringCloud、Duubo等主流框架,但事实上在SpringCloud还未出现之际,蚂蚁金服内部就已经有了一套比较完整的金融级分布式架构Sofa,并且到目前为止,经历了大大小小比较完善的闭环金融场景,如双十一、双十二等。说来也惭愧,之前并未关注到Sofa早已开源,所以一直不敢发布有关Sofa的相关文章,如果对Sofa知之甚少的小伙伴,接下来就和我一起进入一个新世界:Sofa分布式微服务架构。
1.Sofa结构图:
2.Sofa简单介绍:
Scalable Open Financial Architecture,即面向服务的架构。
主要组件:微服务研发框架 RPC 框架 服务注册中心 分布式定时任务 限流/熔断框架 动态配置推送 分布式链路追踪Metrics监控度量 分布式高可用消息队列 分布式事务框架、分布式数据库代理层等组件,由于Sofa结构过于复杂,这里主要以结构图中红色框为主要内容,其他内容后续文章会有具体介绍(大家多多关注哦)。
3.使用Sofa的意义是什么
这里以Sofa和SpringCloud做一个简单比较为例。
1)Sofa
Sofa将应用系统拆分为多个模块(bundle),各个模块之间各司其职,负责独立的业务,模块之间通过JVM/RPC接口调用。
2)SpringCloud
SpringCloud将应用系统拆分为多个微服务,模块之间通过RPC/HTTP方式进行调用。
3) Sofa优势
SOFA是蚂蚁金服自己研发的一套方案,天然集成了RPC、服务路由等功能,能够与蚂蚁内部其它中间件(如zdal、drm、msgbroker等)无缝结合,这一整套技术方案撑起了蚂蚁金服的核心业务, 它更加适合金融云环境,一旦出现问题能够快速定位并解决。
4.Sofa工程结构
test测试层:集成测试框架Junit/TestTNG/Acts,实现测试用例。
web-home:实现controller控制层。
biz业务层:biz-shared实现本地具体业务,biz-shared-impl实现 对外发布服务的具体实现,默认依赖于biz-shared和common-service-facade。
核心领域层:core-model封装核心领域模型对象,如将数据库属性转化为枚举,Json字符串转化为JSONObject或者对象等。core-service封装核心领域服务,主要是对数据库访问层的封装,以及可复用业务的封装。
基础层:数据库访问层封装。
总结:Sofa不同模块之间的spring context上下文是相互隔离的,两个模块之间的bean不能通过spring的依赖注入来直接调用。
5.Sofa服务的发布与引用(RPC)
1)JVM服务发布和引用:同一个Sofa应用中不同模块之间的调用,即单机内部调用。
创建接口和实现
以xml方式服务发布
在Spring xml配置文件中,将实现类声明为一个bean
<bean id="jvmService"class="cn.test.impl.JvmServiceImpl"/>
将bean注册为sofa服务,本工程中的其他模块就可以引用了。
<sofa:service ref="jvmService"interface="cn.test.JvmService"/>
以xml方式服务引用
同一个模块中直接用Spring注解@Autowired自动注入就可以使用
@Autowired private JvmService jvmService;
不同模块中直接用Sofa注解@SofaReference自动注入就可以使用
@SofaReference private JvmService jvmService;
以注解方式服务发布
@SofaServicepublicclassJvmServiceImplimplementsJvmService{ @Override publicStringget(){ return"JVM"; }}
以注解方式服务引用
@SofaReferenceprivate JvmService jvmService;
2)RPC服务发布和引用:多个Sofa应用之间不同模块的的调用,即跨机调用。目前只支持XML配置方式。
服务发布
<sofa:serviceref="rpcService "interface="cn.test.RpcService">
<sofa:binding.tr/>
</sofa:service>
服务引用
<sofa:referenceid="rpcService"interface="cn.test.RpcService">
<sofa:binding.tr testUrl= "服务注册器IP"/>
</sofa:reference>
代码中直接用Sofa注解@SofaReference自动注入就可以使用
6.Sofa服务的发布与引用(RPC)原理解析
1)在xml中引入sofa命名空间
// sofa命名空间xmlns:sofa="http://schema.alipay.com/sofa/schema/service"// 该命名空间的唯一标示xsi:schemaLocation="http://schema.alipay.com/sofa/schema/service http://schema.alipay.com/sofa/sofa-service-4-0-0.xsd"
2.通知Spring加载sofa标签
3.解析sofa:service和sofa:reference标签
4.服务发布,本质是注册服务,将服务对象通过register方法注册到sofa上下文sofaRuntimeContext中。
4.服务引用,本质是找到服务。Reference的意义在于将目标服务的代理对象从SofaRuntimeContext中取出,加载为Spring的bean。
1)JVM调用:通过JvmBindingAdapter获取代理对象,生成代理对象的执行器JvmServiceInvoker,执行代理对象的方法。
2)RPC调用:通过RpcBindingAdapter获取代理对象,返回执行器SofaServiceProxy,执行代理对象的方法。
总结:调用时,所有模块都可以在全局的registry中获取想要的服务。对于JVM服务,同一应用下其他模块调用该服务只需查询本地注册中心即可。对于RPC服务,RpcBindingAdapter的方法outBinding会将服务推送到远程注册中心中供外部调用。
我是一支喜欢梨花的海棠,也是一束喜欢梨花的海棠, 我们下次见。
下期预告:蚂蚁金服开源服务注册中心 SOFARegistry。
PS: 文章是笔者分享的学习笔记,若你觉得可以、还行、 过得 去、甚至不太差的话,可以“推荐”或者“关注”一下的哦。就此谢过!