函数计算,就是不需要购买服务器,可以直接布署程序的一个功能,就是将自己开发的springboot程序打包好直接上传可访问。腾讯云和阿里云都有函数计算(腾讯云叫云函数)
腾讯云函数还是比较复杂的,打包是用maven-shade-plugin,还需要创建一个继承AbstractSpringHandler类的子类作为启动类,jar的同目录下还需要创建serverless.yml等配置文件,相当复杂。我是按照文档进行开发,可是最终只能用官方的例子才可以启动,自己用springboot的项目却启动不成功。
无奈之下改用阿里云的函数计算(对应腾讯云的云函数),阿里云这个相对简单,打成的jar包可以用springboot默认的spring-boot-maven-plugin,也不需要创建Handler类作为启动类,也就是直接把自己开发的springboot扔上去就可以了。
开发步骤:
1、登录阿里云官网https://www.aliyun.com/
2、用搜索功能搜索“函数计算”
3、选择:应用中心-->Web应用框架-->Java Web
4、这是新建一个web应用,有三种选择方式,代码包、文件夹、使用示例程序。在例用示例程序那里的源代码按钮,可以看到下载下来的是一个标准的spring-boot-maven-plugin打包的jar包
5、我们要运行的是自己的jar包,所以选择“代码包”这一项。为方便起见,默认配置的9000端口也不要改,我们的springboot程序也用9000这个端口。(我自己试过改成8080端口,却报了一个找不到9000端口的错误,但我在配置中的确是已经修改了8080端口)
#!/usr/bin/env bash
export PORT=9000
java -jar -Dserver.port=$PORT code.jar
看这些代码,有点像创建了一个docker镜像,然后在镜像中启动java程序
springboot的yml配置文件如下:
server:
port: 9000
下图为我改了端口8080,却报错的截图:
6、最后点击布署就可以了,它会自动布署,并返回一个可以访问的地址:
7、代码:
项目结构:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>ali-fc-demo</artifactId>
<name>demo</name>
<description>阿里云函数示例</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 9000
DemoApplication
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
DemoController
package com.example.demo.controller;
import javax.servlet.http.HttpServletRequest;
import com.example.demo.util.ResultJSONObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/demo")
public class DemoController{
@GetMapping("/test")
public @ResponseBody
ResultJSONObject test(HttpServletRequest request) throws Exception {
return ResultJSONObject.success("这是云函数测试");
}
}
ResultJSONObject
package com.example.demo.util;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
public class ResultJSONObject {
private String status; //状态码
private String message; //状态信息
private Object data; //返回数据
public ResultJSONObject(String status, String message, Object data) {
super();
this.status = status;
this.message = message;
this.data = data;
}
/**
* 成功
* @param object
* @return
*/
public static ResultJSONObject success(Object object) {
String msg = "ok";
if(null != object) {
if(object instanceof String) {
msg = (String) object;
}
}
return new ResultJSONObject("200", msg, object);
}
/**
* 成功
* @param object
* @return
*/
public static ResultJSONObject success(String message, Object object) {
return new ResultJSONObject("200", message, object);
}
public ResultJSONObject() {
super();
}
/**
* 200(ok)
* 500(Exception)
* 404(Exception)
*/
public String getStatus() {
return status;
}
/**
* 200(ok)
* 500(Exception)
* 404(Exception)
*/
public void setStatus(String status) {
this.status = status;
}
/**
* ok(200)
* Exception(404、500)
*/
public String getMessage() {
return message;
}
/**
* ok(200)
* Exception(404、500)
*/
public void setMessage(String message) {
this.message = message;
}
/**
* 自定义的数据返回
* @return
*/
public Object getData() {
return data;
}
/**
* 自定义的数据返回
* @param data
*/
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return "ResultJSONObject [status=" + status + ", message=" + message + ", data=" + data + "]";
}
}
以上就是配置过程