更新时间:2024-08-09 GMT+08:00
分享

构建程序

  1. 通过Web托管方式改造微服务。改造过程中,如果微服务是基于spring框架,则需要使用FunctionGraph提供的SDK,即在pom.xml文件中添加步骤1中依赖。此时,您只需修改配置以及打包方式即可将微服务改造成serverless函数。具体操作步骤如下:

    1. 配置微服务依赖。
      在项目工程的pom.xml文件中添加如下依赖:
      <dependency>
          <groupId>com.huawei.yuanrong</groupId>
          <artifactId>microservice-function-functiongraph</artifactId>
          <version>${version} </version>
      </dependency>
    2. 配置微服务打包配置。
      1. 在微服务的pom.xml(即步骤1中的pom)文件中配置maven-assembly-plugin作为打包插件。
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>
                <executions>
                    <execution>
                        <id>auto-deploy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>src/main/assembly/zip_file.xml</descriptor>
                            </descriptors>
                            <finalName>${package.finalName}</finalName>
                            <outputDirectory>${package.outputDirectory}</outputDirectory>
                            <archiverConfig>
                                <directoryMode>0700</directoryMode>
                                <fileMode>0600</fileMode>
                                <defaultDirectoryMode>0700</defaultDirectoryMode>
                            </archiverConfig>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
      2. 在微服务项目创建src/main/assembly/zip_file.xml,并写入如下代码:
        <?xml version="1.0" encoding="UTF-8"?>
        
        <assembly
                xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
        >
        
            <id>auto-deploy</id>
        
            <baseDirectory></baseDirectory>
        
            <formats>
                <format>zip</format>
            </formats>
        
            <!--配置统一打包到config目录,不要修改,不然找不到-->
            <fileSets>
                <fileSet>
                    <directory>src/main/resources/</directory>
                    <outputDirectory>config</outputDirectory>
                    <includes>
                        <include>**</include>
                    </includes>
                    <fileMode>0600</fileMode>
                    <directoryMode>0700</directoryMode>
                </fileSet>
        
            </fileSets>
        
            <!--jar包统一打包到lib目录,不要修改,不然找不到-->
            <dependencySets>
                <dependencySet>
                    <outputDirectory>lib</outputDirectory>
                    <scope>runtime</scope>
                </dependencySet>
            </dependencySets>
        </assembly>

        12执行完成后,文件的项目结构如图1所示。

        图1 项目结构
    3. 构建出包。
      在项目根目录直接执行mvn clean package或者使用IDEA的打包方式,如图2所示。
      图2 IDEA打包

      完成后会在target目录下,生成一个${project.parent.artifactId}-${project.version}-serverless.zip包,如图3所示。
      图3 serverless.zip包
    4. 部署函数。
      在准备步骤1中,已经创建了一个名为mfa-service-serverless的Java函数,现在需要将打包好的项目包上传到函数中,如图4所示。
      图4 项目包上传
      图5 选择zip文件

      若zip包超过40M,需要通过OBS方式上传,如图6所示。

      • 进入对象存储服务,选择一个已有桶,或者创建新的桶。
      • 将步骤1.c中打包好的mfa-services-0.0.1-SNAPSHOT-serverless.zip包上传。
        图6 上传对象
      • 获取对象地址,如图7所示。
        图7 对象地址
      • 通过obs上传代码包,如图8所示。
        图8 上传代码包
    5. 配置函数常规配置,如图9所示。
      图9 常规设置
      • 通过托管方式改造的函数入口统一固定为:com.huawei.yuanrong.function.Handler.handleRestRequest。
      • 执行超时时间和内存可以根据业务属性配置。超时时间表示,当请求执行超过该配置时间时,该次请求会因为超时而失败;内存根据业务运行过程中所需的内存大小配置,当内存使用超过该配置值时,函数实例可能会被杀掉而导致请求失败。
    6. 配置环境变量。

      通过托管方式改造,需要统一配置以下两个参数:

      • spring_start_class:SpringBoot的启动类名,如图10所示。
        图10 Mfa-services启动类截图
      • cxf_enabled:CXF应用(典型的有Jalor)为true,否则为false。
      • mfa-services的启动类是MfaMainApplication。
      • 配置其他环境变量。

        用户后续可以通过System.getProperty(“key”)的方式,获取到这里配置的环境变量。在传统微服务启动时,支持指定命令行参数,如java -Dfoo=bar xxx.jar。在Serverless函数部署时,可以通过环境变量的方式配置这些参数。

      以上环境变量参数配置,如下图11所示。

      图11 环境变量
    7. 配置函数初始化入口。

      可选操作,在开启“快照式冷启动”或“预留实例”功能时为必选。函数初始化入口为固定配置:com.huawei.yuanrong.function.Handler.initializer,如图12所示。

      图12 函数初始化入口配置
    8. 开启预留实例或者快照式冷启动。

      通过预留实例,或者快照式冷启动功能,可以加速函数启动时间,减少请求时延。预留实例使用可参考预留实例管理,快照式冷启动使用可参考配置快照式冷启动

  2. 通过独立函数方式改造微服务。

    直接函数化改造,是将微服务业务代码迁移到云函数内,基于spring框架的微服务需要剥离spring才能将微服务改造成serverless函数。

    1. 新建一个全新的maven工程,如图13所示。
      图13 新建maven工程
    2. 业务代码迁移。

      将原项目代码迁移至新项目,文件目录与原项目相同,删除使用的spring框架自动注入的标签。自动注入的类,需要用户自己创建对象。新创建的pom.xml中dependency应该为空,迁移过程中根据需要添加依赖,不用的jar包尽量不引入,根据需要在pom.xml中添加jar包依赖。

    3. 新增函数平台依赖,引入请求参数和响应类。
      在pom文件中添加如下依赖:
      <dependency>
          <groupId>com.huawei.serverless</groupId>
          <artifactId>RunTime</artifactId>
          <version>1.1.9</version>
      </dependency>
    4. 编写函数执行入口类。

      以新建AdjustmentHandler类为例,原有接口为executeQueryAndUploadWithParam,将去spring之后的原有的executeQueryAndUploadWithParam接口逻辑放到AdjustmentHandler类中的executeQueryAndUploadWithParam方法中进行调用。

      原逻辑和现逻辑分别如图14图15所示:
      图14 原逻辑
      图15 现逻辑
    5. 本地测试。
      将接口调用逻辑在本地通过main函数进行测试,如图16所示。验证通过后再上线函数平台测试。
      图16 main函数
    6. 配置函数。
      • 参照准备中创建函数的步骤,创建以mfa-import-serverless命名的函数。
      • 重复托管方式改造中2-4步骤,上传函数代码包。
      • 配置函数入口,入口为包名.类名.方法名,举个例子:com.huawei.xxxx.xxx.AdjustmentHandler.executeQueryAndUploadWithParam。
      • 配置函数环境变量:无需再配置spring_start_class和cxf_enabled,业务按需配置其它的环境变量。
      • 配置函数初始化入口。可选,用户可以自定义函数初始化时(接收请求之前)需要进行的操作。一个例子:

        public void initFunction(Context context) {

        // 业务自身逻辑,可以去远程拉取一些配置数据等

        }

        配置初始化入口:包名.类名.方法名,如图17所示。

        图17 函数初始化入口
      • 开启预留实例/快照式冷启动功能,与步骤8相同。

相关文档