短任务占资源、低频 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 适合 事件驱动、低频、弹性任务
  • 二者结合可以实现:稳定核心 + 灵活边缘 + 成本优化
相关推荐
GeminiJM6 小时前
优化Elasticsearch批量写入性能:从单分片瓶颈到多索引架构
elasticsearch·架构·jenkins
肖恩不是小羊丶6 小时前
基于CocosCreator的ECS实现架构说明
架构·cocos creator
绝无仅有7 小时前
某游戏大厂计算机网络面试问题深度解析(一)
后端·面试·架构
喜欢吃豆9 小时前
掌握本地化大语言模型部署:llama.cpp 工作流与 GGUF 转换内核全面技术指南
人工智能·语言模型·架构·大模型·llama·llama.cpp·gguf
Light6010 小时前
数据模型全解:从架构之心到AI时代的智慧表达
人工智能·架构·数据模型·三层架构·数仓建模·ai辅助·业务翻译
Wang's Blog19 小时前
Nestjs框架: 微服务容器化部署与网络通信解决方案
docker·微服务·云原生·架构·nestjs
小马哥编程20 小时前
【软考架构】案例分析-对比MySQL查询缓存与Memcached
java·数据库·mysql·缓存·架构·memcached
EnCi Zheng20 小时前
阿里巴巴六边形架构-从解耦到可测试的架构设计利器
架构
绝无仅有1 天前
某游戏大厂的常用面试问题解析:Netty 与 NIO
后端·面试·架构