
# 构建程序
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>
         ```
         [1]和[2]执行完成后，文件的项目结构如[图1]所示。
         图1项目结构   
         ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165183965.png "点击放大") 
       
   
   3. 构建出包。
      在项目根目录直接执行mvn clean package或者使用IDEA的打包方式，如[图2]所示。
      图2IDEA打包   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165183961.png)
      
      完成后会在target目录下，生成一个${project.parent.artifactId}-${project.version}-serverless.zip包，如[图3]所示。
      图3serverless.zip包   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129786010.png "点击放大") 
   
   4. 部署函数。
      在准备[步骤1](https://support.huaweicloud.com/bestpractice-functiongraph/functiongraph_05_1114.html#functiongraph_05_1114__li93101524577)中，已经创建了一个名为mfa-service-serverless的Java函数，现在需要将打包好的项目包上传到函数中，如[图4]所示。
      图4项目包上传   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129944182.png "点击放大")
      图5选择zip文件   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165305509.png "点击放大")
      若zip包超过40M，需要通过OBS方式上传，如[图6]所示。
      - 进入对象存储服务，选择一个已有桶，或者创建新的桶。
      
      - 将步骤[1.c]中打包好的mfa-services-0.0.1-SNAPSHOT-serverless.zip包上传。
        图6上传对象   
        ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129786030.png "点击放大") 
      
      - 获取对象地址，如[图7]所示。
        图7对象地址   
        ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129944178.png "点击放大") 
      
      - 通过obs上传代码包，如[图8]所示。
        图8上传代码包   
        ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129944186.png "点击放大") 
       
   
   5. 配置函数常规配置，如[图9]所示。
      图9常规设置   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129944198.png "点击放大")
      - 通过托管方式改造的函数入口统一固定为：com.huawei.yuanrong.function.Handler.handleRestRequest。
      
      - 执行超时时间和内存可以根据业务属性配置。超时时间表示，当请求执行超过该配置时间时，该次请求会因为超时而失败；内存根据业务运行过程中所需的内存大小配置，当内存使用超过该配置值时，函数实例可能会被迫停止而导致请求失败。
       
   
   6. 配置环境变量。 通过托管方式改造，需要统一配置以下两个参数：
      - spring_start_class：SpringBoot的启动类名，如[图10]所示。
        图10Mfa-services启动类截图   
        ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129786018.png "点击放大") 
      
      
      
      - cxf_enabled：CXF应用（典型的有Jalor）为true，否则为false。
      
      - mfa-services的启动类是MfaMainApplication。
      
      - 配置其他环境变量。 用户后续可以通过System.getProperty("key")的方式，获取到这里配置的环境变量。在传统微服务启动时，支持指定命令行参数，如java -Dfoo=bar xxx.jar。在Serverless函数部署时，可以通过环境变量的方式配置这些参数。
        
      
      
      以上环境变量参数配置，如下[图11]所示。
      图11环境变量   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165305525.png "点击放大") 
   
   7. 配置函数初始化入口。 可选操作，在开启"快照式冷启动"或"预留实例"功能时为必选。函数初始化入口为固定配置：com.huawei.yuanrong.function.Handler.initializer，如[图12]所示。
      图12函数初始化入口配置   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165183949.png "点击放大") 
   
   8. 开启预留实例或者快照式冷启动。
      通过预留实例，或者快照式冷启动功能，可以加速函数启动时间，减少请求时延。预留实例使用可参考[预留实例管理](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1837.html)，快照式冷启动使用可参考[配置快照式冷启动](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1884.html)。
      
   
   
   
   
2. 通过独立函数方式改造微服务。 
   直接函数化改造，是将微服务业务代码迁移到云函数内，基于spring框架的微服务需要剥离spring才能将微服务改造成serverless函数。
   1. 新建一个全新的maven工程，如[图13]所示。
      图13新建maven工程   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165183953.png "点击放大") 
   
   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原逻辑   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165305517.png "点击放大")
      图15现逻辑   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002165305505.png "点击放大") 
   
   5. 本地测试。
      将接口调用逻辑在本地通过main函数进行测试，如[图16]所示。验证通过后再上线函数平台测试。
      图16main函数   
      ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129944174.png "点击放大") 
   
   6. 配置函数。
      - 参照[准备](https://support.huaweicloud.com/bestpractice-functiongraph/functiongraph_05_1114.html)中创建函数的步骤，创建以mfa-import-serverless命名的函数。
      
      - 重复托管方式改造中[2]-[4]步骤，上传函数代码包。
      
      - 配置函数入口，入口为包名.类名.方法名，举个例子：com.huawei.xxxx.xxx.AdjustmentHandler.executeQueryAndUploadWithParam。
      
      - 配置函数环境变量：无需再配置spring_start_class和cxf_enabled，业务按需配置其它的环境变量。
      
      - 配置函数初始化入口。可选，用户可以自定义函数初始化时（接收请求之前）需要进行的操作。一个例子： public void initFunction(Context context) {
        // 业务自身逻辑，可以去远程拉取一些配置数据等
        }
        配置初始化入口：包名.类名.方法名，如[图17]所示。
        图17函数初始化入口   
        ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129944190.png "点击放大") 
      
      - 开启预留实例/快照式冷启动功能，与步骤[8]相同。
       
   
   
   
   
 
