RPC学习
RPC
RPC入门
RPC是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC和IPC一样成为一个不可或缺的基础构件。
- RPC传输协议
- 消息序列化与反序列化
go语言rpc的hello world代码演示
server.go
package main
import (
"fmt"
"log"
"net"
"net/rpc"
)
func main() {
// net/rpc
// 1.编写一个符合rpc框架的对象
// 2.怎么通过rpc框架暴露该对象,提供rpc调用
// 注册被托管的rpc对象
err := rpc.RegisterName("HelloService", &HelloService{})
if err != nil {
panic(err)
}
// 然后我们建立一个唯一的TCP连接
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
// conn ---> a ---> hello service
// rpc 封装的网络调用
go rpc.ServeConn(conn)
}
}
// HelloService 进程内部调用 HelloService{}.Hello()
type HelloService struct {
}
// Hello 需要暴露的方法符合 net/rpc框架约束(类似于http.Handler)
// Fn(request any,Response *any)error
func (s *HelloService) Hello(req string, resp *string) error {
// req client远程调用时的参数
// resp 返回给客户端的响应
*resp = fmt.Sprintf("hello,%s", req)
return nil
}
client.go
package main
import (
"fmt"
"log"
"net/rpc"
)
func main() {
// 建立网络连接,拨号(rpc server
// 首先是通过rpc.Dial拨号RPC服务,建立连接
conn, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("dialing:", err)
}
// 怎么调用这个rpc 暴露的对象的方法?
// 通过call方法进行调用
resp := ""
err = conn.Call("HelloService.Hello", "Bob", &resp)
if err != nil {
panic(err)
}
// 打印返回的结果
fmt.Println(resp)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)