请选择 进入手机版 | 继续访问电脑版

Go日记——反向RPC

[复制链接]
奇奇女 发表于 2020-12-31 20:27:02 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
配景

通常的RPC是基于C/S结构,RPC的服务端对应网络的服务器,RPC的客户端也对应网络客户端。但是对于一些特殊场景,比如在公司内网提供一个RPC服务,但是在外网无法链接到内网的服务器。这种时候我们可以参考类似反向署理的技术,首先从内网主动链接到外网的TCP服务器,然后基于TCP链接向外网提供RPC服务。
声明接口

  1. type HelloService struct {}func (p *HelloService) Hello(request string, reply *string) error {    *reply = "hello:" + request    return nil}
复制代码
反向RPC服务

  1. func main() {    rpc.Register(new(HelloService))    for {        conn, _ := net.Dial("tcp", "localhost:1234")        if conn == nil {            time.Sleep(time.Second)            continue        }        rpc.ServeConn(conn)        conn.Close()    }}
复制代码
反向RPC的内网服务将不再主动提供TCP监听服务,而是首先主动链接到对方的TCP服务器。然后基于每个创建的TCP链接向对方提供RPC服务。
RPC客户端

RPC客户端则需要在一个公共的地址提供一个TCP服务,用于担当RPC服务器的链接请求:
[code]func main() {    listener, err := net.Listen("tcp", ":1234")    if err != nil {        log.Fatal("ListenTCP error:", err)    }    clientChan := make(chan *rpc.Client)    go func() {        for {            conn, err := listener.Accept()            if err != nil {                log.Fatal("Accept error:", err)            }            clientChan
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )