gRpc根据Consumer传参方式分为两类:Unary Call和Server Stream Call归为一类设计,Client Stream Call与Bi Direction Call另外一类。
一、Unary/ServerStream Call
1.Consumer端发起调用
1.1.向Provider发送Initial Metadata,发起方法调用。发送cmd_server_recv_header消息,消息内容:method_full_name、meta data、authority,
method_full_name格式/service/method_name格式。
1.2.向Provider发送request参数,发送cmd_server_recv_data消息。
1.3.通知Provder结束request参数传递结束,并开启调用方法处理。
发送cmd_server_recv_half_close消息。
1.4.监听获取Provider返回。
2. Provider端接收调用
2.1接收cmd_server_recv_head消息,监听获取Consumer端Request参数。
2.2接收cmd_server_recv_data消息,赋值request参数。
2.3接收cmd_server_recv_half_close消息:
2.3.1判断是否发送过Initial Metadata消息,如果没有,向Consumer发送cmd_client_recv_header消息。消息内容为Metadata。如果有,直接进入下面步骤。
2.3.2从Consumer端成功获取到request参数时,调用业务方法,否则进入2.3.3。
2.3.2.1成功返回,向Consumer发送cmd_client_recv_data消息,消息内容为方法返回值。结束方法调用,向Consumer发送cmd_client_recv_close消息,消息内容:status:0
2.3.2.2失败返回,向Consumer发送cmd_client_recv_close消息,status:13(INTERNAL异常),message:异常消息。
2.3.3未获取到Consumer端request参数,向Consumer发送cmd_client_recv_close消息,消息内容包括status:13(INTERNAL异常),message:Half-closed without a request。
2.4结束方法调用,见2.3.2.1结束方法调用,向Consumer发送cmd_client_recv_close消息。
3. Consumer端返回处理
3.1接收cmd_client_recv_header消息,不作处理。
3.2接收cmd_client_recv_data消息,获取Provider处理结果。
3.3接收cmd_client_recv_close消息结束调用,获取Provider端处理结果,根据status区别处理,如果status非0,Provider端调用异常,进入异常处理。否则进入正常处理。
二、ClientStream/BiStream Call
1. Consumer端发起调用
1.1.向Provider发送Initial Metadata,发起方法调用。发送cmd_server_recv_header消息,消息内容:method_full_name、meta data、authority,
method_full_name格式/service/method_name格式。
2. Provider端接收调用
2.1.收到cmd_server_recv_head消息,调用Provider端方法,并准备接收Consumer request参数。
[if !supportLists]3. [endif]Consumer端发送请求参数
3.1.发送cmd_server_recv_data消息,内容为请求参数。(1次+)
[if !supportLists]4. [endif]Provider端接收参数
4.1.收到cmd_server_recv_data消息,设置请求参数。
[if !supportLists]5. [endif]Consumer端结束参数传递
5.1.发送cmd_server_recv_half_close消息
[if !supportLists]6. [endif]Provider端返回计算结果
6.1判断是否发送过Initial Metadata消息,如果没有,向Consumer发送cmd_client_recv_header消息。消息内容为Metadata。如果有,直接进入下面步骤。
6.2向Consumer发送cmd_client_recv_data消息,消息内容为方法返回值。
6.3结束方法调用,向Consumer发送cmd_client_recv_close消息,消息内容:status:0
7. Consumer端返回处理
7.1接收cmd_client_recv_header消息,不作处理。
7.2接收cmd_client_recv_data消息,获取Provider处理结果。
7.3接收cmd_client_recv_close消息结束调用,获取Provider端处理结果,根据status区别处理,如果status非0,Provider端调用异常,进入异常处理。否则进入正常处理。
网友评论