乐趣区

关于spring-cloud:sofa模块化隔离

传统我的项目

传统我的项目中有时会 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-…

退出移动版