48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"log"
|
|||
|
"net"
|
|||
|
"net/rpc"
|
|||
|
)
|
|||
|
|
|||
|
func main() {
|
|||
|
// 把我们的对象注册成一个rpc的 receiver
|
|||
|
// 其中rpc.Register函数调用会将对象类型中所有满足RPC规则的对象方法注册为RPC函数,
|
|||
|
// 所有注册的方法会放在“HelloService”服务空间之下
|
|||
|
// err := HelloService.FnName(req, resp)
|
|||
|
rpc.RegisterName("HelloService", new(HelloService))
|
|||
|
|
|||
|
// RPC服务器还没启动起来
|
|||
|
// 然后我们建立一个唯一的TCP链接,
|
|||
|
listener, err := net.Listen("tcp", ":1234")
|
|||
|
if err != nil {
|
|||
|
log.Fatal("ListenTCP error:", err)
|
|||
|
}
|
|||
|
|
|||
|
// 通过rpc.ServeConn函数在该TCP链接上为对方提供RPC服务。
|
|||
|
// 没Accept一个请求,就创建一个goroutie进行处理
|
|||
|
for {
|
|||
|
conn, err := listener.Accept()
|
|||
|
if err != nil {
|
|||
|
log.Fatal("Accept error:", err)
|
|||
|
}
|
|||
|
|
|||
|
// 前面都是tcp的知识, 到这个RPC就接管了
|
|||
|
// 因此 你可以认为 rpc 帮我们封装消息到函数调用的这个逻辑,
|
|||
|
// 提升了工作效率, 逻辑比较简洁,可以看看他代码
|
|||
|
go rpc.ServeConn(conn)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 要通过 net/rpc 把一个对象的方法 暴露为rpc,需要符合 net/rpc的方法签名: Hello(request string, reply *string) error
|
|||
|
// FnName(req any, resp *any) error
|
|||
|
|
|||
|
type HelloService struct{}
|
|||
|
|
|||
|
// HTTP Framwork Handler Hello(request string, reply *string) error
|
|||
|
func (h *HelloService) Hello(request string, reply *string) error {
|
|||
|
*reply = "hello " + request
|
|||
|
return nil
|
|||
|
}
|