You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何本地运行调试Micronaut GCP背景函数与云事件函数

基于Micronaut的GCP函数本地运行与调试方案

架构与已实现函数

架构示意图

基于上述架构,我已用Micronaut创建三类GCP函数:

  • HTTP函数 - 基于HTTP触发
  • Background函数 - 基于PubSub触发
  • Cloud Event函数 - 基于云存储触发

HTTP函数实现

这是带有@Controller("/")注解的常规Micronaut应用:

@Controller("/")
public record FileUploadController(IFileUploadClient iFileUploadClient){}

该项目只需修改build.gradle中的runtime("google_function")为runtime("netty")即可本地运行。

待解决问题

Background函数代码

public class Function extends GoogleFunctionInitializer
    implements BackgroundFunction<PubSubMessage> {

@Inject LoggingService loggingService;

@Override
public void accept(PubSubMessage message, Context context) {
    loggingService.logMessage(message);
}
}

Cloud Event函数代码

public class Function extends GoogleCloudEventsFunction<StorageObjectData> {

@Inject StorageService storageService;

@Override
protected void accept(@NonNull CloudEventContext context,
                      @Nullable StorageObjectData data) throws Exception {
    storageService.handleFileEvent(data);
}
}

一、Background函数(PubSub触发)本地运行与调试

1. 本地运行

使用GCP Functions Framework for Java模拟运行:

  • 在build.gradle中添加依赖:
    implementation 'com.google.cloud.functions:functions-framework-api:1.0.4'
    runtimeOnly 'com.google.cloud.functions.invoker:java-function-invoker:1.3.0'
    
  • 执行运行命令:
    ./gradlew run --args='--target=com.yourpackage.Function'
    
    替换com.yourpackage.Function为你的Background函数全类名。

2. 本地调试

在IDE(如IntelliJ)中配置调试项:

  • 主类设置为com.google.cloud.functions.invoker.runner.Invoker
  • 程序参数设置为--target=com.yourpackage.Function
  • 启动调试模式,即可在accept方法中打断点调试。

3. 触发PubSub消息

本地模拟触发,向Functions Framework的HTTP端点发送POST请求:

  • 请求地址:http://localhost:8080
  • 请求体(JSON格式):
    {
      "message": {
        "data": "SGVsbG8gV29ybGQh",
        "attributes": {
          "key": "value"
        }
      },
      "subscription": "projects/your-project/subscriptions/your-subscription"
    }
    
    其中data为Base64编码的消息内容。

二、Cloud Event函数(云存储触发)本地运行与调试

1. 本地运行

同样依赖Functions Framework:

  • 确保已添加Background函数中的依赖
  • 执行运行命令:
    ./gradlew run --args='--target=com.yourpackage.Function'
    
    替换com.yourpackage.Function为你的Cloud Event函数全类名。

2. 本地调试

与Background函数调试流程一致:在IDE中配置主类为com.google.cloud.functions.invoker.runner.Invoker,指定函数全类名作为参数,启动调试即可。

3. 模拟云存储触发

向本地端点发送符合Cloud Events规范的POST请求:

  • 请求地址:http://localhost:8080
  • 请求头:
    Content-Type: application/json
    Ce-Id: 12345
    Ce-Specversion: 1.0
    Ce-Type: google.cloud.storage.object.v1.finalized
    Ce-Source: //storage.googleapis.com/projects/_/buckets/your-bucket
    
  • 请求体(JSON格式):
    {
      "bucket": "your-bucket",
      "name": "test-file.txt",
      "contentType": "text/plain"
    }
    

三、测试方法

单元测试

针对函数依赖的服务(如LoggingService、StorageService)编写单元测试,用Mockito等Mock框架注入模拟依赖:

@Test
void testBackgroundFunction() {
    LoggingService mockLogging = Mockito.mock(LoggingService.class);
    Function function = new Function();
    ReflectionTestUtils.setField(function, "loggingService", mockLogging);
    
    PubSubMessage message = PubSubMessage.newBuilder().setData(ByteString.copyFromUtf8("test")).build();
    function.accept(message, Mockito.mock(Context.class));
    
    Mockito.verify(mockLogging).logMessage(message);
}

集成测试

用Micronaut HttpClient等工具向本地运行的Functions Framework端点发送请求,验证函数输出是否符合预期。


内容的提问来源于stack exchange,提问作者San Jaisy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:23:11