rpc和proto

农民  论坛元老 | 2025-3-10 18:58:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1595|帖子 1595|积分 4785

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
rpc全称远程过程控制,说白了是一种对信息发送和吸取的规则编写方法,来自google,这些规则会以protobuf代码存到proto文件里。我以autoGen中agent_worker.proto为例,大概长如许
  1. syntax = "proto3";
  2. package agents;
  3. option csharp_namespace = "Microsoft.AutoGen.Protobuf";
  4. import "cloudevent.proto";
  5. import "google/protobuf/any.proto";
  6. message AgentId {
  7.     string type = 1;
  8.     string key = 2;
  9. }
  10. message Payload {
  11.     string data_type = 1;
  12.     string data_content_type = 2;
  13.     bytes data = 3;
  14. }
  15. message RpcRequest {
  16.     string request_id = 1;
  17.     optional AgentId source = 2;
  18.     AgentId target = 3;
  19.     string method = 4;
  20.     Payload payload = 5;
  21.     map<string, string> metadata = 6;
  22. }
  23. message RpcResponse {
  24.     string request_id = 1;
  25.     Payload payload = 2;
  26.     string error = 3;
  27.     map<string, string> metadata = 4;
  28. }
  29. message RegisterAgentTypeRequest {
  30.     string type = 1;
  31. }
  32. message RegisterAgentTypeResponse {
  33. }
  34. message TypeSubscription {
  35.     string topic_type = 1;
  36.     string agent_type = 2;
  37. }
  38. message TypePrefixSubscription {
  39.     string topic_type_prefix = 1;
  40.     string agent_type = 2;
  41. }
  42. message Subscription {
  43.     string id = 1;
  44.     oneof subscription {
  45.         TypeSubscription typeSubscription = 2;
  46.         TypePrefixSubscription typePrefixSubscription = 3;
  47.     }
  48. }
  49. message AddSubscriptionRequest {
  50.     Subscription subscription = 1;
  51. }
  52. message AddSubscriptionResponse {
  53. }
  54. message RemoveSubscriptionRequest {
  55.     string id = 1;
  56. }
  57. message RemoveSubscriptionResponse {
  58. }
  59. message GetSubscriptionsRequest {}
  60. message GetSubscriptionsResponse {
  61.     repeated Subscription subscriptions = 1;
  62. }
  63. message Message {
  64.     oneof message {
  65.         RpcRequest request = 1;
  66.         RpcResponse response = 2;
  67.         io.cloudevents.v1.CloudEvent cloudEvent = 3;
  68.     }
  69. }
  70. message SaveStateRequest {
  71.     AgentId agentId = 1;
  72. }
  73. message SaveStateResponse {
  74.     string state = 1;
  75.     optional string error = 2;
  76. }
  77. message LoadStateRequest {
  78.     AgentId agentId = 1;
  79.     string state = 2;
  80. }
  81. message LoadStateResponse {
  82.     optional string error = 1;
  83. }
  84. message ControlMessage {
  85.     // A response message should have the same id as the request message
  86.     string rpc_id = 1;
  87.     // This is either:
  88.     // agentid=AGENT_ID
  89.     // clientid=CLIENT_ID
  90.     string destination = 2;
  91.     // This is either:
  92.     // agentid=AGENT_ID
  93.     // clientid=CLIENT_ID
  94.     // Empty string means the message is a response
  95.     optional string respond_to = 3;
  96.     // One of:
  97.     //     SaveStateRequest saveStateRequest = 2;
  98.     //     SaveStateResponse saveStateResponse = 3;
  99.     //     LoadStateRequest loadStateRequest = 4;
  100.     //     LoadStateResponse loadStateResponse = 5;
  101.     google.protobuf.Any rpcMessage = 4;
  102. }
  103. service AgentRpc {
  104.     rpc OpenChannel (stream Message) returns (stream Message);
  105.     rpc OpenControlChannel (stream ControlMessage) returns (stream ControlMessage);
  106.     rpc RegisterAgent(RegisterAgentTypeRequest) returns (RegisterAgentTypeResponse);
  107.     rpc AddSubscription(AddSubscriptionRequest) returns (AddSubscriptionResponse);
  108.     rpc RemoveSubscription(RemoveSubscriptionRequest) returns (RemoveSubscriptionResponse);
  109.     rpc GetSubscriptions(GetSubscriptionsRequest) returns (GetSubscriptionsResponse);
  110. }
复制代码
为什么要用protobuf定义rpc呢?首先,rpc是一种比http和restapi更轻量的协议,应该都知道http要有http头,header,rpc采用更紧凑的编码方式,具体我也不懂,反正它的协议叫做gRPC。然后,为了让rpc盛行起来,须要一个在各种语言中都能被使用的方法,protobuf作为一种中间语言,在编写后可以被编译成各种语言的版本,然后供各语言的代码调用,这个编译器叫protoc,c是complier。
你可以简单地把proto代码看作是对数据布局的定义,就像python的dataclass一样。有几个字段须要解释:
oneof:它内里会包含多个变量名,在你实例化对应数据类时,只能出现此中一个变量,其他的不可用。
map:看作dict。
repeat:看作list。
packed:是跟在某些数据类型的变量背面的定义,用于注明这些值是否须要精简地序列化,proto3里默认开启。
enum Status:定义一个枚举数据类型Status。像python一样,Status会定义一个名字并附上具体的值,之后可以用Status定义其他变量的类型。
message:定义发送的信息的数据布局。
数据类型:在变量名前面注明,可以是某个定义完的数据布局,和python一样。
变量 = 数字:数字是编号,用于数据在序列化和反序列化时作标记和识别。因此,它可以不是顺序的,可以随便定义(但是最好别如许做)。
service:与message平级,用于定义一个服务所提供的全部rpc服务。
rpc:注明这是一个rpc服务,将注明发送和吸取的message样式。
stream:注明这是一个流式传输。如果不是流式传输,rpc服务只会做到“客户端发送message,服务端返回对应的message”,就像一个request一样。
nest message:它只是一种嵌套形式,在message里定义一个message,毕竟message也是一个变量类型。
reserved:可以用来预留编号和变量名。
DynamicMessage:它用来支持动态剖析,在不知道来犯的message类型时,对方可能同时传过来一个proto文件的descriptor文件,用它来动态剖析message。
protobuf已经到protobuf3了,之前全部参数都可以注明可选or必选,现在都是可选。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表