补充lient

This commit is contained in:
yumaojun03 2025-02-16 11:41:36 +08:00
parent 2f8a4f3900
commit 45ef1f021e
4 changed files with 61 additions and 25 deletions

View File

@ -2,31 +2,25 @@ package main
import ( import (
"fmt" "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() { func main() {
// 1. 通过网络调用 服务端的函数(RPC) // 1. 通过网络调用 服务端的函数(RPC)
// 建立网络连接 // 建立网络连接
conn, err := rpc.Dial("tcp", "127.0.0.1:1234") client, err := service.NewClient("127.0.0.1:1234")
if err != nil { if err != nil {
panic(err) panic(err)
} }
// 方法调用 // 方法调用
// serviceMethod string, args any, reply any // serviceMethod string, args any, reply any
req := &HelloRequest{ req := &service.HelloRequest{
MyName: "bob", MyName: "bob",
} }
resp := &HelloResponse{} resp := &service.HelloResponse{}
if err := conn.Call("HelloService.Hello", req, resp); err != nil { // HelloService().Hello()
if err := client.Hello(req, resp); err != nil {
panic(err) panic(err)
} }

View File

@ -3,28 +3,24 @@ package main
import ( import (
"net" "net"
"net/rpc" "net/rpc"
"gitlab.com/go-course-project/go17/skills/rpc/hello_world/service"
) )
var _ service.HelloService = (*HelloServiceServer)(nil)
// 实现业务功能 // 实现业务功能
// req := &HelloRequest{} // req := &HelloRequest{}
// resp := &HelloResponse{} // resp := &HelloResponse{}
// err := &HelloServiceImpl{}.Hello(req, resp) // err := &HelloServiceServer{}.Hello(req, resp)
// net/rpc // net/rpc
// 1. 写好的对象, 注册给RPC Server // 1. 写好的对象, 注册给RPC Server
// 2. 再把RPC Server 启动起来 // 2. 再把RPC Server 启动起来
type HelloServiceImpl struct { type HelloServiceServer struct {
}
type HelloRequest struct {
MyName string `json:"my_name"`
}
type HelloResponse struct {
Message string `json:"message"`
} }
// HTTP Handler // 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 response.Message = "hello:" + request.MyName
return nil return nil
} }
@ -33,7 +29,7 @@ func main() {
// 1. 把业务 注册给RPC // 1. 把业务 注册给RPC
// 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error // 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error
// Hello(request *HelloRequest, response *HelloResponse) 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) panic(err)
} }

View File

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

View File

@ -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"`
}