json on tcp

This commit is contained in:
yumaojun03 2025-02-16 12:00:21 +08:00
parent 45ef1f021e
commit 8fb74b563e
3 changed files with 20 additions and 6 deletions

View File

@ -1,5 +1,7 @@
# RPC # RPC
[课件](https://gitee.com/infraboard/go-course/blob/master/day15/rpc.md#json-on-http)
+ Go语言内置RPC框架的使用(原始) + Go语言内置RPC框架的使用(原始)
+ 基于接口封装优化好的RPC + 基于接口封装优化好的RPC
+ Protobuf介绍与环境准备 + Protobuf介绍与环境准备
@ -33,5 +35,6 @@ Protobuf的包机制以及使用方式
RPC是远程过程调用的简称是分布式系统中不同节点间流行的通信方式。在互联网时代RPC已经和IPC一样成为一个不可或缺的基础构件。 RPC是远程过程调用的简称是分布式系统中不同节点间流行的通信方式。在互联网时代RPC已经和IPC一样成为一个不可或缺的基础构件。
## GO语言内置RPC ```sh
echo -e '{"method":"HelloService.Hello","params":[{"my_name":"bob"}],"id":1}' | nc localhost 1234
```

View File

@ -3,6 +3,7 @@ package main
import ( import (
"net" "net"
"net/rpc" "net/rpc"
"net/rpc/jsonrpc"
"gitlab.com/go-course-project/go17/skills/rpc/hello_world/service" "gitlab.com/go-course-project/go17/skills/rpc/hello_world/service"
) )
@ -45,6 +46,10 @@ func main() {
continue continue
} }
// 用户的net层数据 转交给 rpc框架 // 用户的net层数据 转交给 rpc框架
go rpc.ServeConn(conn) // go rpc.ServeConn(conn)
// json codec(server)
// req(bytes) --> obj
// resp(obj) --> bytes
go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
} }
} }

View File

@ -1,15 +1,21 @@
package service package service
import ( import (
"log"
"net"
"net/rpc" "net/rpc"
"net/rpc/jsonrpc"
) )
func NewClient(address string) (HelloService, error) { func NewClient(address string) (HelloService, error) {
conn, err := rpc.Dial("tcp", address) // 建立TCP连接
conn, err := net.Dial("tcp", "localhost:1234")
if err != nil { if err != nil {
return nil, err log.Fatal("net.Dial:", err)
} }
client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
// buf := bytes.NewBuffer([]byte{}) // buf := bytes.NewBuffer([]byte{})
// gob.NewEncoder(buf).Encode(HelloRequest{Name: "test"}) // gob.NewEncoder(buf).Encode(HelloRequest{Name: "test"})
@ -17,7 +23,7 @@ func NewClient(address string) (HelloService, error) {
// reader := bytes.NewReader([]byte("{}")) // reader := bytes.NewReader([]byte("{}"))
// resp := HelloRequest{Name: "test"} // resp := HelloRequest{Name: "test"}
// gob.NewDecoder(reader).Decode(&resp) // gob.NewDecoder(reader).Decode(&resp)
return &HelloServiceClient{conn: conn}, nil return &HelloServiceClient{conn: client}, nil
} }
// 要封装原始的 不友好的rpc call // 要封装原始的 不友好的rpc call