谈谈我对SOFA模块化的理解

今天我们谈谈SOFA模块化,首先看一段SOFA的介绍:

SOFABoot是蚂蚁金服开源的基于Spring Boot的研发框架,它在Spring Boot的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等能力。在增强了Spring Boot的同时,SOFABoot提供了让用户可以在Spring Boot中非常方便地使用SOFA中间件的能力。

在接触SOFA的模块化概念之前,我对服务端开发的模块化认知停留在“模块化”这个层面,我通常会按照下图所示的结构组织自己负责的应用的代码。

在Spring体系中的模块(Module),就是通过不同的Spring上下文来管理各自模块中的bean,在开发和编译期实现模块化,但是在运行时整个应用还是在一个Spring上下文中,这些代码还都是被一个类加载器加载的。

在图1中,我在manager模块中定义的bean,在service中可以随时引用,而不需要关注这个引用是否合理;这样的开发模式在应用还小的时候没什么问题,不过,随着业务的发展和应用的升级,这些模块之间的引用关系会越来越复杂而无法管理(这时候应用也就成为了一个“大泥球”),当某一天需要对应用进行服务化拆分的时候,就需要花很大的精力去理清不同模块之间的耦合和引用关系。SOFA的模块化特性就是为了解决这个问题而出现的,这种特性可以强制开发者在增加两个模块之间的引用关系的时候进行仔细的设计和思考。

SOFA的模块化

SOFA的模块,是一种可运行的模块;普通的Spring项目中的模块,则是普通的Jar。一个完整的 SOFA模块和一个普通的Jar包有两点区别:

  • SOFA模块包含一份sofa-module.properties文件,这份文件里面定义了SOFA模块的名称以及模块之间的依赖关系。
  • SOFA模块的META-INF/spring目录下,可以放置任意多的Spring配置文件,SOFA会自动把它们作为本模块的Spring配置加载起来。

使用SOFA模块化特性后,两个模块之间的bean无法直接通信,需要使用SOFA的通信协议进行通信,SOFA支持两种通信协议:

  • jvm调用,两个模块是在同一个JVM虚拟机中运行,无需经过网络调用。
  • rpc调用,两个模块不是在同一个JVM虚拟机中运行,甚至不是在一台机器上,需要经过网络调用。

SOFA为开发人员提供了三种形式的发布和引用服务的方式:xml方式、注解方式、编程方式。我现在用的比较多的还是xml方式,原因在于SofaService和SofaReference都是只支持jvm服务的发布和引用,而xml方式则可以支持两种形式的调用。

SOFA模块化对开发模式的影响

SOFA提供的模块化解决方案,既实现了真正的、运行时的模块化,又没有过度引入OSGI的复杂度,是一种有效的折衷方案。接触SOFA到熟悉SOFA的过程对我的开发思路影响很大,但是在熟悉了SOFA的模块化思想之后,我发现这个特性对于我平常的开发工作有几个好处。

安全的近远端架构

为了降低服务端的压力,我们需要提供一个SDK供业务方使用,在之前Spring体系下,这种架构也是可以执行的,但是有个弊端——SDK中应用的类和JAR包对于业务方的应用来说也是可见的,在某些情况下会出现冲突或引入潜在的BUG。

使用SOFA的模块化特性,我们提供的近端包虽然还是跟业务方的应用共享一个JVM,但是在类加载器层面实现了隔离,对于业务方来说,他们只需要知道是使用了我们的哪些接口,而不需要关注我们这个SDK引入了多少三方JAR包。

更好的代码共享

利用SOFA模块化,要实现代码共享,可没有Spring体系下那么简单——直接引用给一个模块就可以。在SOFA中,要进行代码共享,通常有两种情况:(1)近远端代码共享(2)管理时和运行时代码共享。

以第(1)种情况为例,某个组件近远端都是一样的,为了避免代码重复,我们如何实现代码共享呢?我现在的做法是:在一个公共的test-core模块中定义需要共享的接口和实现类;这个test-core模块不能定义为SOFA的模块,只能定义为一个普通的JAR包;然后在需要使用该接口的SOFA模块(近端模块和远端模块)中,分别声明和引用那个共享的bean,示例图如下所示。

这里的重点在于:

  • javaadu-core模块中是一个普通的JAR模块,只有接口的定义和实现,在这个模块中没有对bean的声明
  • javaadu-remote模块中是一个SOFA模块,在这里引用了javaadu-core中的接口和实现,这里需要对bean进行声明(bean声明)和发布(sofa-service),当前应用的其他模块要想使用该接口,只需要引用javaadu-core和javaadu-remote,然后使用sofa-reference引用该接口就可以,这里一般是jvm调用;其他应用如果想使用该接口,并且没有近端需求的话,则需要引用javaadu-core和javaadu-remote,并使用sofa-reference引用。可以看出,SOFA模糊了跨应用调用和应用内调用的概念,模块化做得很彻底
  • javaadu-client模块是一个SOFA模块,也是近端模块,在这里也需要自己定义和使用javaadu-core中的接口和实现。

总结

本文主要介绍了SOFA开发框架与Spring体系区别最明显的一个特性:SOFA模块化,通过每个模块一个Spring上下文的形式,实现了真正的运行时隔离。

基于我个人的使用经验,SOFA模块化对服务端开发的影响优大于劣:在维护代码中的过程中会仔细斟酌当前应用的模块依赖结构是否合理;可以更安全得提供SDK给业务方使用;在实现代码共享的时候,也需要仔细考虑哪些代码值得共享,哪些不需要。

