RPC 设计文档
API 设计
layotto rpc API 与Dapr保持一致.
核心抽象
为了与pb定义解耦,添加了一层RPC核心抽象.
- invoker: 提供完整的 RPC能力, 目前只对接了Mosn
- callback:before/after filter, 可以在请求执行前后执行自定义的逻辑(例如添加请求头,例如协议转换)
- channel:发送请求,接收响应,负责与不同传输协议交互
由于Mosn已经有了完整的RPC能力支持,layotto只提供了非常轻量的RPC框架
Mosn集成
layotto的RPC是基于Mosn grpc handler的,工作在7层,而Mosn的代理能力,以及各种filter都是工作在4层的, 无法通过简单的函数调用来交互.
为了完整复用Mosn的全套能力,layotto使用了新的思路与Mosn集成.
- channel会将请求重新编码,从L7重新回到L4
- 创建一对虚拟连接(net.Pipe),layotto持有一端local,mosn持有另一端remote
- layotto向local写入,mosn会收到数据
- mosn从remote读取,执行filter并进行代理转发,将响应写到remote
- layotto从remote读取,获得响应
xprotocol
Mosn通过xprotocol支持了流行的RPC协议. 在Layotto里设计了对应的扩展机制,只需要完成RPC请求响应与xprotocol frame的互相转换,就可以方便的支持xprotocl协议.
配置参数
{
"mosn": {
"config": {
"before_invoke": [{
"name": "xxx" // rpc调用前的filter
}],
"after_invoke": [{
"name": "xxx" // rpc调用后的filter
}],
"channel": {
"size": 1, // 与mosn通信使用的通道数量,可以简单理解成连接数
"protocol": "http", // 与mosn通信使用的协议
"listener": "egress_runtime_http" // mosn对应的listener端口
}
}
}
}