Skip to content

Commit c4a090e

Browse files
committed
✨ feat:1.update
1 parent 23fa424 commit c4a090e

File tree

9 files changed

+148
-156
lines changed

9 files changed

+148
-156
lines changed

simple-rpc-go/demo/client.go

+12-35
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,28 @@
11
package main
22

33
import (
4-
"bytes"
5-
"encoding/gob"
64
"fmt"
7-
"net"
85

96
lib "github.com/FewOfCode/simple-rpc"
107
)
118

129
func main() {
13-
conn, err := net.Dial("tcp", "127.0.0.1:8000")
10+
client, err := lib.NewClient("127.0.0.1", 8000)
1411
if err != nil {
1512
fmt.Println("dial failed, err", err)
1613
return
1714
}
18-
defer conn.Close()
19-
d := lib.Entry{
20-
MethodName: "Sub",
21-
Parameters: map[string]interface{}{
22-
"param1": 2,
23-
"param2": 1,
24-
},
25-
MethodClass: "Math",
26-
Options: map[string]interface{}{
27-
"Attr1": 11,
28-
},
15+
defer client.Close()
16+
params := map[string]interface{}{
17+
"param1": 2,
18+
"param2": 1,
2919
}
30-
// msg, err := json.Marshal(d)
31-
32-
var buf bytes.Buffer
33-
bufEnc := gob.NewEncoder(&buf)
34-
// 编码器对数据编码
35-
if err := bufEnc.Encode(d); err != nil {
36-
fmt.Println("encode error", err)
37-
} else {
38-
msg := buf.Bytes()
39-
// lib.Pack()
40-
_msg, err := lib.Pack(msg)
41-
if err != nil {
42-
fmt.Println("get error", err)
43-
}
44-
fmt.Println("after pack", _msg)
45-
conn.Write(_msg)
46-
// reader := bufio.NewReader(conn)
47-
48-
// res:=U
20+
options := map[string]interface{}{
21+
"Attr1": 11,
4922
}
50-
23+
result, err := client.Call("Math", "Sub", params, options)
24+
if err != nil {
25+
fmt.Println("call rpa error", err)
26+
}
27+
fmt.Println(">>> get res", result.Result)
5128
}

simple-rpc-go/demo/go.mod

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ go 1.17
55

66

77
require "github.com/FewOfCode/simple-rpc" v0.0.0
8-
replace "github.com/FewOfCode/simple-rpc" => "../src"
8+
replace "github.com/FewOfCode/simple-rpc" => "../src"
9+
require "protocol" v0.0.0
10+
replace "protocol" => "../protocol"

simple-rpc-go/demo/server.go

+4-40
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,14 @@
11
package main
22

33
import (
4-
"fmt"
5-
"net"
4+
proto "protocol"
65

76
lib "github.com/FewOfCode/simple-rpc"
87
)
98

10-
// 供客户端调用的接口,后期支持根据协议自动生成
11-
12-
type SimpleRpcApi interface {
13-
// 所有的接口全部属于 SimpleRpcApi ,SimpleRpcApi为固定
14-
Sub(int, int) int
15-
Add(int, int) int
16-
}
17-
18-
type Math struct {
19-
Attr1 int
20-
}
21-
22-
func (t Math) Sub(arg1 int, arg2 int) int {
23-
fmt.Println("api is called", arg1, arg2)
24-
res := arg1 - arg2
25-
return res
26-
}
27-
28-
func (t Math) Add(arg1 int, arg2 int) int {
29-
fmt.Println("api is called", arg1, arg2)
30-
res := arg1 + arg2
31-
return res
32-
}
33-
349
func main() {
3510
// 注册下方法到全局MAP
36-
lib.Register("Math", Math{})
37-
listen, err := net.Listen("tcp", "127.0.0.1:8000")
38-
if err != nil {
39-
fmt.Println("listen failed, err:", err)
40-
return
41-
}
42-
for {
43-
conn, err := listen.Accept() // 建立连接
44-
if err != nil {
45-
fmt.Println("accept failed, err:", err)
46-
continue
47-
}
48-
go lib.Process(conn) // 启动一个goroutine处理连接
49-
}
11+
server := lib.NewServer("127.0.0.1", 8000)
12+
server.Register("Math", proto.Math{})
13+
server.Run()
5014
}

simple-rpc-go/protocol/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module protocol
2+
3+
go 1.17
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
package src
1+
package protocol
22

33
import (
44
"fmt"
5-
"net"
65
)
76

87
// 供客户端调用的接口,后期支持根据协议自动生成
@@ -28,21 +27,3 @@ func (t Math) Add(arg1 int, arg2 int) int {
2827
res := arg1 + arg2
2928
return res
3029
}
31-
32-
func main() {
33-
// 注册下方法到全局MAP
34-
Register("Math", Math{})
35-
listen, err := net.Listen("tcp", "127.0.0.1:8000")
36-
if err != nil {
37-
fmt.Println("listen failed, err:", err)
38-
return
39-
}
40-
for {
41-
conn, err := listen.Accept() // 建立连接
42-
if err != nil {
43-
fmt.Println("accept failed, err:", err)
44-
continue
45-
}
46-
go Process(conn) // 启动一个goroutine处理连接
47-
}
48-
}

simple-rpc-go/src/adapter.go

+15-21
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,35 @@ import (
77
"reflect"
88
)
99

10-
var simpleRpcApi map[string]reflect.Value = make(map[string]reflect.Value)
11-
12-
func Register(name string, T interface{}) {
13-
if _, ok := simpleRpcApi[name]; ok {
14-
return
15-
}
16-
simpleRpcApi[name] = reflect.ValueOf(T)
17-
}
18-
1910
type Entry struct {
20-
MethodName string `json:"method_name"`
21-
Parameters map[string]interface{} `json:"parameters"`
22-
MethodClass string `json:"method_class"`
23-
Options map[string]interface{} `json:"options"`
11+
MethodName string `json:"method_name"`
12+
Parameters map[string]interface{} `json:"parameters"`
13+
ClassName string `json:"class_class"`
14+
Options map[string]interface{} `json:"options"`
2415
}
2516

2617
type Result struct {
27-
Result interface{} `json:"result"`
18+
Result []interface{} `json:"result"`
2819
}
2920

30-
func (m *Entry) Call() (interface{}, error) {
31-
st := simpleRpcApi[m.MethodClass]
21+
func (m *Entry) Call(s *Server) ([]interface{}, error) {
22+
st := s.ApiSet[m.ClassName]
3223
args := make([]reflect.Value, 0, len(m.Parameters))
3324
for _, arg := range m.Parameters {
3425
args = append(args, reflect.ValueOf(arg))
3526
}
3627
method := st.MethodByName(m.MethodName)
3728
fmt.Println("call class --> ", method, args)
3829

39-
res := method.Call(args)
40-
41-
return res, nil
30+
out := method.Call(args)
31+
outArgs := make([]interface{}, 0, len(out))
32+
for _, o := range out {
33+
outArgs = append(outArgs, o.Interface())
34+
}
35+
return outArgs, nil
4236
}
4337

44-
func Handle(header map[string]string, body []byte) (interface{}, error) {
38+
func Handle(header map[string]string, body []byte, s *Server) ([]interface{}, error) {
4539
var entry Entry
4640
// err := json.Unmarshal(body, &entry)
4741
buf := bytes.NewBuffer(body)
@@ -53,5 +47,5 @@ func Handle(header map[string]string, body []byte) (interface{}, error) {
5347
fmt.Println("convert str to json error", err)
5448
return nil, err
5549
}
56-
return entry.Call()
50+
return entry.Call(s)
5751
}

simple-rpc-go/src/client.go

+69-12
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,73 @@
11
package src
22

3-
// func main() {
4-
// conn, err := net.Dial("tcp", "127.0.0.1:8000")
5-
// if err != nil {
6-
// fmt.Println("dial failed, err", err)
7-
// return
8-
// }
9-
// defer conn.Close()
3+
import (
4+
"bufio"
5+
"bytes"
6+
"encoding/gob"
7+
"fmt"
8+
"net"
9+
)
1010

11-
// msg := `version:2222`
12-
// conn.Write([]byte(msg))
13-
// conn.Write([]byte("\r\n"))
11+
type Client struct {
12+
Addr string
13+
Port int
14+
Conn net.Conn
15+
}
1416

15-
// conn.Write([]byte("\r\n"))
16-
// }
17+
func NewClient(Addr string, Port int) (*Client, error) {
18+
addr := fmt.Sprintf("%s:%d", Addr, Port)
19+
conn, err := net.Dial("tcp", addr)
20+
if err != nil {
21+
fmt.Println("dial failed, err", err)
22+
return nil, err
23+
}
24+
return &Client{Addr: Addr, Port: Port, Conn: conn}, nil
25+
}
26+
27+
func (c *Client) Close() {
28+
c.Conn.Close()
29+
}
30+
31+
func (c *Client) Call(ClassName string, MethodName string, Parameters map[string]interface{}, Options map[string]interface{}) (*Result, error) {
32+
d := Entry{
33+
MethodName: MethodName,
34+
Parameters: Parameters,
35+
ClassName: ClassName,
36+
Options: Options,
37+
}
38+
// msg, err := json.Marshal(d)
39+
40+
var buf bytes.Buffer
41+
bufEnc := gob.NewEncoder(&buf)
42+
// 编码器对数据编码
43+
if err := bufEnc.Encode(d); err != nil {
44+
fmt.Println("encode error", err)
45+
return nil, err
46+
} else {
47+
msg := buf.Bytes()
48+
_msg, err := Pack(msg)
49+
if err != nil {
50+
fmt.Println("get error", err)
51+
}
52+
fmt.Println("after pack", _msg)
53+
c.Conn.Write(_msg)
54+
// await return call result
55+
reader := bufio.NewReader(c.Conn)
56+
_, body, err := Unpack(reader)
57+
if err != nil {
58+
fmt.Println("get response error", err)
59+
return nil, err
60+
} else {
61+
buf := bytes.NewBuffer(body)
62+
var res Result
63+
// 得到字节数组解码器
64+
bufDec := gob.NewDecoder(buf)
65+
err := bufDec.Decode(&res)
66+
if err != nil {
67+
fmt.Println("decode result error", err)
68+
return nil, err
69+
}
70+
return &res, nil
71+
}
72+
}
73+
}

simple-rpc-go/src/frame.go

-25
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,3 @@ func Unpack(reader *bufio.Reader) (map[string]string, []byte, error) {
6767
}
6868
return header, body, nil
6969
}
70-
71-
// 编码
72-
// func encode(data interface) ([]byte, error) {
73-
// //得到字节数组的编码器
74-
// var buf bytes.Buffer
75-
// bufEnc := gob.NewEncoder(&buf)
76-
// // 编码器对数据编码
77-
// if err := bufEnc.Encode(data); err != nil {
78-
// return nil, err
79-
// }
80-
// return buf.Bytes(), nil
81-
// }
82-
83-
// // 解码
84-
// func decode(b []byte) (RPCData, error) {
85-
// buf := bytes.NewBuffer(b)
86-
// // 得到字节数组解码器
87-
// bufDec := gob.NewDecoder(buf)
88-
// // 解码器对数据节码
89-
// var data RPCData
90-
// if err := bufDec.Decode(&data); err != nil {
91-
// return data, err
92-
// }
93-
// return data, nil
94-
// }

0 commit comments

Comments
 (0)