Springboot
Spring Boot 是基于 Spring 框架的快速开发脚手架,它简化了 Spring 应用的创建和部署过程。Spring Boot 提供了自动配置、内嵌服务器、生产就绪的特性监控等功能,让开发者能够快速构建独立的、生产级别的 Spring 应用程序。
本指南介 绍如何在 CloudBase HTTP 云函数上部署 Gin 应用程序。
示例源码请参考: cloudrun-springboot
前置条件
在开始之前,请确保您已经:
- 安装了 JDK 8 或更高版本
- 安装了 Maven 3.6+ 或 Gradle
- 拥有腾讯云账号并创建了云开发环境
- 了解基本的 Java 和 Spring Boot 开发知识
第一步:创建 Spring Boot 应用
💡 提示:如果您已经有一个 Spring Boot 应用,可以跳过此步骤。
使用 Spring Initializr 创建项目
- 访问 start.spring.io
- 选择以下配置:
Project: Maven
Language: Java
Spring Boot: 2.7.18 (或最新稳定版)
Project Metadata:
- Group: com.tencent
- Artifact: cloudrun-springboot
- Name: cloudrun-springboot
- Description: Demo project for Spring Boot
- Package name: com.tencent.cloudrun
- Packaging: Jar
- Java: 8
Dependencies:
- Spring Web
- Spring Boot Actuator (健康检查)
- 点击 GENERATE 下载项目压缩包
- 解压到本地目录
使用 Maven 命令创建(可选)
mvn archetype:generate \
-DgroupId=com.tencent.cloudrun \
-DartifactId=cloudrun-springboot \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
cd cloudrun-springboot
配置 pom.xml 文件
如果使用 Maven 命令创建项目,需要手动配置 pom.xml 文件以支持 Spring Boot:
<?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.7.18</version>
<relativePath/>
</parent>
<groupId>com.tencent.cloudrun</groupId>
<artifactId>cloudrun-springboot</artifactId>
<version>1.0-SNAPSHOT</version>
<name>cloudrun-springboot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</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-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建主应用类
如果使用 Maven 命令创建项目,还需要创建 Spring Boot 主应用类。
在 src/main/java/com/tencent/cloudrun 目录下创建 CloudrunApplication.java:
package com.tencent.cloudrun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CloudrunApplication {
public static void main(String[] args) {
SpringApplication.run(CloudrunApplication.class, args);
}
}
本地测试应用
进入项目目录并启动应用:
cd cloudrun-springboot
mvn spring-boot:run
打开浏览器访问 http://localhost:8080,您应该能看到 Spring Boot 默认页面。
第二步:添加 API 接口
让我们创建一些 RESTful API 来演示 Spring Boot 的功能。
创建用户实体类
在 src/main/java/com/tencent/cloudrun/entity 目录下创建 User.java:
package com.tencent.cloudrun.entity;
public class User {
private Long id;
private String name;
private String email;
// 构造函数
public User() {}
public User(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
// Getter 和 Setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
创建响应包装类
在 src/main/java/com/tencent/cloudrun/dto 目录下创建 ApiResponse.java:
package com.tencent.cloudrun.dto;
public class ApiResponse<T> {
private boolean success;
private String message;
private T data;
public ApiResponse(boolean success, String message, T data) {
this.success = success;
this.message = message;
this.data = data;
}
public static <T> ApiResponse<T> success(T data) {
return new ApiResponse<>(true, "操作成功", data);
}
public static <T> ApiResponse<T> error(String message) {
return new ApiResponse<>(false, message, null);
}
// Getter 和 Setter
public boolean isSuccess() { return success; }
public void setSuccess(boolean success) { this.success = success; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public T getData() { return data; }
public void setData(T data) { this.data = data; }
}
创建用户控制器
在 src/main/java/com/tencent/cloudrun/controller 目录下创建 UserController.java:
package com.tencent.cloudrun.controller;
import com.tencent.cloudrun.dto.ApiResponse;
import com.tencent.cloudrun.entity.User;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
@RestController
@RequestMapping("/api/users")
public class UserController {
private final List<User> users = new ArrayList<>();
private final AtomicLong counter = new AtomicLong();
public UserController() {
// 初始化测试数据
users.add(new User(counter.incrementAndGet(), "张三", "zhangsan@example.com"));
users.add(new User(counter.incrementAndGet(), "李四", "lisi@example.com"));
users.add(new User(counter.incrementAndGet(), "王五", "wangwu@example.com"));
}
@GetMapping
public ApiResponse<List<User>> getAllUsers(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int limit) {
int startIndex = (page - 1) * limit;
int endIndex = Math.min(startIndex + limit, users.size());
if (startIndex >= users.size()) {
return ApiResponse.success(new ArrayList<>());
}
List<User> paginatedUsers = users.subList(startIndex, endIndex);
return ApiResponse.success(paginatedUsers);
}
@GetMapping("/{id}")
public ApiResponse<User> getUserById(@PathVariable Long id) {
User user = users.stream()
.filter(u -> u.getId().equals(id))
.findFirst()
.orElse(null);
if (user == null) {
return ApiResponse.error("用户不存在");
}
return ApiResponse.success(user);
}
@PostMapping
public ApiResponse<User> createUser(@RequestBody User user) {
if (user.getName() == null || user.getEmail() == null) {
return ApiResponse.error("姓名和邮箱不能为空");
}
user.setId(counter.incrementAndGet());
users.add(user);
return ApiResponse.success(user);
}
}
创建健康检查控制器
在 src/main/java/com/tencent/cloudrun/controller 目录下创建 HealthController.java:
package com.tencent.cloudrun.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@RestController
public class HealthController {
@GetMapping("/health")
public Map<String, Object> health() {
Map<String, Object> health = new HashMap<>();
health.put("status", "healthy");
health.put("timestamp", LocalDateTime.now());
health.put("framework", "Spring Boot");
health.put("version", getClass().getPackage().getImplementationVersion());
health.put("java_version", System.getProperty("java.version"));
return health;
}
@GetMapping("/")
public Map<String, String> home() {
Map<String, String> response = new HashMap<>();
response.put("message", "欢迎使用 Spring Boot CloudBase 应用!");
response.put("status", "running");
return response;
}
}
配置应用属性
编辑 src/main/resources/application.properties:
# 服务器配置
server.port=${PORT:8080}
server.servlet.context-path=/
# 应用配置
spring.application.name=cloudrun-springboot
management.endpoints.web.exposure.include=health,info
# 日志配置
logging.level.com.tencent.cloudrun=INFO
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
第三步:本地测试
启动应用
mvn spring-boot:run
测试 API 接口
# 测试健康检查
curl http://localhost:8080/health
# 测试首页
curl http://localhost:8080/
# 测试用户列表
curl http://localhost:8080/api/users
# 测试分页
curl "http://localhost:8080/api/users?page=1&limit=2"
# 测试获取单个用户
curl http://localhost:8080/api/users/1
# 测试创建用户
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{"name":"新用户","email":"newuser@example.com"}'
第四步: 准备部署文件
HTTP 云函数需要 scf_bootstrap 启动脚本和特定的端口配置。
1. 修改应用配置
编辑 src/main/resources/application.properties,确保云函数环境使用 9000 端口:
# 云函数端口配置(默认 8080,云函数环境使用 9000)
server.port=${PORT:8080}
server.servlet.context-path=/
# 应用配置
spring.application.name=cloudrun-springboot
management.endpoints.web.exposure.include=health,info
⚠️ 重要提示:CloudBase HTTP 云函数要求应用监听 9000 端口,通过环境变量
PORT=9000来控制。
2. 创建启动脚本
💡 注意:
- 在 windows 下创建
scf_bootstrap文件时,优先使用nano scf_bootstrap或者vim scf_bootstrap创建- 在 windows 下使用 vscode 创建
scf_bootstrap文件时,部署到 HTTP 云函数可能会报错:scf_bootstrap文件不存在- 这个错误是因为脚本文件包含了 Windows 格式的回车符(^M),导致 Linux 无法正确识别解释器路径。这是 WSL 中常见的问题
创建 scf_bootstrap 文件(无扩展名):
#!/bin/bash
export PORT=9000
export JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC"
java $JAVA_OPTS -jar *.jar
💡 说明:
- 使用
*.jar通配符来匹配当前目录下的 JAR 包- CloudBase 云函数会将上传的文件解压到工作目录,JAR 包直接位于当前目录下
为启动脚本添加执行权限:
chmod +x scf_bootstrap
3. 构建 JAR 包
mvn clean package -DskipTests
4. 项目结构
cloudrun-springboot/
├── src/
│ └── main/
│ ├── java/
│ └── resources/
├── target/
│ └── *.jar # 构建产物(如:cloudrun-springboot-1.0-SNAPSHOT.jar)
├── pom.xml
├── scf_bootstrap # 🔑 云函数启动脚本
└── README.md
💡 说明:
scf_bootstrap是 CloudBase 云函数的启动脚本- 云函数会将上传的文件解压到工作目录,JAR 包直接位于当前目录下
- 设置
PORT=9000环境变量确保应用监听正确端口- 配置 JVM 参数优化内存使用