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打包,打包后的