From 45ef1f021e2d1c51e3a23a481bdf4a3cc477691c Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 16 Feb 2025 11:41:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85lient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skills/rpc/hello_world/client/main.go | 20 +++++-------- skills/rpc/hello_world/server/main.go | 20 +++++-------- skills/rpc/hello_world/service/client.go | 33 +++++++++++++++++++++ skills/rpc/hello_world/service/interface.go | 13 ++++++++ 4 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 skills/rpc/hello_world/service/client.go create mode 100644 skills/rpc/hello_world/service/interface.go diff --git a/skills/rpc/hello_world/client/main.go b/skills/rpc/hello_world/client/main.go index ca49341..079fa08 100644 --- a/skills/rpc/hello_world/client/main.go +++ b/skills/rpc/hello_world/client/main.go @@ -2,31 +2,25 @@ package main import ( "fmt" - "net/rpc" + + "gitlab.com/go-course-project/go17/skills/rpc/hello_world/service" ) -type HelloRequest struct { - MyName string `json:"my_name"` -} - -type HelloResponse struct { - Message string `json:"message"` -} - func main() { // 1. 通过网络调用 服务端的函数(RPC) // 建立网络连接 - conn, err := rpc.Dial("tcp", "127.0.0.1:1234") + client, err := service.NewClient("127.0.0.1:1234") if err != nil { panic(err) } // 方法调用 // serviceMethod string, args any, reply any - req := &HelloRequest{ + req := &service.HelloRequest{ MyName: "bob", } - resp := &HelloResponse{} - if err := conn.Call("HelloService.Hello", req, resp); err != nil { + resp := &service.HelloResponse{} + // HelloService().Hello() + if err := client.Hello(req, resp); err != nil { panic(err) } diff --git a/skills/rpc/hello_world/server/main.go b/skills/rpc/hello_world/server/main.go index bad0327..fd80893 100644 --- a/skills/rpc/hello_world/server/main.go +++ b/skills/rpc/hello_world/server/main.go @@ -3,28 +3,24 @@ package main import ( "net" "net/rpc" + + "gitlab.com/go-course-project/go17/skills/rpc/hello_world/service" ) +var _ service.HelloService = (*HelloServiceServer)(nil) + // 实现业务功能 // req := &HelloRequest{} // resp := &HelloResponse{} -// err := &HelloServiceImpl{}.Hello(req, resp) +// err := &HelloServiceServer{}.Hello(req, resp) // net/rpc // 1. 写好的对象, 注册给RPC Server // 2. 再把RPC Server 启动起来 -type HelloServiceImpl struct { -} - -type HelloRequest struct { - MyName string `json:"my_name"` -} - -type HelloResponse struct { - Message string `json:"message"` +type HelloServiceServer struct { } // HTTP Handler -func (h *HelloServiceImpl) Hello(request *HelloRequest, response *HelloResponse) error { +func (h *HelloServiceServer) Hello(request *service.HelloRequest, response *service.HelloResponse) error { response.Message = "hello:" + request.MyName return nil } @@ -33,7 +29,7 @@ func main() { // 1. 把业务 注册给RPC // 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error // Hello(request *HelloRequest, response *HelloResponse) error - if err := rpc.RegisterName("HelloService", &HelloServiceImpl{}); err != nil { + if err := rpc.RegisterName("HelloService", &HelloServiceServer{}); err != nil { panic(err) } diff --git a/skills/rpc/hello_world/service/client.go b/skills/rpc/hello_world/service/client.go new file mode 100644 index 0000000..76bd194 --- /dev/null +++ b/skills/rpc/hello_world/service/client.go @@ -0,0 +1,33 @@ +package service + +import ( + "net/rpc" +) + +func NewClient(address string) (HelloService, error) { + conn, err := rpc.Dial("tcp", address) + if err != nil { + return nil, err + } + + // buf := bytes.NewBuffer([]byte{}) + // gob.NewEncoder(buf).Encode(HelloRequest{Name: "test"}) + + // + // reader := bytes.NewReader([]byte("{}")) + // resp := HelloRequest{Name: "test"} + // gob.NewDecoder(reader).Decode(&resp) + return &HelloServiceClient{conn: conn}, nil +} + +// 要封装原始的 不友好的rpc call +type HelloServiceClient struct { + conn *rpc.Client +} + +func (c *HelloServiceClient) Hello(request *HelloRequest, response *HelloResponse) error { + if err := c.conn.Call("HelloService.Hello", request, response); err != nil { + panic(err) + } + return nil +} diff --git a/skills/rpc/hello_world/service/interface.go b/skills/rpc/hello_world/service/interface.go new file mode 100644 index 0000000..7ca2a57 --- /dev/null +++ b/skills/rpc/hello_world/service/interface.go @@ -0,0 +1,13 @@ +package service + +type HelloService interface { + Hello(request *HelloRequest, response *HelloResponse) error +} + +type HelloRequest struct { + MyName string `json:"my_name"` +} + +type HelloResponse struct { + Message string `json:"message"` +}