首页 > 其他分享 >GO中的RPC

GO中的RPC

时间:2024-08-24 19:37:23浏览次数:11  
标签:log err rpc RPC HelloService GO reply

RPC是什么

RPC 是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。它允许客户端程序调用位于远程计算机上的服务器程序上的方法或函数,就像调用本地程序一样。

简单使用

服务端

RPC方法只能有两个可序列化的参数,其中第二个参数是指针类型,并且返回一个 error 类型,同时必须是公开的方法

package main  
  
import (  
    "fmt"  
    "log"    "net"    "net/rpc")  
  
type HelloService struct{}  
  
func (p *HelloService) Hello(request string, reply *string) error {  
    *reply = "hello:" + request  
    return nil  
}  
  
func main() {  
    // 注册 HelloService    rpc.RegisterName("HelloService", new(HelloService))  
  
    // 创建 TCP 监听器  
    listener, err := net.Listen("tcp", ":1234")  
    if err != nil {  
       log.Fatal("ListenTCP error:", err)  
    }  
  
    fmt.Println("RPC server listening on :1234")  
  
    // 等待并处理连接  
    for {  
       conn, err := listener.Accept()  
       if err != nil {  
          log.Fatal("Accept error:", err)  
       }  
       go rpc.ServeConn(conn)  
    }  
}

其中 rpc.Register 函数调用会将对象类型中所有满足 RPC 规则的对象方法注册为 RPC 函数,所有注册的方法会放在 “HelloService” 服务空间之下。然后我们建立一个唯一的 TCP 连接,并且通过 rpc.ServeConn 函数在该 TCP 连接上为对方提供 RPC 服务。

客户端

package main  
  
import (  
    "fmt"  
    "log"    "net/rpc")  
  
func main() {  
    client, err := rpc.Dial("tcp", "localhost:1234")  
    if err != nil {  
       log.Fatal("dialing:", err)  
    }  
  
    var reply string  
    err = client.Call("HelloService.Hello", "xxx", &reply)  
    if err != nil {  
       log.Fatal(err)  
    }  
  
    fmt.Println(reply)  
}

首先是通过 rpc.Dial 拨号 RPC 服务,然后通过 client.Call 调用具体的 RPC 方法。在调用 client.Call 时,第一个参数是用点号连接的 RPC 服务名字和方法名字,第二和第三个参数分别我们定义 RPC 方法的两个参数。

参考文章

https://chai2010.cn/advanced-go-programming-book/ch4-rpc/ch4-01-rpc-intro.html

标签:log,err,rpc,RPC,HelloService,GO,reply
From: https://www.cnblogs.com/Ho1dF0rward/p/18378149

相关文章

  • golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方
    golang中RSA解密前端(jsencrypt)发来的密文后出现 "crypto/rsa:decryptionerror" ,这个问题首先需要确认你的私匙和公匙是否匹配,如果匹配那检查入参数据类型,前端发送来的rsa加密后的数据一般都是经过base64编码后的,在后端进行RSA解码时需要对前端发送的数据进行base64......
  • RabbitMQ 从原理到实战—golang版本
    1.MQ1.1概念MQ(MessageQueue,消息队列)是一种用于在分布式系统中实现消息传递和异步通信的技术。它充当了发送方和接收方之间的中间人,用于在应用程序或服务之间传递消息。MQ允许系统中的不同组件彼此独立运行,而无需直接通信或相互依赖,从而提高系统的可扩展性、可靠性和灵......
  • Google 免费 AI课程
    Google免费AI课程1.生成式人工智能45分钟的课程,解释什么是生成式AI、如何使用它,以及GoogleToolsforGenAI应用程序。完成课程即可获得徽章并展示您的技能!课程链接:https://cloudskillsboost.google/course_templates/5362.大型语言模型简介完成本课程后,您将:-获得对L......
  • 2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需
    2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组nums,数组长度为n。你需要按照以下规则进行n次操作,将数组nums中的所有元素分配到两个新数组arr1和arr2中:1.首先将nums中第一个元素加入arr1。2.然后将nums中第二个元素加入arr2。3.如果arr1的最后一......
  • Go 互斥锁 Mutex 源码分析(二)
    原创文章,欢迎转载,转载请注明出处,谢谢。0.前言在Go互斥锁Mutex源码分析(一)一文中分析了互斥锁的结构和基本的抢占互斥锁的场景。在学习锁的过程中,看的不少文章是基于锁的状态解释的,个人经验来看,从锁的状态出发容易陷入细节,了解锁的状态转换过一段时间就忘,难以做到真正的......
  • E. Photoshoot for Gorillas
    题意给定一个整数\(T\),代表共有\(T\)组测试用例,对于每组测试用例:给定四个整数\(n,m,k和w(1\leqn,m\leq2*10^5,1\leqw\leqn*m\leq2*10^5,1\leqk\leqmin(n,m))\),随后输入\(w\)个整数\(a_i\)代表大猩猩的高度。你需要从\(n*m\)的网格中,选出所有\(k......
  • Kolmogorov-Arnold Networks——高效、可解释的神经网络的新前沿
    引言神经网络一直处于人工智能发展的前沿,从自然语言处理和计算机视觉到战略游戏、医疗保健、编码、艺术甚至自动驾驶汽车,无所不包。然而,随着这些模型的规模和复杂性不断扩大,它们的局限性正成为重大缺陷。对大量数据和计算能力的需求不仅使它们成本高昂,而且还引发了可持续......
  • Twenty Lectures on Algorithmic Game Theory 算法博弈论二十讲 Lecture 5 Revenue-Ma
    TwentyLecturesonAlgorithmicGameTheory算法博弈论二十讲Lecture5Revenue-MaximizingAuctions(上)Lecture5Revenue-MaximizingAuctions第2至第4讲聚焦于设计能够最大化社会福利的机制,无论是精确还是近似。这类机制的收益产生仅仅是副作用,是激励代理人如实......
  • Django:Swagger文档的配置
    前言第三方库drf-yasg(DjangoRestSwagger)。它是一个为DjangoRestFramework提供Swagger/OpenAPI规范支持的库。按照以下步骤进行操作:安装pipinstalldrf-yasg-ihttp://mirrors.aliyun.com/pypi/simple/--trusted-hostmirrors.aliyun.com配置1、在项目的settings.py......
  • Go 小知识之 Go 中如何使用 set
    Go的数据结构Go内置的数据结构并不多。工作中,我们最常用的两种数据结构分别是slice和map,即切片和映射。其实,Go中也有数组,切片的底层就是数组,只不过因为切片的存在,我们平时很少使用它。除了Go内置的数据结构,还有一些数据结构是由Go的官方container包提供,如he......