From 407c000975dc1004974b4e317c4034a4693b5e25 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 16 Feb 2025 12:09:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85rpc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skills/rpc/hello_world/server/main.go | 40 ++++++++++++++------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/skills/rpc/hello_world/server/main.go b/skills/rpc/hello_world/server/main.go index 1909ec9..f3950fb 100644 --- a/skills/rpc/hello_world/server/main.go +++ b/skills/rpc/hello_world/server/main.go @@ -1,7 +1,8 @@ package main import ( - "net" + "io" + "net/http" "net/rpc" "net/rpc/jsonrpc" @@ -26,6 +27,15 @@ func (h *HelloServiceServer) Hello(request *service.HelloRequest, response *serv 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() { // 1. 把业务 注册给RPC // 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error @@ -34,22 +44,14 @@ func main() { panic(err) } - // 启动RPC服务 - listener, err := net.Listen("tcp", ":1234") - if err != nil { - panic(err) - } - defer listener.Close() - for { - conn, err := listener.Accept() - if err != nil { - continue - } - // 用户的net层数据 转交给 rpc框架 - // go rpc.ServeConn(conn) - // json codec(server) - // req(bytes) --> obj - // resp(obj) --> bytes - go rpc.ServeCodec(jsonrpc.NewServerCodec(conn)) - } + // RPC的服务架设在“/jsonrpc”路径, + // 在处理函数中基于http.ResponseWriter和http.Request类型的参数构造一个io.ReadWriteCloser类型的conn通道。 + // 然后基于conn构建针对服务端的json编码解码器。 + // 最后通过rpc.ServeRequest函数为每次请求处理一次RPC方法调用 + http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) { + conn := NewRPCReadWriteCloserFromHTTP(w, r) + rpc.ServeRequest(jsonrpc.NewServerCodec(conn)) + }) + + http.ListenAndServe(":1234", nil) }