乐趣区

关于java:使用SOFABootSOFAArk进行模块化开发

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 包
退出移动版