如何在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
相关产品推荐
相关产品推荐