参考资料

  1. Sofaboot-模块化开发概述
  2. 蚂蚁金服的业务系统模块化之模块化隔离方案
  3. 阿里巴巴Java开发手册(华山版).pdf
  4. JVM服务发布与引用
    ***
    本号(javaadu)专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。

原文地址:https://www.cnblogs.com/javaadu/p/11442337.html

时间: 2024-11-05 13:46:04

谈谈我对SOFA模块化的理解的相关文章

谈谈我对Spring IOC的理解

转自京东开涛大神的微博,这是我看过最好的对IOC DI的解释. 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 1.1.IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Jav

java面试题(杨晓峰)---谈谈你对java平台的理解

从你接触java开发到现在,你对java最直观的印象是什么呢?是他宣传的"write once ,run anywhere"还是目前看已经有些形式主义的语法呢?你对于java平台到底了解到什么程度?请先停下来总结思考一下. 今天我要问你的问题是,谈谈你对java平台的理解?"java是解释执行"这句话正确吗? 典型回答. java本身是一种面向对象的语言,最显著地特征有两个方面,一是所谓的"书写一次,到处运行.write once,run anywhere

谈谈你对java平台的理解?

问题:谈谈你对java平台的理解?java是解释执行,这句话对吗? 典型回答:java本身是一种面向对象的语言,具有很好的跨平台的能力,能够做到"write once ,run anywhere".另外就是GC机制,java通过垃圾回收器回收分配内存,程序员无需自己操心内寸的回收问题. 我们日常会接触到jre和jdk.jre是java运行环境,包含了jvm和java类库等.jdk则是在jre的基础上提供了更多的工具,比如编译器,和一些诊断工具等. java是解释执行,这句话不是很准确.

Java核心-01谈谈你对Java平台的理解

今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗? 典型回答 Java本身是一种面向对象的语言,最显著的特性有两个.一是所谓的“书写一次,到处运行”,能够非常容易获得跨平台能力:另一个就是垃圾收集,Java通过垃圾收集器回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收. 我们日常接触到 JRE( Java Runtime Environment) 或者 JDK( Java Development Kit).JRE 也就是 Java 运行

谈谈我对JS原型的理解

昨天阿里实习的第一次电面,也是我人生中的第一次电面,问了很多问题.结果还行吧,算是进入了下一轮.虽然不知道姓名,但还是要感谢面我的那个前辈.好吧,言归正传,为什么要写这篇关于原型的博文呢?因为电面时被问到了.当时有点紧张,感觉回答的很不理想,也许是自己还没有牢固的掌握吧!所以今天就写一写我对原型的理解,顺便理一下自己的思路. 首先,JS没有类继承机制,它是靠原型机制实现继承的,两种方式孰优孰劣,在此不做评判(知识量不足╮(╯▽╰)╭) 先上代码解释这一机制: var people = { nam

入门量化两年,谈谈我对量化投资的理解

虽然我现在已经入门量化投资两年,但是我还没有接触量化投资之前,和大家一样,只有一种感觉那就是神秘,难度大;但通过学习了量化金融分析师AQF实训项目之后,慢慢的对量化投资有一定理解之后,量化投资并没有大家想象的那么复杂.今天就谈谈我眼中的量化投资,如有理解不对的地方,欢迎一起讨论.>>>点击咨询量化金融分析师AQF实训项目 我列举了四大列去进行一个理解,分别是什么是量化投资?.量化投资的发展历程.量化投资的分类有哪些?以及最后一个量化和对冲. 一.什么是量化投资? 量化投资其实就是定量投资

谈谈我对JS闭包的理解

这一篇博客承接上一篇,如果大家没看上一篇,建议看看.....直通车..... 好吧,咱们一起来看看这个闭包,这次我们的重点并不是弄明白闭包是什么?而是搞清楚JS的闭包是怎么产生的.接着上一篇博客的示例: var a = function(x){ var b = 'bb'; var inner = function(){ var c = 'cc'; }; return b; }; 当a函数执行到给inner变量赋值匿名函数之后,形成下面的引用关系,直接复用上次博客的图: 从上图很容易看出,这时候i

我对模块化的理解

http://blog.csdn.net/horkychen/article/details/8293178 模块化是一个"发现" 模块化(Modularity)这个概念与其说是一种创新,不如说是一个"发现".这正是人们在解决问题时常用的行为方式和思维过程.它不是单纯的技术问题,更深深地影响着整个社会生活.可以读读<<设计原则:模块化的力量>>, 在<<Unxi编程艺术>>第4章也提到了这本书! 我们获取知识有两个重要

敏捷开发实践(一)--谈谈我对敏捷开发的理解

随着敏捷开发越来越流行,人人都在谈敏捷,人人也都在学习scrum等敏捷开发方法...当然,自己也是敏捷开发的实施者和受益者. 背景 我们公司引入敏捷开发的时间并不长,在实施敏捷的过程还存在一些问题,自己在实施敏捷的过程也存在很多的疑惑(毕竟原来没有学过,和真实的经历,体会),所以最近一直在学习敏捷,看敏捷的视频和阅读相关资料,同时结合自己实施敏捷的经验,通过分享博文进行一下简单的总结,目的有四: 1. 详细的介绍和学习一下敏捷开发 2. 和CSDN的大牛们一起分享交流,学习,提高一下 3. 总结