补充rpc

This commit is contained in:
yumaojun03 2025-02-16 12:09:05 +08:00
parent 8fb74b563e
commit 407c000975

View File

@ -1,7 +1,8 @@
package main package main
import ( import (
"net" "io"
"net/http"
"net/rpc" "net/rpc"
"net/rpc/jsonrpc" "net/rpc/jsonrpc"
@ -26,6 +27,15 @@ func (h *HelloServiceServer) Hello(request *service.HelloRequest, response *serv
return nil return nil
} }
func NewRPCReadWriteCloserFromHTTP(w http.ResponseWriter, r *http.Request) *RPCReadWriteCloser {
return &RPCReadWriteCloser{w, r.Body}
}
type RPCReadWriteCloser struct {
io.Writer
io.ReadCloser
}
func main() { func main() {
// 1. 把业务 注册给RPC // 1. 把业务 注册给RPC
// 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error // 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error
@ -34,22 +44,14 @@ func main() {
panic(err) panic(err)
} }
// 启动RPC服务 // RPC的服务架设在“/jsonrpc”路径
listener, err := net.Listen("tcp", ":1234") // 在处理函数中基于http.ResponseWriter和http.Request类型的参数构造一个io.ReadWriteCloser类型的conn通道。
if err != nil { // 然后基于conn构建针对服务端的json编码解码器。
panic(err) // 最后通过rpc.ServeRequest函数为每次请求处理一次RPC方法调用
} http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {
defer listener.Close() conn := NewRPCReadWriteCloserFromHTTP(w, r)
for { rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
conn, err := listener.Accept() })
if err != nil {
continue http.ListenAndServe(":1234", nil)
}
// 用户的net层数据 转交给 rpc框架
// go rpc.ServeConn(conn)
// json codec(server)
// req(bytes) --> obj
// resp(obj) --> bytes
go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
} }