# sofachannel-demo-module **Repository Path**: stevens515/sofachannel-demo-module ## Basic Information - **Project Name**: sofachannel-demo-module - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-04-28 - **Last Updated**: 2022-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 该项目基于[sofachannel-demo](https://github.com/caojie09/sofachannel-demo.git)修改 ### 项目结构图 ![模块化开发](./img/模块化开发.png) ### [SOFAArk](https://www.sofastack.tech/projects/sofa-boot/sofa-ark-readme/)相关 - Ark包 = Ark容器 + Ark插件 + Biz包 - Ark包:可以理解为宿主应用打包后生成的可执行Jar包,jar包后缀为`-ark-executable.jar` - Biz包:每个模块都是一个biz包,biz包的后缀为`-ark-biz.jar`,biz包可以直接在已有的Ark容器中安装(现在通过API的方式) - API:ArkClient包含的针对Biz包的安装、卸载、切换版本功能,demo中提供了三个接口对其进行操作。 ```java @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 容器默认启动配置文件([官方文档](https://www.sofastack.tech/projects/sofa-boot/sofa-ark-ark-config/)) - 多模块开发中配置文件中必须指定宿主应用 ```properties com.alipay.sofa.ark.master.biz=master-module ``` - 模块化开发相关文档: - [JVM 服务发布与引用](https://www.sofastack.tech/projects/sofa-boot/module-service/):模块隔离后如何相关调用 - [蚂蚁金服的业务系统模块化之模块化隔离方案](https://www.sofastack.tech/blog/sofastack-modular-isolation/) - [基于 SOFABoot 进行模块化开发](https://www.sofastack.tech/blog/sofa-boot-modular-development/) ### Maven配置 - 在工程主`pom.xml`中,修改parent为 ```xml com.alipay.sofa sofaboot-dependencies 3.2.2 ``` - 宿主应用`pom.xml`中,添加依赖 ```xml com.alipay.sofa runtime-sofa-boot-starter com.alipay.sofa sofa-ark-springboot-starter com.alipay.sofa web-ark-plugin ``` 添加打包插件 ```xml com.alipay.sofa sofa-ark-maven-plugin default-cli repackage 100 ../ demo ``` - 业务模块`pom.xml`中,添加依赖 ```xml com.alipay.sofa sofa-ark-springboot-starter ``` 添加打包插件(如果是Controller层的模块,需要指定webContextPath) ```xml com.alipay.sofa sofa-ark-maven-plugin repackage true target executable-ark 200 ../ /one ``` - 公共Service实现类的模块,需要配置如下打包插件 ```xml maven-compiler-plugin 1.8 1.8 UTF-8 com.alipay.sofa sofa-ark-maven-plugin repackage true target executable-ark 200 ../ ``` ### 如何开发? - 通过SOFA容器注入Service - 接口实现类上必须添加`@SofaService`注解 - 在注入时需要使用`@SofaReference`注解注入,而不是使用`@Autowired`或`@Resource` - 业务模块(mng)需要引入Service接口模块,不需要在pom中引入Service实现模块,Service实现类所在模块需要在SOFA容器中启动 - Service实现模块(provider)和业务模块(mng)的包名一致(如果配置spring扫描包的位置可能不需要一致,但我没尝试成功) - 业务模块自身的逻辑按照正常的开发即可 - 在IDE中开发时,需要在业务模块(mng)的`pom.xml`中引入Service实现模块(provider)后,即可直接启动mng模块进行开发。 ```xml io.sofastack dynamic-provider 2.0.0 ``` ### 如何发版? - 宿主应用的`pom.xml`中引入公共Service实现类模块,该模块可以在不重启宿主应用的情况下更新代码。例如: ```xml io.sofastack dynamic-provider 2.0.0 ark-biz ``` - 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包