短任务占资源、低频 API 耗成本?混合架构方案:微服务扛核心,Serverless 接弹性需求

微服务演进模式:混合架构(微服务 + Serverless)

在微服务架构逐渐成熟的今天,许多团队开始探索 Serverless 的应用。Serverless 不仅代表"无服务器",更强调 按需计算、自动伸缩、按使用计费 的模式。当微服务与 Serverless 结合,形成的 混合架构 能同时兼顾灵活性与弹性,成为越来越多企业的选择。


一、为什么要引入 Serverless?

微服务的优势

  • 清晰的业务边界,独立部署;
  • 支持不同的技术栈;
  • 配合容器化(Kubernetes、Istio)拥有良好的可扩展性。

微服务的挑战

  • 运维复杂:几十甚至上百个服务,需要团队投入大量精力维护;
  • 短生命周期任务(如定时任务、文件处理)不适合长期运行的容器;
  • 部分流量低频场景(例如注册、冷门 API)运行成本偏高。

Serverless 的优势

  • 事件驱动:按需触发,不必一直运行;
  • 成本友好:空闲时几乎零成本;
  • 天然弹性:不需要额外配置,函数即可水平扩展。

➡️ 结论:微服务适合核心、常驻的业务逻辑,Serverless 适合边缘、弹性任务。结合两者,就能形成"核心稳定,边缘灵活"的混合架构。


二、典型混合架构模式

  1. API Gateway + 微服务 + Serverless

    • 微服务处理核心业务;

    • Serverless 负责突发性或边缘性任务;

    • API Gateway(如 Spring Cloud Gateway、AWS API Gateway)统一入口。

      Client -> API Gateway ->
      ├── 微服务集群(Kubernetes)
      └── Serverless 函数(FaaS)

  2. 事件驱动混合架构

    • 微服务发布事件到消息队列(Kafka、RabbitMQ);
    • Serverless 消费特定事件,执行短任务(如图片压缩、日志分析)。
  3. 批处理/任务型 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 调用远端函数。


五、最佳实践

  1. 边界清晰

    • 核心高频业务继续跑在微服务;
    • 周边低频、弹性业务迁移到 Serverless。
  2. 统一网关与安全

    • API Gateway 统一鉴权与路由,避免前端直接调用函数暴露风险。
  3. 日志与监控一体化

    • 使用 OpenTelemetry 将微服务与 Serverless 的调用链路串联,避免排障困难。
  4. 成本监控

    • Serverless 虽然"用多少算多少",但高并发下也可能成本失控,需要配合预算监控。

六、总结

  • 微服务与 Serverless 的混合架构是一种 渐进式演进模式 ,兼顾了 稳定性弹性
  • 微服务专注于 常驻、复杂、核心业务
  • Serverless 适合 事件驱动、低频、弹性任务
  • 二者结合可以实现:稳定核心 + 灵活边缘 + 成本优化
相关推荐
JMchen1238 小时前
现代Android图像处理管道:从CameraX到OpenGL的60fps实时滤镜架构
android·图像处理·架构·kotlin·android studio·opengl·camerax
Jing_jing_X11 小时前
CPU 架构:x86、x64、ARM 到底是什么?为什么程序不能通用?
arm开发·架构·cpu
qq_1777673713 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
m0_7400437313 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
小程故事多_8014 小时前
深度搜索Agent架构全解析:从入门到进阶,解锁复杂问题求解密码
人工智能·架构·aigc
●VON15 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
Gary董15 小时前
高并发的微服务架构如何设计
微服务·云原生·架构
东哥爱编程15 小时前
使用Runpod进行gpu serverless推理
云原生·serverless
ujainu15 小时前
Flutter + OpenHarmony 实战:《圆环跳跃》——完整游戏架构与视觉优化
flutter·游戏·架构·openharmony
爬山算法16 小时前
Hibernate(74)如何在CQRS架构中使用Hibernate?
java·架构·hibernate