go语言rpc开发
1、服务端
Go语言的RPC包的路径为net/rpc,也就是放在了net包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package main import ( "net" "net/rpc" ) type HelloService struct {} func (s *HelloService) Hello(request string, reply *string) error { *reply = "hello " + request return nil } func main(){ _ = rpc.RegisterName( "HelloService" , &HelloService{}) listener, err := net.Listen( "tcp" , ":1234" ) if err != nil { panic( "监听端口失败" ) } conn, err := listener.Accept() if err != nil { panic( "建立链接失败" ) } rpc.ServeConn(conn) } |
其中Hello方法必须满足Go语言的RPC规则
:方法只能有两个可序列化的参数,其中第二个参数是指针类型,并且返回一个error类型,同时必须是公开的方法
。
然后就可以将HelloService类型的对象注册为一个RPC服务:(TCP RPC服务)。
其中rpc.Register
函数调用会将对象类型中所有满足RPC规则的对象方法注册为RPC函数,所有注册的方法会放在“HelloService”服务空间之下。然后我们建立一个唯一的TCP链接,并且通过rpc.ServeConn函数在该TCP链接上为对方提供RPC服务。
2、客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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" , "hello" , &reply) if err != nil { log.Fatal(err) } fmt.Println(reply) } |
首先是通过rpc.Dial
拨号RPC服务,然后通过client.Call
调用具体的RPC方法。
在调用client.Call
时,第一个参数是用点号链接的RPC服务名字和方法名字,第二和第三个参数分别我们定义RPC方法的两个参数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)