短任务占资源、低频 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 适合 事件驱动、低频、弹性任务;
  • 二者结合可以实现:稳定核心 + 灵活边缘 + 成本优化。
相关推荐
9624561 小时前
Go EVM 链上数据平台实践:从 RPC Demo 到可演进架构
rpc·架构·golang
考拉讲支付1 小时前
母婴亲子服务平台分账架构设计:多场景多方分账与合规清结算实践
大数据·运维·人工智能·微信小程序·架构·微信公众平台
黄俊懿2 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
行者全栈架构师2 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
海带紫菜菠萝汤2 小时前
PostgreSQL 19 延期一个月:AI 把找 bug 变便宜了,修 bug 还是人工价
人工智能·ai·程序员·架构·大模型
Thneonl2 小时前
主从延迟 0 秒的谎言:SBM 的三个盲区
后端·架构
Dawson Zhu2 小时前
【AI Infra小白入门⑦】Transformer架构工程拆解:从Attention到MLA的优化密码
人工智能·语言模型·架构·aigc·agi
吴建旭 智宅焕2 小时前
智能家居全国交付的县域节点架构:远程技术大脑与本地执行端的标准化实现
架构·智能家居
代码小学僧3 小时前
如何低成本部署网站?Vercel 和 Cloudflare 怎么选?
前端·后端·serverless
wangjialelele3 小时前
一文梳理 Spring Cloud 核心组件:Eureka、Nacos、OpenFeign、LoadBalancer 与 Gateway
java·spring boot·spring·spring cloud·微服务·nacos