Demo 地址
SOFAArk 相干
- Ark 包 = Ark 容器 + Ark 插件 + Biz 包
- Ark 包:能够了解为宿主利用,打包后生成的可执行 Jar 包,jar 包后缀为
-ark-executable.jar
- Biz 包:每个模块都是一个 biz 包,biz 包的后缀为
-ark-biz.jar
,biz 包能够间接在已有的 Ark 容器中装置(当初通过 API 的形式) -
API:ArkClient 蕴含的针对 Biz 包的装置、卸载、切换版本性能,demo 中提供了三个接口对其进行操作。
@RequestMapping(value = "/installBiz", method = RequestMethod.POST) public void installBiz(String url) throws Throwable {ArkClient.installBiz(new File(url)); } @RequestMapping(value = "/uninstallBiz", method = RequestMethod.POST) public void uninstallBiz(String bizName, String bizVersion) throws Throwable {ArkClient.uninstallBiz(bizName, bizVersion); } @RequestMapping(value = "/switchBiz", method = RequestMethod.POST) public void switchBiz(String bizName, String bizVersion) {ArkClient.switchBiz(bizName, bizVersion); }
如果是 Controller 层为一个 Biz 包,那么如果须要公布更新,则须要进行该 Biz 包的 Spring 服务后再调用 installBiz 办法。
-
SOFAArk 配置:
- 在我的项目的整体目录下须要创立 conf/ark 文件夹
- conf/ark/bootstrap.properties 是 SOFAArk 容器默认启动配置文件(官网文档)
-
多模块开发中配置文件中必须指定宿主利用
com.alipay.sofa.ark.master.biz=master-module
-
模块化开发相干文档:
- JVM 服务公布与援用:模块隔离后如何相干调用
- 蚂蚁金服的业务零碎模块化之模块化隔离计划
- 基于 SOFABoot 进行模块化开发
Maven 配置
-
在工程主
pom.xml
中,批改 parent 为<parent> <groupId>com.alipay.sofa</groupId> <artifactId>sofaboot-dependencies</artifactId> <version>3.2.2</version> <relativePath/> <!-- lookup parent from repository --> </parent>
-
宿主利用
pom.xml
中,增加依赖<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>runtime-sofa-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-springboot-starter</artifactId> </dependency> <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>web-ark-plugin</artifactId> </dependency>
增加打包插件
<build> <plugins> <!-- 这里配置动静模块打包插件 --> <plugin> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-maven-plugin</artifactId> <executions> <execution> <id>default-cli</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <priority>100</priority> <baseDir>../</baseDir> <bizName>demo</bizName> </configuration> </plugin> </plugins> </build>
-
业务模块
pom.xml
中,增加依赖<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-springboot-starter</artifactId> </dependency>
增加打包插件(如果是 Controller 层的模块,须要指定 webContextPath)
<build> <plugins> <!-- 这里增加 ark 打包插件 --> <plugin> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-maven-plugin</artifactId> <executions> <execution> <!--goal executed to generate executable-ark-jar --> <goals> <goal>repackage</goal> </goals> <!--ark-biz 包的打包配置 --> <configuration> <!-- 是否打包、装置和公布 ark biz,具体参考 Ark Biz 文档,默认为 false--> <attach>true</attach> <!--ark 包和 ark biz 的打包寄存目录,默认为工程 build 目录 --> <outputDirectory>target</outputDirectory> <!--default none--> <arkClassifier>executable-ark</arkClassifier> <!-- ark-biz 包的启动优先级,值越小,优先级越高 --> <priority>200</priority> <!-- 设置利用的根目录,用于读取 ${base.dir}/conf/ark/bootstrap.application 配置文件,默认为 ${project.basedir}--> <baseDir>../</baseDir><!-- 针对 Web 利用,设置 context path,默认为 /--> <webContextPath>/one</webContextPath> </configuration> </execution> </executions> </plugin> </plugins> </build>
-
公共 Service 实现类的模块,须要配置如下打包插件
<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 这里增加 ark 打包插件 --> <plugin> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-ark-maven-plugin</artifactId> <executions> <execution> <!--goal executed to generate executable-ark-jar --> <goals> <goal>repackage</goal> </goals> <!--ark-biz 包的打包配置 --> <configuration> <!-- 是否打包、装置和公布 ark biz,具体参考 Ark Biz 文档,默认为 false--> <attach>true</attach> <!--ark 包和 ark biz 的打包寄存目录,默认为工程 build 目录 --> <outputDirectory>target</outputDirectory> <!--default none--> <arkClassifier>executable-ark</arkClassifier> <!-- ark-biz 包的启动优先级,值越小,优先级越高 --> <priority>200</priority> <!-- 设置利用的根目录,用于读取 ${base.dir}/conf/ark/bootstrap.application 配置文件,默认为 ${project.basedir}--> <baseDir>../</baseDir> </configuration> </execution> </executions> </plugin> </plugins> </build>
如何开发?
-
通过 SOFA 容器注入 Service
- 接口实现类上必须增加
@SofaService
注解 - 在注入时须要应用
@SofaReference
注解注入,而不是应用@Autowired
或[@Resource](https://my.oschina.net/u/929718)
- 业务模块(mng)须要引入 Service 接口模块,不须要在 pom 中引入 Service 实现模块,Service 实现类所在模块须要在 SOFA 容器中启动
- Service 实现模块(provider)和业务模块(mng)的包名统一(如果配置 spring 扫描包的地位可能不须要统一,但我没尝试胜利)
- 接口实现类上必须增加
- 业务模块本身的逻辑依照失常的开发即可
-
在 IDE 中开发时,须要在业务模块(mng)的
pom.xml
中引入 Service 实现模块(provider)后,即可间接启动 mng 模块进行开发。<dependency> <groupId>io.sofastack</groupId> <artifactId>dynamic-provider</artifactId> <version>2.0.0</version> </dependency>
如何发版?
-
宿主利用的
pom.xml
中引入公共 Service 实现类模块,该模块能够在不重启宿主利用的状况下更新代码。例如:<dependency> <groupId>io.sofastack</groupId> <artifactId>dynamic-provider</artifactId> <version>2.0.0</version> <classifier>ark-biz</classifier> </dependency>
-
Service 实现类模块发版
pom.xml
中批改 version 版本,例如:1.0.0 批改为 2.0.0- 应用 maven 的 clean package 打包,打包后的
...biz.jar
文件即为 Biz 包 - 调用
installBiz
接口装置此 2.0.0 的 biz 包 - 装置胜利后,调用
switchBiz
接口切换至 2.0.0 版本即可 - 如果旧版本不须要应用,则能够调用
uninstallBiz
接口卸载对应版本
-
Controller 模块发版
- 应用 maven 的 clean package 打包,打包后的
...biz.jar
文件即为 Biz 包 - 调用进行 Spring Boot 服务的办法,进行以后模块的服务
- 调用
installBiz
接口装置新的 biz 包
- 应用 maven 的 clean package 打包,打包后的