3

传统项目

image.png
传统项目中有时会Klass service层直接调用Student service层的Bean去实现某些逻辑,当项目变得越来越大时,这种层与层之间的依赖关系变得十分复杂,不利于开发。多个团队同时开发时,本团队只希望关心自己负责的模块。这种情况下,就需要将模块于模块之间相互独立,也就是对模块做隔离,export可以提供的Bean,import需要的bean,这样也能让开发者清楚每个模块依赖的东西。当项目膨胀到需要去做服务化的时候,这样,拆分起来就非常简单了。
image.png

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-...


小强Zzz
1.2k 声望32 粉丝

下一篇 »
SofaRpc

引用和评论

0 条评论