Go日记——反向RPC

代码 代码 1283 人阅读 | 0 人回复

<
布景

凡是的RPC是基于C/S构造,RPC的效劳端对应收集的效劳器,RPC的客户端也对应收集客户端。可是关于一些特别场景,好比正在公司内乱网供给一个RPC效劳,可是正在中网没法链接到内乱网的效劳器。这类时分我们能够参考相似反背代办署理的手艺,起首从内乱网自动链接到中网的TCP效劳器,然后基于TCP链接背中网供给RPC效劳。
声明接心

  1. type HelloService struct {}
  2. func (p *HelloService) Hello(request string, reply *string) error {
  3.     *reply = "hello:" + request
  4.     return nil
  5. }
复造代码
反背RPC效劳

  1. func main() {
  2.     rpc.Register(new(HelloService))
  3.     for {
  4.         conn, _ := net.Dial("tcp", "localhost:1234")
  5.         if conn == nil {
  6.             time.Sleep(time.Second)
  7.             continue
  8.         }
  9.         rpc.ServeConn(conn)
  10.         conn.Close()
  11.     }
  12. }
复造代码
反背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
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

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

本版积分规则