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

如何在Ballerina中为函数仓库gRPC客户端服务端编写Protocol Buffer定义

函数仓库管理场景的Protocol Buffer定义(适配Ballerina gRPC)

我们直接采用proto3语法编写,完全匹配业务需求和接口要求,Ballerina原生支持该标准proto的代码生成:

syntax = "proto3";
package fn_repo;

// 函数版本元数据定义
message FnMetadata {
  string developer_fullname = 1;
  string developer_email = 2;
  string programming_lang = 3;
  repeated string keywords = 4;
}

// 函数版本核心定义
message FnVersion {
  string fn_id = 1; // 全局唯一的函数ID,同一函数的不同版本共用该ID
  string version_tag = 2; // 版本标识,如v1.0.0、v2.1.0
  FnMetadata metadata = 3;
  repeated string parent_version_tags = 4; // 用于构建版本DAG,存储该版本的父版本标识
}

// 通用操作响应
message OpResponse {
  bool success = 1;
  string msg = 2;
}

// add_new_fn 请求
message AddNewFnRequest {
  FnVersion fn_version = 1;
}

// delete_fn 请求
message DeleteFnRequest {
  string fn_id = 1;
  optional string version_tag = 2; // 不传则删除整个函数的所有版本,传则仅删除指定版本
}

// show_fn 请求
message ShowFnRequest {
  string fn_id = 1;
  string version_tag = 2;
}

// show_fn 响应
message ShowFnResponse {
  FnVersion fn_version = 1;
}

// show_all_fns 请求
message ShowAllFnsRequest {
  string fn_id = 1;
}

// show_all_with_criteria 过滤条件
message FilterCriteria {
  optional string programming_lang = 1;
  repeated string match_keywords = 2;
}

// 函数仓库gRPC服务定义
service FnRepoService {
  // 普通RPC:添加单个函数/函数新版本
  rpc add_new_fn(AddNewFnRequest) returns (OpResponse);
  // 客户端流式RPC:批量添加多个函数,不允许同函数多版本提交
  rpc add_fns(stream FnVersion) returns (OpResponse);
  // 普通RPC:删除指定函数/指定版本
  rpc delete_fn(DeleteFnRequest) returns (OpResponse);
  // 普通RPC:查询指定函数的指定版本
  rpc show_fn(ShowFnRequest) returns (ShowFnResponse);
  // 服务端流式RPC:返回指定函数的所有版本
  rpc show_all_fns(ShowAllFnsRequest) returns (stream FnVersion);
  // 双向流式RPC:客户端传入过滤条件,服务端返回匹配的所有函数最新版本
  rpc show_all_with_criteria(stream FilterCriteria) returns (stream FnVersion);
}

关键说明

  • 所有字段定义完全匹配业务需求:版本元数据包含开发者信息、编程语言、关键词,通过parent_version_tags字段实现版本DAG的存储
  • 流式接口完全符合要求:add_fns为客户端流、show_all_fns为服务端流、show_all_with_criteria为双向流
  • 可直接在Ballerina项目中执行以下命令生成对应的服务端框架和客户端存根:
    bal grpc --input fn_repo.proto --output ./generated
    生成代码后直接实现服务端的接口逻辑、调用客户端存根即可完成交互。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:45:03