全部产品
云市场

Java HTTP 触发器一键部署 Spring 应用

更新时间:2019-08-07 14:11:58

本文介绍如何使用 Java HTTP 触发器来快速迁移 Spring 应用,并使用函数计算提供的 fun 工具 做到真正一键部署。

您可以直接下载 Spring 集成到函数计算示例代码 测试运行

迁移 Sping 到函数计算只需以下四步:

  1. 添加 FC 入口函数
  2. 配置打包方式
  3. 部署服务和函数
  4. 测试运行

1. 添加 FC 入口函数

在 Spring 工程中添加 FC 的函数入口和函数初始化入口,代码如下:

FcHandler.java

  1. public class FcHandler implements FunctionInitializer, HttpRequestHandler {
  2. private AppLoader fcAppLoader = new FcAppLoader();
  3. /*
  4. * Request url web path
  5. * 1. Without custom domain: /2016-08-15/proxy/${YourServiceName}/${YourFunctionName}
  6. * 2. With custom domain: your mapping settings path
  7. */
  8. private String userContextPath = System.getenv("USER_CONTEXT_PATH");
  9. // Webapp home directory after inited
  10. private String appBaseDir = System.getenv("APP_BASE_DIR");
  11. @Override
  12. public void initialize(Context context) throws IOException {
  13. FunctionComputeLogger fcLogger = context.getLogger();
  14. // Config FcAppLoader
  15. fcAppLoader.setFCContext(context);
  16. if (appBaseDir != null) fcAppLoader.setBaseDir(appBaseDir);
  17. // Load code from /code
  18. fcLogger.info("Begin load code");
  19. fcAppLoader.loadCodeFromLocalProject("");
  20. fcLogger.info("End load code");
  21. // Init webapp from code
  22. long timeBegin = System.currentTimeMillis();
  23. fcLogger.info("Begin load webapp");
  24. boolean initSuccess = fcAppLoader.initApp(userContextPath, FcHandler.class.getClassLoader());
  25. if(! initSuccess) {
  26. throw new IOException("Init web app failed");
  27. }
  28. fcLogger.info("End load webapp, elapsed: " + (System.currentTimeMillis() - timeBegin) + "ms");
  29. }
  30. @Override
  31. public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context)
  32. throws IOException, ServletException {
  33. try {
  34. fcAppLoader.forward(request, response);
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }

2. 配置打包方式

请参考 Java 代码打包,在 pom.xml 中增加如下配置:

  1. <!-- Package to war -->
  2. <groupId>com.santi</groupId>
  3. <artifactId>demo-spring-hello</artifactId>
  4. <packaging>war</packaging>
  5. <version>1.0</version>
  6. <properties>
  7. <project.java.version>1.8</project.java.version>
  8. </properties>
  9. <!-- Add fc dependencies(fc-java-core/fc-java-common) -->
  10. <dependencies>
  11. <dependency>
  12. <groupId>com.aliyun.fc.runtime</groupId>
  13. <artifactId>fc-java-core</artifactId>
  14. <version>1.3.0</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>com.aliyun.fc.runtime</groupId>
  18. <artifactId>fc-java-common</artifactId>
  19. <version>2.1.0</version>
  20. </dependency>
  21. </dependencies>
  22. <build>
  23. <plugins>
  24. <plugin>
  25. <groupId>org.apache.maven.plugins</groupId>
  26. <artifactId>maven-compiler-plugin</artifactId>
  27. <version>2.3.2</version>
  28. <configuration>
  29. <source>${project.java.version}</source>
  30. <target>${project.java.version}</target>
  31. </configuration>
  32. </plugin>
  33. </plugins>
  34. </build>

3. 部署服务和函数

最后,只需在 FC 平台创建服务和函数,以及 HTTP 触发器即可。可使用 fun 工具 来自动化创建过程,对应的 yml 配置如下:

  1. ROSTemplateFormatVersion: '2015-09-01'
  2. Transform: 'Aliyun::Serverless-2018-04-03'
  3. Resources:
  4. # Create Service demo-fc-service
  5. demo-fc-service:
  6. Type: 'Aliyun::Serverless::Service'
  7. Properties:
  8. Description: 'Hello FC'
  9. Policies:
  10. - AliyunOSSFullAccess
  11. - AliyunLogFullAccess
  12. InternetAccess: true
  13. # Create function demo-spring
  14. demo-spring:
  15. Type: 'Aliyun::Serverless::Function'
  16. Properties:
  17. Initializer: com.aliyun.fc.example.FcHandler::initialize
  18. Handler: com.aliyun.fc.example.FcHandler::handleRequest
  19. Runtime: java8
  20. CodeUri: './target/demo-spring-hello-1.0.war'
  21. MemorySize: 256
  22. Timeout: 60
  23. InitializationTimeout: 60
  24. EnvironmentVariables:
  25. 'USER_CONTEXT_PATH': '/2016-08-15/proxy/demo-fc-service/demo-spring'
  26. 'APP_BASE_DIR': '/tmp'
  27. # Create http trigger
  28. Events:
  29. http: # trigger name
  30. Type: HTTP # http trigger
  31. Properties:
  32. AuthType: ANONYMOUS
  33. Methods: ['GET', 'POST']

执行

  • mvn clean package
  • fun deploy

即可部署成功

4. 测试函数运行

使用 curl 命令访问上述 deploy 生成的 url 地址:

  1. curl https://{account_id}.{region}.fc.aliyuncs.com/2016-08-15/proxy/demo-fc-service/demo-spring/

成功返回 Spring 页面spring