浅谈阿里巴巴蚂蚁金服SOFA微服务开源框架

前言:

提到分布式、微服务,大部分人首先想到的可能是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: 文章是笔者分享的学习笔记,若你觉得可以、还行、 过得  去、甚至不太差的话,可以“推荐”或者“关注”一下的哦。就此谢过!

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值