GRPC扩展
nameko-grpc的Python项目详细描述
#nameko grpc
这是一个grpc服务器和客户端的原型实现,用于[nameko](https://nameko.io)微服务。
>所有四种请求-响应模式都已实现并测试:
1。一元
2.一元流
3。一元流
4.每个模式也支持流式异步调用。
r/>
`` python
从示例pb2导入示例reply
从示例pb2导入示例stub
_一元(self,request,context):
消息=请求值*(request.multiplier或1)
返回示例reply(消息=消息)
@grpc
定义一元流(self,request,context):
消息=请求值*(request.multiplier或1)
生成检查plereply(message=message,seqno=1)
生成示例reply(message=message,seqno=2)
@grpc
def stream一元(self,request,context):
messages=[]
请求请求:
message=req.value*(req.multiplier或1)
messages.append(message)
return examplereply(message=",".join(messages))
@grpc
def stream_stream(self,request,context):
索引,枚举中的req(request):
message=req.value*(req.multiplier或1)
产生examplereply(message=message,seqno=index+1)
```
client
ependency_provider import grpcproxy
class clientservice:
name="client"
example撸rpc=grpcproxy("//127.0.0.1",examplestub)
@rpc
def method(self):
responses=self.example撸grpc.unary撸stream(examplerequest(value="a")
对于响应中的响应:
print(response.message)
````
example standalone client,可以与eventlet一起使用,也可以不与eventlet一起使用:
``python
example PB2 import example reply
example PB2 GRPC import example stub
nameko GRPC.client import客户机
,客户机(//127.0.0.1,examplestub)作为客户机:
响应=客户机.一元流(examplerequest(value="a"))
响应:
打印(response.message)
````
```
syntax="proto3"
rpc一元(examplerequest)返回(examplereply){}
rpc一元流(examplerequest)返回(stream examplereply){}
rpc stream一元(stream examplerequest)返回(examplereply){}
rpcstream_stream(stream examplerequest)返回(stream examplereply){}
}
string value=1;
int32 multiplier=2;
string message=1;
int32 seqno=2;
}
``````
style
此repo中的示例protobuf根据nameko约定对方法名使用"snake_case",而不是根据grpc使用"camelcase"。这不是必需的——修饰方法名只与protobufs中定义的方法匹配;与服务名类似。
标准python实现:
*`context.invocation_metadata()`返回调用客户端提供的任何元数据。
*`context.send_initial_metadata()`可用于向响应头添加元数据。
*`context.set_trailing_metadata()`可用于向res添加元数据。ponse trailes.
独立客户端和DependencyProvider都允许使用"metadata"关键字参数提供元数据。它们接受一个"元组"(name,value)的列表,就像标准的python客户机那样。二进制值必须是base64编码的,并使用后缀为"-bin"的头名称,如在标准python客户端中一样。
DependencyProvider客户端添加名称ko工人上下文数据作为所有grpc请求的元数据。这允许填充和传播nameko调用id堆栈以及任何其他上下文数据。服务器和客户端都支持压缩。默认情况下,"deflate"和"gzip"算法可用,并将包含在客户端请求和服务器响应的"grpc accept encoding"头中。
使用与请求相同的算法。
quest(value="foo"),compression="gzip")使用gzip而不是
````
不支持压缩级别。
grpc规范允许服务器使用与请求不同的算法响应,或者根本不压缩。标准python grpc实现或nameko grpc当前都不支持此功能。
\与标准python grpc客户端中定义的"grpc.rpcerror"类类似,"grpc error"封装了[状态代码](https://github.com/grpc/grpc/blob/master/doc/statuscodes.md)和描述错误的"details"字符串。
rt超时,如果rpc未在请求的时间内完成,则将引发"超过最后期限"。当请求启动时,时钟在客户端开始计时,当收到请求时,时钟在服务器上计时。
调用一个方法:
``python
client=client(…)
client.unary(examplerequest(value="foo"),timeout=0.1)100 ms timeout
````
nes)总是设置一个截止日期。
这大致证明了两个实现之间的等价性。这些测试使用"等价"pytest标记进行标记。
此外,我们从官方grpc repo运行互操作测试,这些测试用于验证语言实现之间的兼容性。nameko grpc实现支持python grpc官方实现所做的所有功能。这些测试使用"interop"pytest标记进行标记。
"test/spec"目录包含各种测试中使用的protobufs和服务器实现。
\r/>
```
$pip安装nameko grpc[dev]
```
>然后运行测试:
``````
$pytest test
````
interop测试需要docker。他们使用在HTTPS://HuB.DOKK.COM/R/NAMEKO/NAMEKO-GRPC-IOPO中的图像,其中包含预构建的C++互操作客户端。要运行除互操作测试以外的所有测试,请执行以下操作:
````
$pytest test-m"not interop"
````
实施说明
grpc基于http2,因此nameko grpc严重依赖于[hyper-h2]库(https://python-hyper.org/projects/h2/en/stable/)。h2是http2协议的有限状态机实现,它的文档非常好。熟悉h2之后,nameko grpc中的代码就更容易理解了。
nameko grpc中的大部分繁重工作都是由"connectionmanager"的服务器或客户端子类完成的。"connectionmanager"处理单个http2连接,并实现该连接上每个http2事件的处理程序(例如,"request-cureceived"或"stream-ended")。请参阅:
*`nameko_grpc/client.py::client connectionmanager`
*`nameko_grpc/entrypoint.py::serverconnectionmanager`
*`nameko_grpc/connection.py::connectionmanager`
下一个最重要的模块是"nameko_grpc/streams.py`。此模块包含"sendstream"和"receivestream"类,它们分别表示正在发送或接收的http2流。receivestream从connectionmanager以字节的形式接收数据,并将其解析为grpc消息流。"sendstream"的作用正好相反,它将grpc消息编码成字节,然后通过http2连接发送。
entrypoint处理封装请求的"receivestream"对象和接受响应的"sendstream"对象。流由共享的"grpcserver"管理,它接受传入连接并将每个连接包装在"serverconnectionmanager"中。
独立客户端是"clientconnectionmanager"周围的一个小包装。客户机只需创建一个套接字连接,然后将其交给连接管理器。当在客户机上调用方法时,连接管理器将启动适当的请求。该请求的头描述了被调用的方法、编码、消息类型等。该逻辑都封装在"method"类中。
其中:
*grpc标准服务器(python实现)或
*nameko服务器
*grpc标准客户端(python实现)或
*nameko独立客户端或
*nameko依赖于provider客户端标准GRPC服务器和客户端。因此,这些脚本必须在单独的进程中运行,并以某种方式与之通信,以便对标准实现的行为作出断言。
运行进程外客户端和服务器的脚本可以在"test/grpc_indirect_client.py"和"test/grpc_indir"中找到ect_server.py`
使用zeromq完成通信。其逻辑包含在"test/helpers.py"中的"remoteclienttransport"和"command"类中,以及"test/conftest.py"中的"start-grpc"客户端和"start-grpc"服务器设备中。
(更多功能完成)标准GRPC实现。
这是一个grpc服务器和客户端的原型实现,用于[nameko](https://nameko.io)微服务。
>所有四种请求-响应模式都已实现并测试:
1。一元
2.一元流
3。一元流
4.每个模式也支持流式异步调用。
r/>
`` python
从示例pb2导入示例reply
从示例pb2导入示例stub
_一元(self,request,context):
消息=请求值*(request.multiplier或1)
返回示例reply(消息=消息)
@grpc
定义一元流(self,request,context):
消息=请求值*(request.multiplier或1)
生成检查plereply(message=message,seqno=1)
生成示例reply(message=message,seqno=2)
@grpc
def stream一元(self,request,context):
messages=[]
请求请求:
message=req.value*(req.multiplier或1)
messages.append(message)
return examplereply(message=",".join(messages))
@grpc
def stream_stream(self,request,context):
索引,枚举中的req(request):
message=req.value*(req.multiplier或1)
产生examplereply(message=message,seqno=index+1)
```
client
ependency_provider import grpcproxy
class clientservice:
name="client"
example撸rpc=grpcproxy("//127.0.0.1",examplestub)
@rpc
def method(self):
responses=self.example撸grpc.unary撸stream(examplerequest(value="a")
对于响应中的响应:
print(response.message)
````
example standalone client,可以与eventlet一起使用,也可以不与eventlet一起使用:
``python
example PB2 import example reply
example PB2 GRPC import example stub
nameko GRPC.client import客户机
,客户机(//127.0.0.1,examplestub)作为客户机:
响应=客户机.一元流(examplerequest(value="a"))
响应:
打印(response.message)
````
```
syntax="proto3"
rpc一元流(examplerequest)返回(stream examplereply){}
rpc stream一元(stream examplerequest)返回(examplereply){}
rpcstream_stream(stream examplerequest)返回(stream examplereply){}
}
int32 multiplier=2;
int32 seqno=2;
}
``````
style
此repo中的示例protobuf根据nameko约定对方法名使用"snake_case",而不是根据grpc使用"camelcase"。这不是必需的——修饰方法名只与protobufs中定义的方法匹配;与服务名类似。
标准python实现:
*`context.invocation_metadata()`返回调用客户端提供的任何元数据。
*`context.send_initial_metadata()`可用于向响应头添加元数据。
*`context.set_trailing_metadata()`可用于向res添加元数据。ponse trailes.
独立客户端和DependencyProvider都允许使用"metadata"关键字参数提供元数据。它们接受一个"元组"(name,value)的列表,就像标准的python客户机那样。二进制值必须是base64编码的,并使用后缀为"-bin"的头名称,如在标准python客户端中一样。
DependencyProvider客户端添加名称ko工人上下文数据作为所有grpc请求的元数据。这允许填充和传播nameko调用id堆栈以及任何其他上下文数据。服务器和客户端都支持压缩。默认情况下,"deflate"和"gzip"算法可用,并将包含在客户端请求和服务器响应的"grpc accept encoding"头中。
使用与请求相同的算法。
quest(value="foo"),compression="gzip")使用gzip而不是
````
不支持压缩级别。
grpc规范允许服务器使用与请求不同的算法响应,或者根本不压缩。标准python grpc实现或nameko grpc当前都不支持此功能。
\与标准python grpc客户端中定义的"grpc.rpcerror"类类似,"grpc error"封装了[状态代码](https://github.com/grpc/grpc/blob/master/doc/statuscodes.md)和描述错误的"details"字符串。
rt超时,如果rpc未在请求的时间内完成,则将引发"超过最后期限"。当请求启动时,时钟在客户端开始计时,当收到请求时,时钟在服务器上计时。
调用一个方法:
``python
client=client(…)
client.unary(examplerequest(value="foo"),timeout=0.1)100 ms timeout
````
nes)总是设置一个截止日期。
这大致证明了两个实现之间的等价性。这些测试使用"等价"pytest标记进行标记。
此外,我们从官方grpc repo运行互操作测试,这些测试用于验证语言实现之间的兼容性。nameko grpc实现支持python grpc官方实现所做的所有功能。这些测试使用"interop"pytest标记进行标记。
"test/spec"目录包含各种测试中使用的protobufs和服务器实现。
\r/>
```
$pip安装nameko grpc[dev]
```
>然后运行测试:
``````
$pytest test
````
interop测试需要docker。他们使用在HTTPS://HuB.DOKK.COM/R/NAMEKO/NAMEKO-GRPC-IOPO中的图像,其中包含预构建的C++互操作客户端。要运行除互操作测试以外的所有测试,请执行以下操作:
````
$pytest test-m"not interop"
````
实施说明
grpc基于http2,因此nameko grpc严重依赖于[hyper-h2]库(https://python-hyper.org/projects/h2/en/stable/)。h2是http2协议的有限状态机实现,它的文档非常好。熟悉h2之后,nameko grpc中的代码就更容易理解了。
nameko grpc中的大部分繁重工作都是由"connectionmanager"的服务器或客户端子类完成的。"connectionmanager"处理单个http2连接,并实现该连接上每个http2事件的处理程序(例如,"request-cureceived"或"stream-ended")。请参阅:
*`nameko_grpc/client.py::client connectionmanager`
*`nameko_grpc/entrypoint.py::serverconnectionmanager`
*`nameko_grpc/connection.py::connectionmanager`
下一个最重要的模块是"nameko_grpc/streams.py`。此模块包含"sendstream"和"receivestream"类,它们分别表示正在发送或接收的http2流。receivestream从connectionmanager以字节的形式接收数据,并将其解析为grpc消息流。"sendstream"的作用正好相反,它将grpc消息编码成字节,然后通过http2连接发送。
entrypoint处理封装请求的"receivestream"对象和接受响应的"sendstream"对象。流由共享的"grpcserver"管理,它接受传入连接并将每个连接包装在"serverconnectionmanager"中。
独立客户端是"clientconnectionmanager"周围的一个小包装。客户机只需创建一个套接字连接,然后将其交给连接管理器。当在客户机上调用方法时,连接管理器将启动适当的请求。该请求的头描述了被调用的方法、编码、消息类型等。该逻辑都封装在"method"类中。
其中:
*grpc标准服务器(python实现)或
*nameko服务器
*grpc标准客户端(python实现)或
*nameko独立客户端或
*nameko依赖于provider客户端标准GRPC服务器和客户端。因此,这些脚本必须在单独的进程中运行,并以某种方式与之通信,以便对标准实现的行为作出断言。
运行进程外客户端和服务器的脚本可以在"test/grpc_indirect_client.py"和"test/grpc_indir"中找到ect_server.py`
使用zeromq完成通信。其逻辑包含在"test/helpers.py"中的"remoteclienttransport"和"command"类中,以及"test/conftest.py"中的"start-grpc"客户端和"start-grpc"服务器设备中。
(更多功能完成)标准GRPC实现。