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实现。



欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓在java中加入字符串组以创建复合字符串   java系统甚至不点击“下一步”或“上一步”按钮就将我返回到上一页,而不是进入下一页   java如何在arrayList中获取特定列的不同值   CXF GZIP REST JAVA   Java:使用大量半恒定标志检查优化循环中的循环?   java如何在两个应用程序之间进行会话管理?   java SVG文件使用蜡染(但没有轴线)转换为PNG   使用协议缓冲区和内部数据模型的java   java如何在logtag 安卓中打印和查看字符串的值   javascript如何在NodeJs中应用Java/Spring的分层架构?   java Spring URL在JSP中编码不正确   模式对话框后面的java工具提示   java WSRPC生成日历对象而不是日期   在对象外部无法识别类变量   java将图像从文件读/写到BuffereImage的最快方法?   JavaSpring数据存储库对具有不同Id的子类使用抽象超类   安全在Java 5.0上运行web应用程序服务器有危险吗?