微服务演进模式:混合架构(微服务 + Serverless)
在微服务架构逐渐成熟的今天,许多团队开始探索 Serverless 的应用。Serverless 不仅代表"无服务器",更强调 按需计算、自动伸缩、按使用计费 的模式。当微服务与 Serverless 结合,形成的 混合架构 能同时兼顾灵活性与弹性,成为越来越多企业的选择。
一、为什么要引入 Serverless?
微服务的优势
- 清晰的业务边界,独立部署;
- 支持不同的技术栈;
- 配合容器化(Kubernetes、Istio)拥有良好的可扩展性。
微服务的挑战
- 运维复杂:几十甚至上百个服务,需要团队投入大量精力维护;
- 短生命周期任务(如定时任务、文件处理)不适合长期运行的容器;
- 部分流量低频场景(例如注册、冷门 API)运行成本偏高。
Serverless 的优势
- 事件驱动:按需触发,不必一直运行;
- 成本友好:空闲时几乎零成本;
- 天然弹性:不需要额外配置,函数即可水平扩展。
➡️ 结论:微服务适合核心、常驻的业务逻辑,Serverless 适合边缘、弹性任务。结合两者,就能形成"核心稳定,边缘灵活"的混合架构。
二、典型混合架构模式
-
API Gateway + 微服务 + Serverless
-
微服务处理核心业务;
-
Serverless 负责突发性或边缘性任务;
-
API Gateway(如 Spring Cloud Gateway、AWS API Gateway)统一入口。
Client -> API Gateway ->
├── 微服务集群(Kubernetes)
└── Serverless 函数(FaaS)
-
-
事件驱动混合架构
- 微服务发布事件到消息队列(Kafka、RabbitMQ);
- Serverless 消费特定事件,执行短任务(如图片压缩、日志分析)。
-
批处理/任务型 Serverless
- 将不适合常驻的任务(如数据清洗、报表生成)迁移到 Serverless;
- 微服务只负责任务调度与结果汇总。
三、代码示例:Spring Boot 微服务调用 AWS Lambda
1. 定义 AWS Lambda 函数
java
public class HelloLambda implements RequestHandler<Map<String,String>, String> {
@Override
public String handleRequest(Map<String,String> input, Context context) {
return "Hello from Lambda, user=" + input.get("user");
}
}
部署后生成 arn:aws:lambda:...:function:HelloLambda。
2. 在 Spring Boot 微服务中调用 Lambda
java
@Service
public class LambdaService {
private final AWSLambda awsLambda;
public LambdaService(AWSLambda awsLambda) {
this.awsLambda = awsLambda;
}
public String invokeHelloLambda(String user) {
InvokeRequest req = new InvokeRequest()
.withFunctionName("HelloLambda")
.withPayload("{\"user\":\"" + user + "\"}");
InvokeResult result = awsLambda.invoke(req);
return new String(result.getPayload().array(), StandardCharsets.UTF_8);
}
}
3. 配置 AWS SDK
xml
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-lambda</artifactId>
<version>1.12.700</version>
</dependency>
四、代码示例:Spring Boot 微服务调用腾讯云 Serverless 函数
1. 定义腾讯云 SCF 函数
在腾讯云 SCF 控制台新建一个 Java 函数,例如 HelloSCF:
java
package example;
import com.qcloud.services.scf.runtime.Context;
import com.qcloud.services.scf.runtime.RequestHandler;
import java.util.Map;
public class HelloSCF implements RequestHandler<Map<String, String>, String> {
@Override
public String handleRequest(Map<String, String> input, Context context) {
String user = input.getOrDefault("user", "Guest");
return "Hello from Tencent SCF, user=" + user;
}
}
部署完成后,会生成函数名称和调用入口,例如:
scf-function-name: HelloSCF
namespace: default
2. 在 Spring Boot 微服务中调用 SCF
java
@Service
public class ScfService {
private final ScfClient client;
public ScfService() {
// 使用腾讯云官方 SDK 初始化 SCF 客户端
Credential cred = new Credential("YourSecretId", "YourSecretKey");
this.client = new ScfClient(cred, "ap-guangzhou"); // 地域可替换
}
public String invokeHelloScf(String user) throws TencentCloudSDKException {
InvokeRequest req = new InvokeRequest();
req.setFunctionName("HelloSCF");
// 输入参数 JSON
req.setClientContext("{\"user\":\"" + user + "\"}");
InvokeResponse resp = client.Invoke(req);
return resp.getResult().getRetMsg();
}
}
3. 引入腾讯云 SDK 依赖(Maven)
xml
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.1001</version>
</dependency>
4. 控制器示例
java
@RestController
@RequestMapping("/scf")
public class ScfController {
private final ScfService scfService;
public ScfController(ScfService scfService) {
this.scfService = scfService;
}
@GetMapping("/hello/{user}")
public String hello(@PathVariable String user) throws Exception {
return scfService.invokeHelloScf(user);
}
}
启动 Spring Boot 后,调用:
GET http://localhost:8080/scf/hello/Alice
返回:
Hello from Tencent SCF, user=Alice
✅ 这样就实现了 Spring Boot 微服务调用腾讯云 Serverless(SCF)函数 的完整链路。
相比 AWS Lambda,这里最大的差异是:腾讯云 SDK 需要用 SecretId + SecretKey 初始化 ScfClient,并通过 InvokeRequest 调用远端函数。
五、最佳实践
-
边界清晰
- 核心高频业务继续跑在微服务;
- 周边低频、弹性业务迁移到 Serverless。
-
统一网关与安全
- API Gateway 统一鉴权与路由,避免前端直接调用函数暴露风险。
-
日志与监控一体化
- 使用 OpenTelemetry 将微服务与 Serverless 的调用链路串联,避免排障困难。
-
成本监控
- Serverless 虽然"用多少算多少",但高并发下也可能成本失控,需要配合预算监控。
六、总结
- 微服务与 Serverless 的混合架构是一种 渐进式演进模式 ,兼顾了 稳定性 与 弹性;
- 微服务专注于 常驻、复杂、核心业务;
- Serverless 适合 事件驱动、低频、弹性任务;
- 二者结合可以实现:稳定核心 + 灵活边缘 + 成本优化。