# 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)修改
### 项目结构图

### [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包