传统项目
传统项目中有时会Klass service层直接调用Student service层的Bean去实现某些逻辑,当项目变得越来越大时,这种层与层之间的依赖关系变得十分复杂,不利于开发。多个团队同时开发时,本团队只希望关心自己负责的模块。这种情况下,就需要将模块于模块之间相互独立,也就是对模块做隔离,export可以提供的Bean,import需要的bean,这样也能让开发者清楚每个模块依赖的东西。当项目膨胀到需要去做服务化的时候,这样,拆分起来就非常简单了。
sofa
SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架。提供了很多功能,如扩展 Spring Boot 健康检查的能力,提供模块化开发的能力,增加模块并行加载和 Spring Bean 异步初始化能力,增加日志空间隔离的能力,增加类隔离的能力,增加中间件集成管理的能力,其中就有模块化隔离功能。
模块化隔离
原理
原理:基于 Spring 上下文隔离的模块化,用 Spring 上下文来做不同功能模块的隔离,在开发期和编译期,代码和配置也会分在不同 Java 工程中,但在运行期,不同模块间的 Spring Bean 相互不可见,但是所有的 Java 类还是在同一个 ClassLoader 下。
https://www.sofastack.tech/pr...
sofa模块
首先我们需要创建一个基于sofa的模块,一个sofa模块与普通项目相似,多一个配置文件,使之能够被识别成一个sofa模块。同时多个sofa模块又都在同一个Spring Boot 项目文件夹下。
.
├── README.md
├── build.gradle
├── gradle
│ └── wrapper
├── gradle.properties
├── gradlew
├── gradlew.bat
├── logs
│ ├── health-check
│ ├── infra
│ ├── sofa-runtime
│ └── spring.log
├── pom.xml
├── service-consumer
│ ├── build
│ ├── build.gradle
│ ├── pom.xml
│ └── src
├── service-facade
│ ├── build
│ ├── build.gradle
│ ├── pom.xml
│ └── src
├── service-provider
│ ├── build
│ ├── build.gradle
│ ├── pom.xml
│ └── src
├── settings.gradle
└── sofa-boot-run
├── build
├── build.gradle
├── pom.xml
└── src
对于每一个sofa模块,多一个sofa-module.properties 文件(src/main/resources 目录下)
Module-Name=com.alipay.test.biz.service.impl
Require-Module=com.alipay.test.biz.shared
定义sofa模块的名字和需要的sofa模块。
发布与引用
SOFABoot 提供三种方式给开发人员发布和引用 JVM 服务
- XML 方式
- Annotation 方式
- 编程 API 方式
我们定义一个service-provider模块用于提供服务,定义一个service-consumer模块用于引用服务
其中要在service-consumer模块的配置文件中加入
Module-Name=com.alipay.sofa.service-consumer
Require-Module=com.alipay.sofa.service-provider
用于定义启动顺序
Annotation 方式
service-facade 模块包含用于演示 JVM 服务发布与引用的 API
public interface SampleJvmService {
String message();
}
发布服务
实现 SampleJvmService 接口并增加 @SofaService 注解:
@SofaService
public class SampleJvmServiceAnnotationImpl implements SampleJvmService {
@Override
public String message() {
String message = "Hello, jvm service annotation implementation.";
System.out.println(message);
return message;
}
}
将 SampleJvmServiceAnnotationImpl 配置成一个 Spring Bean,保证 @SofaService 注解生效:
<bean id="sampleJvmServiceAnnotation" class="com.alipay.sofa.isle.sample.provider.SampleJvmServiceAnnotationImpl"/>
引用服务
定义 JvmServiceConsumer 类,并在其 sampleJvmServiceAnnotationImpl 属性上增加 @SofaReference 注解:
public class JvmServiceConsumer implements ClientFactoryAware {
@SofaReference(uniqueId = "annotationImpl")
private SampleJvmService sampleJvmServiceAnnotationImpl;
}
将 JvmServiceConsumer 配置成一个 Spring Bean,保证 @SofaReference 注解生效:
<bean id="consumer" class="com.alipay.sofa.isle.sample.consumer.JvmServiceConsumer" init-method="init" />
参考
https://www.sofastack.tech/pr...
https://github.com/sofastack-...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。