< 返回版块

sunnysab 发表于 2021-07-15 17:03

Tags:RPC,反向,异步

大家好!我先描述一下我的需求:用户通过 HTTP 协议访问位于公网的 API 服务器,然后 API 服务器需要将请求修修改改再转发到一个代理节点上,代理节点可能有一个或多个(如果不能实现多个,一个也行)。由于代理节点处在内网,无公网 IP,且无法添加公网 IP,因此寻求解决办法,算是反向 RPC 吧。

示意图如下:

用户 --> API Server(Public Network) --> Agent Server(Private Network)

  1. 尝试使用 RPC。现有的 RPC 只能 Client 向 Server 发送请求,然后 Server 计算后得到结果并返回 Client。看了下 tarpc,试着把 Client/Server 关于端口绑定和连接的部分换一下,发现好像不能直接这么玩,又没有文档描述。

  2. 前段时间 Rust视界 频道推送了一个库叫做 Zenoh,它可以实现存储和计算的分布式,感觉很不错,应该能符合需求,只是它是基于 async-std 的,而我 API Server 基于 actix-web。

  3. 使用带 RPC 的消息队列,好像 RabbitMQ 可以,打算最近尝试一下,不过没有接触过消息队列。

  4. 使用 frp 这类代理工具实现内网穿透。不知道稳定性如何,且会增加其他组件,也在考虑。

之前基于 tokio 自己写过一个比较定制化的 RPC,用 bincode 做的压缩。感觉代码有些繁琐,坑也多,现在想再找找有没有成熟的方案,并了解一下大家遇到这种问题会如何解决?谢谢!

更新:tokio-tower 完美解决!就是资料有点少,写了个例子记录自己学习: https://github.com/sunnysab/a-tokio-tower-example

评论区

写评论
luyikk 2021-07-17 17:43

https://github.com/luyikk/rust_netx

欢迎使用我的 netx

sikasjc 2021-07-16 11:33

感觉变成了如何内网打洞的问题了

sikasjc 2021-07-16 11:30

api server无法直接连内网服务看起像是网络层的问题,需要用vpn之类的?这样的话实际上和传输层没啥关系了,要解决网络的连通性

作者 sunnysab 2021-07-15 19:55

刚才发现 rust-libp2p 好像可以实现,打算尝试一下...

不知道是不是引入了一个庞然大物

作者 sunnysab 2021-07-15 18:43

里面很麻烦的一点是,公网中的 API Server 没办法直接访问内网的 Agent Server...

需要依靠内网的机器主动连上来等待请求,或者用其他软件转发

作者 sunnysab 2021-07-15 18:31

查了一下确实可以利用网关的路由功能做这件事。

不过 Rust 下好像没有类似的、完整的做服务注册、发现和路由的 API 网关库。

--
👇
sikasjc: 这种API server一般叫api gateway吧

之后的RPC调用,就是你的API server作为client就可以了

sikasjc 2021-07-15 18:09

这种API server一般叫api gateway吧

之后的RPC调用,就是你的API server作为client就可以了

1 共 7 条评论, 1 页