Skip to content
This repository was archived by the owner on Oct 16, 2024. It is now read-only.

Commit b6c0a56

Browse files
committed
优化
1 parent fe00bed commit b6c0a56

File tree

3 files changed

+140
-41
lines changed

3 files changed

+140
-41
lines changed

go.mod

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ require (
88
github.com/gin-contrib/sessions v1.0.1
99
github.com/gin-gonic/gin v1.10.0
1010
github.com/go-sql-driver/mysql v1.8.1
11+
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1
12+
github.com/goccy/go-json v0.10.3
1113
github.com/god-jason/bucket v0.0.4
1214
github.com/rs/xid v1.5.0
1315
github.com/segmentio/ksuid v1.0.4
16+
github.com/shamaton/msgpack/v2 v2.2.0
1417
github.com/shirou/gopsutil/v4 v4.24.7
1518
github.com/spf13/viper v1.19.0
1619
go.bug.st/serial v1.6.2
20+
gopkg.in/yaml.v3 v3.0.1
1721
xorm.io/builder v0.3.13
1822
xorm.io/xorm v1.3.9
1923
)
@@ -34,7 +38,6 @@ require (
3438
github.com/go-playground/locales v0.14.1 // indirect
3539
github.com/go-playground/universal-translator v0.18.1 // indirect
3640
github.com/go-playground/validator/v10 v10.22.0 // indirect
37-
github.com/goccy/go-json v0.10.3 // indirect
3841
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
3942
github.com/golang/snappy v0.0.4 // indirect
4043
github.com/gorilla/context v1.1.2 // indirect
@@ -79,7 +82,6 @@ require (
7982
gopkg.in/ini.v1 v1.67.0 // indirect
8083
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
8184
gopkg.in/yaml.v2 v2.4.0 // indirect
82-
gopkg.in/yaml.v3 v3.0.1 // indirect
8385
modernc.org/libc v1.54.2 // indirect
8486
modernc.org/sqlite v1.30.1 // indirect
8587
)

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4
5353
github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
5454
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
5555
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
56+
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ=
57+
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI=
5658
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
5759
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
5860
github.com/god-jason/bucket v0.0.4 h1:SQ6mnFjtuRjffjOtCf9CICQdMSmLFt7pkER3MG0Bg1g=
@@ -140,6 +142,8 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g
140142
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
141143
github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c=
142144
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
145+
github.com/shamaton/msgpack/v2 v2.2.0 h1:IP1m01pHwCrMa6ZccP9B3bqxEMKMSmMVAVKk54g3L/Y=
146+
github.com/shamaton/msgpack/v2 v2.2.0/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI=
143147
github.com/shirou/gopsutil/v4 v4.24.7 h1:V9UGTK4gQ8HvcnPKf6Zt3XHyQq/peaekfxpJ2HSocJk=
144148
github.com/shirou/gopsutil/v4 v4.24.7/go.mod h1:0uW/073rP7FYLOkvxolUQM5rMOLTNmRXnFKafpb71rw=
145149
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=

rpc/pack.go

+132-39
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,132 @@
1-
package rpc
2-
3-
4-
const (
5-
DISCONNECT uint8 = iota
6-
CONNECT
7-
CONNECT_ACK
8-
HEARTBEAT
9-
REQUEST
10-
REQUEST_END
11-
RESPONSE
12-
RESPONSE_END
13-
STREAM
14-
STREAM_END
15-
PUBLISH
16-
PUBLISH_END
17-
PUBLISH_ACK
18-
SUBSCRIBE
19-
SUBSCRIBE_ACK
20-
UNSUBSCRIBE
21-
)
22-
23-
const (
24-
BINARY uint8 = iota
25-
JSON
26-
XML
27-
YAML
28-
CSV
29-
MSGPACK
30-
PROTOBUF
31-
)
32-
33-
34-
type Pack struct {
35-
Type uint8
36-
Encoding uint8
37-
Id uint16
38-
Length uint16
39-
}
1+
package rpc
2+
3+
import (
4+
"encoding/binary"
5+
"encoding/xml"
6+
"errors"
7+
"github.com/gocarina/gocsv"
8+
"github.com/goccy/go-json"
9+
"github.com/shamaton/msgpack/v2"
10+
"gopkg.in/yaml.v3"
11+
)
12+
13+
var ErrEncoding = errors.New("编码不支持")
14+
var ErrNotEnough = errors.New("长度不足")
15+
16+
type Encoder func(any) ([]byte, error)
17+
type Decoder func([]byte, any) error
18+
19+
const MAGIC = "rgc"
20+
21+
const (
22+
DISCONNECT uint8 = iota
23+
CONNECT
24+
CONNECT_ACK
25+
HEARTBEAT
26+
REQUEST
27+
REQUEST_END
28+
RESPONSE
29+
RESPONSE_END
30+
STREAM
31+
STREAM_END
32+
PUBLISH
33+
PUBLISH_END
34+
PUBLISH_ACK
35+
SUBSCRIBE
36+
SUBSCRIBE_ACK
37+
UNSUBSCRIBE
38+
)
39+
40+
const (
41+
BINARY uint8 = iota
42+
JSON
43+
XML
44+
YAML
45+
CSV
46+
MSGPACK
47+
PROTOBUF
48+
)
49+
50+
var encoders = map[uint8]Encoder{
51+
JSON: json.Marshal,
52+
XML: xml.Marshal,
53+
YAML: yaml.Marshal,
54+
CSV: gocsv.MarshalBytes,
55+
MSGPACK: msgpack.Marshal,
56+
}
57+
58+
var decoders = map[uint8]Decoder{
59+
JSON: json.Unmarshal,
60+
XML: xml.Unmarshal,
61+
YAML: yaml.Unmarshal,
62+
CSV: gocsv.UnmarshalBytes,
63+
MSGPACK: msgpack.Unmarshal,
64+
}
65+
66+
func RegisterEncoding(typ uint8, encoder Encoder, decoder Decoder) {
67+
encoders[typ] = encoder
68+
decoders[typ] = decoder
69+
}
70+
71+
type Pack struct {
72+
Type uint8
73+
Encoding uint8
74+
Id uint16
75+
Length uint16
76+
Data []byte
77+
Content any
78+
}
79+
80+
func (p *Pack) Encode() (buf []byte, err error) {
81+
if p.Content != nil && p.Encoding > 0 {
82+
if encoder, ok := encoders[p.Encoding]; ok {
83+
p.Data, err = encoder(p.Content)
84+
} else {
85+
err = ErrEncoding
86+
}
87+
88+
if err != nil {
89+
return
90+
}
91+
}
92+
93+
//构建包
94+
p.Length = uint16(len(p.Data))
95+
buf = make([]byte, 8+len(p.Data))
96+
copy(buf, MAGIC)
97+
buf[3] = p.Type<<4 + p.Encoding&0xF0
98+
binary.BigEndian.PutUint16(buf[4:], p.Id)
99+
binary.BigEndian.PutUint16(buf[6:], p.Length)
100+
if p.Data != nil {
101+
copy(buf[8:], p.Data) //内存复制了
102+
}
103+
return
104+
}
105+
106+
func (p *Pack) Decode(buf []byte) (err error) {
107+
p.Id = binary.BigEndian.Uint16(buf[4:])
108+
p.Length = binary.BigEndian.Uint16(buf[6:])
109+
p.Type = buf[3] >> 4
110+
p.Encoding = buf[3] & 0xF0
111+
112+
if p.Length > 0 {
113+
if len(buf) < 8+int(p.Length) {
114+
return ErrNotEnough
115+
}
116+
p.Data = buf[8 : 8+p.Length]
117+
118+
if p.Encoding > 0 {
119+
if decoder, ok := decoders[p.Encoding]; ok {
120+
err = decoder(p.Data, p.Content)
121+
} else {
122+
err = ErrEncoding
123+
}
124+
} else {
125+
p.Content = p.Data
126+
}
127+
if err != nil {
128+
return
129+
}
130+
}
131+
return
132+
}

0 commit comments

Comments
 (0)