短任务占资源、低频 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 适合 事件驱动、低频、弹性任务
  • 二者结合可以实现:稳定核心 + 灵活边缘 + 成本优化
相关推荐
云空30 分钟前
《解码机器人操作系统:从核心架构到未来趋势的深度解析》
架构·机器人
_oP_i5 小时前
Docker 整体架构
docker·容器·架构
canonical_entropy5 小时前
Nop入门:增加DSL模型解析器
spring boot·后端·架构
jinxinyuuuus6 小时前
局域网文件传输:WebRTC与“去中心化应用”的架构思想
架构·去中心化·webrtc
狗哥哥6 小时前
从零到一:打造企业级 Vue 3 高性能表格组件的设计哲学与实践
前端·vue.js·架构
小马哥编程6 小时前
【软考架构】滑动窗口限流算法的原理是什么?
java·开发语言·架构
西格电力科技7 小时前
面向工业用户的绿电直连架构适配技术:高可靠与高弹性的双重设计
大数据·服务器·人工智能·架构·能源
北邮刘老师8 小时前
【智能体互联协议解析】ACPs/AIP为什么还在用“落后”的“中心化”架构?
网络·人工智能·架构·大模型·智能体·智能体互联网
神奇小汤圆8 小时前
上下文协议(MCP)Java SDK 指南
架构
pingzhuyan8 小时前
微服务: springboot整合kafka实现消息的简单收发(上)
spring boot·微服务·kafka