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
|
||
}
|