diff --git a/README.md b/README.md
index fd8aa38..f5c8d73 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
# go_study
-person study
-study git
+person study
+ git&&log
diff --git a/tcpboxV0.8/Client.go b/TcpBox/Client.go
similarity index 90%
rename from tcpboxV0.8/Client.go
rename to TcpBox/Client.go
index 5c11e30..4a487e9 100644
--- a/tcpboxV0.8/Client.go
+++ b/TcpBox/Client.go
@@ -4,8 +4,8 @@ import (
"fmt"
"io"
"net"
+ "tcpbox/tcpnet"
"time"
- "zinx/znet"
)
func main() {
@@ -18,8 +18,8 @@ func main() {
defer conn.Close()
for {
//发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
+ dp := tcpnet.NewDataPack()
+ ms := tcpnet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
binaryMsg, err := dp.Pack(ms)
if nil != err {
fmt.Println("Pack error:", err)
@@ -50,7 +50,7 @@ func main() {
}
if msgHead.GetMsgLen() > 0 {
//再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
+ msg := msgHead.(*tcpnet.Message)
msg.MsgData = make([]byte, msg.GetMsgLen())
if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
diff --git a/tcpboxV0.6/Client1.go b/TcpBox/Client1.go
similarity index 100%
rename from tcpboxV0.6/Client1.go
rename to TcpBox/Client1.go
diff --git a/tcpboxV0.9/Server.go b/TcpBox/Server.go
similarity index 100%
rename from tcpboxV0.9/Server.go
rename to TcpBox/Server.go
diff --git a/tcpboxV0.9/conf/zinx.json b/TcpBox/conf/tcpbox.json
similarity index 89%
rename from tcpboxV0.9/conf/zinx.json
rename to TcpBox/conf/tcpbox.json
index c36ff3c..b3b7002 100644
--- a/tcpboxV0.9/conf/zinx.json
+++ b/TcpBox/conf/tcpbox.json
@@ -1,5 +1,5 @@
{
- "Name": "ZinxApp",
+ "Name": "TcpBoxApp",
"Host": "0.0.0.0",
"Version": 0.6,
"IPVersion": "tcp4",
diff --git a/tcpboxV0.1/go.mod b/TcpBox/go.mod
similarity index 100%
rename from tcpboxV0.1/go.mod
rename to TcpBox/go.mod
diff --git a/uxic.txt b/TcpBox/go.sum
similarity index 100%
rename from uxic.txt
rename to TcpBox/go.sum
diff --git a/tcpboxV0.4/tcpiface/IMessage.go b/TcpBox/tcpiface/IMessage.go
similarity index 100%
rename from tcpboxV0.4/tcpiface/IMessage.go
rename to TcpBox/tcpiface/IMessage.go
diff --git a/tcpboxV0.6/tcpiface/iMsgHandle.go b/TcpBox/tcpiface/iMsgHandle.go
similarity index 100%
rename from tcpboxV0.6/tcpiface/iMsgHandle.go
rename to TcpBox/tcpiface/iMsgHandle.go
diff --git a/tcpboxV0.8/tcpiface/iconnection.go b/TcpBox/tcpiface/iconnection.go
similarity index 100%
rename from tcpboxV0.8/tcpiface/iconnection.go
rename to TcpBox/tcpiface/iconnection.go
diff --git a/tcpboxV0.7/tcpiface/iconnmanager.go b/TcpBox/tcpiface/iconnmanager.go
similarity index 100%
rename from tcpboxV0.7/tcpiface/iconnmanager.go
rename to TcpBox/tcpiface/iconnmanager.go
diff --git a/tcpboxV0.5/tcpiface/imsgpack.go b/TcpBox/tcpiface/imsgpack.go
similarity index 100%
rename from tcpboxV0.5/tcpiface/imsgpack.go
rename to TcpBox/tcpiface/imsgpack.go
diff --git a/tcpboxV0.5/tcpiface/irequest.go b/TcpBox/tcpiface/irequest.go
similarity index 100%
rename from tcpboxV0.5/tcpiface/irequest.go
rename to TcpBox/tcpiface/irequest.go
diff --git a/tcpboxV0.5/tcpiface/irouter.go b/TcpBox/tcpiface/irouter.go
similarity index 100%
rename from tcpboxV0.5/tcpiface/irouter.go
rename to TcpBox/tcpiface/irouter.go
diff --git a/tcpboxV0.8/tcpiface/iserver.go b/TcpBox/tcpiface/iserver.go
similarity index 100%
rename from tcpboxV0.8/tcpiface/iserver.go
rename to TcpBox/tcpiface/iserver.go
diff --git a/tcpboxV0.9/tcpnet/connection.go b/TcpBox/tcpnet/connection.go
similarity index 91%
rename from tcpboxV0.9/tcpnet/connection.go
rename to TcpBox/tcpnet/connection.go
index e9a95b1..ad7a4fb 100644
--- a/tcpboxV0.9/tcpnet/connection.go
+++ b/TcpBox/tcpnet/connection.go
@@ -18,7 +18,7 @@ type Connection struct {
//当前conn隶属于哪个server
TcpServer tcpiface.IServer
- //当球按连接的socket
+ //当前按连接的socket
Conn *net.TCPConn
//连接的ID
@@ -43,7 +43,7 @@ type Connection struct {
propertyLock sync.RWMutex
}
-//初始化链接模块的方法
+// 初始化链接模块的方法
func NewConnection(server tcpiface.IServer, conn *net.TCPConn, connID uint32, msgHandler tcpiface.IMsgHandle) *Connection {
c := &Connection{
TcpServer: server,
@@ -59,7 +59,7 @@ func NewConnection(server tcpiface.IServer, conn *net.TCPConn, connID uint32, ms
return c
}
-//链接的读数据方法
+// 链接的读数据方法
func (c *Connection) StartReader() {
fmt.Println("Reader goroutine is running...")
@@ -118,7 +118,7 @@ func (c *Connection) StartReader() {
}
}
-//写消息的goroutine,专门将消息发送给客户端的模块
+// 写消息的goroutine,专门将消息发送给客户端的模块
func (c *Connection) StartWriter() {
fmt.Println("Writer Goroutine is running!!!")
defer fmt.Println(c.RemoteAddr().String(), "[conn writer exit!]")
@@ -140,7 +140,7 @@ func (c *Connection) StartWriter() {
}
}
-//启动链接,让当前的链接准备工作
+// 启动链接,让当前的链接准备工作
func (c *Connection) Start() {
fmt.Println(" Conn Start()... ConnID:", c.ConnID)
@@ -157,7 +157,7 @@ func (c *Connection) Start() {
}
-//停止链接,结束当前链接的工作
+// 停止链接,结束当前链接的工作
func (c *Connection) Stop() {
fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
@@ -184,22 +184,22 @@ func (c *Connection) Stop() {
}
-//获取当前链接绑定的socket conn
+// 获取当前链接绑定的socket conn
func (c *Connection) GetTCPConnection() *net.TCPConn {
return c.Conn
}
-//获取当前连接模块的连接ID
+// 获取当前连接模块的连接ID
func (c *Connection) GetConnID() uint32 {
return c.ConnID
}
-//获取远程客户端的TCP状态 IP PORT
+// 获取远程客户端的TCP状态 IP PORT
func (c *Connection) RemoteAddr() net.Addr {
return c.Conn.RemoteAddr()
}
-//发送数据,将数据发送给远程的客户端
+// 发送数据,将数据发送给远程的客户端
func (c *Connection) SendMsg(msgID uint32, data []byte) error {
if c.isClosed == true {
return errors.New("Connection closed when send msg")
@@ -218,7 +218,7 @@ func (c *Connection) SendMsg(msgID uint32, data []byte) error {
return nil
}
-//设置连接属性
+// 设置连接属性
func (c *Connection) SetProperty(key string, value interface{}) {
c.propertyLock.Lock()
defer c.propertyLock.Unlock()
@@ -227,7 +227,7 @@ func (c *Connection) SetProperty(key string, value interface{}) {
c.property[key] = value
}
-//获取连接属性
+// 获取连接属性
func (c *Connection) GetProperty(key string) (interface{}, error) {
c.propertyLock.RLock()
defer c.propertyLock.RUnlock()
@@ -239,7 +239,7 @@ func (c *Connection) GetProperty(key string) (interface{}, error) {
}
}
-//删除连接属性
+// 删除连接属性
func (c *Connection) RemoveProperty(key string) {
c.propertyLock.RLock()
defer c.propertyLock.RUnlock()
diff --git a/tcpboxV0.7/tcpnet/connmanager.go b/TcpBox/tcpnet/connmanager.go
similarity index 100%
rename from tcpboxV0.7/tcpnet/connmanager.go
rename to TcpBox/tcpnet/connmanager.go
diff --git a/tcpboxV0.5/tcpnet/message.go b/TcpBox/tcpnet/message.go
similarity index 100%
rename from tcpboxV0.5/tcpnet/message.go
rename to TcpBox/tcpnet/message.go
diff --git a/tcpboxV0.6/tcpnet/msgHandle.go b/TcpBox/tcpnet/msgHandle.go
similarity index 100%
rename from tcpboxV0.6/tcpnet/msgHandle.go
rename to TcpBox/tcpnet/msgHandle.go
diff --git a/tcpboxV0.6/tcpnet/msgpack.go b/TcpBox/tcpnet/msgpack.go
similarity index 100%
rename from tcpboxV0.6/tcpnet/msgpack.go
rename to TcpBox/tcpnet/msgpack.go
diff --git a/tcpboxV0.6/tcpnet/msgpack_test.go b/TcpBox/tcpnet/msgpack_test.go
similarity index 100%
rename from tcpboxV0.6/tcpnet/msgpack_test.go
rename to TcpBox/tcpnet/msgpack_test.go
diff --git a/tcpboxV0.5/tcpnet/request.go b/TcpBox/tcpnet/request.go
similarity index 100%
rename from tcpboxV0.5/tcpnet/request.go
rename to TcpBox/tcpnet/request.go
diff --git a/tcpboxV0.2/tcpnet/router.go b/TcpBox/tcpnet/router.go
similarity index 100%
rename from tcpboxV0.2/tcpnet/router.go
rename to TcpBox/tcpnet/router.go
diff --git a/tcpboxV0.8/tcpnet/server.go b/TcpBox/tcpnet/server.go
similarity index 100%
rename from tcpboxV0.8/tcpnet/server.go
rename to TcpBox/tcpnet/server.go
diff --git a/tcpboxV0.9/utils/globalobj.go b/TcpBox/utils/globalobj.go
similarity index 88%
rename from tcpboxV0.9/utils/globalobj.go
rename to TcpBox/utils/globalobj.go
index 7597ae8..f442c37 100644
--- a/tcpboxV0.9/utils/globalobj.go
+++ b/TcpBox/utils/globalobj.go
@@ -43,7 +43,7 @@ type GlobalObj struct {
var GlobalObject *GlobalObj
-//提供一个init方法,初始化GlobalObject对象
+// 提供一个init方法,初始化GlobalObject对象
func init() {
//如果配置文件没有加载,此为默认的配置
GlobalObject = &GlobalObj{
@@ -63,9 +63,9 @@ func init() {
GlobalObject.Reload()
}
-//从zinx.json去加载用户自定义的参数
+// 从zinx.json去加载用户自定义的参数
func (g *GlobalObj) Reload() {
- data, err := ioutil.ReadFile("./conf/zinx.json")
+ data, err := ioutil.ReadFile("./conf/tcpbox.json")
if nil != err {
panic("[Reload] Reload failed")
}
diff --git a/go_basic/dataStruct/BubbleSort/main.go b/dataStruct/BubbleSort/main.go
similarity index 100%
rename from go_basic/dataStruct/BubbleSort/main.go
rename to dataStruct/BubbleSort/main.go
diff --git a/go_basic/dataStruct/GraphBFS/main.go b/dataStruct/GraphBFS/main.go
similarity index 100%
rename from go_basic/dataStruct/GraphBFS/main.go
rename to dataStruct/GraphBFS/main.go
diff --git a/go_basic/dataStruct/GraphDFS/main.go b/dataStruct/GraphDFS/main.go
similarity index 100%
rename from go_basic/dataStruct/GraphDFS/main.go
rename to dataStruct/GraphDFS/main.go
diff --git a/go_basic/dataStruct/GraphDFSWithWeight/main.go b/dataStruct/GraphDFSWithWeight/main.go
similarity index 100%
rename from go_basic/dataStruct/GraphDFSWithWeight/main.go
rename to dataStruct/GraphDFSWithWeight/main.go
diff --git a/go_basic/dataStruct/GraphStoreChain/main.go b/dataStruct/GraphStoreChain/main.go
similarity index 100%
rename from go_basic/dataStruct/GraphStoreChain/main.go
rename to dataStruct/GraphStoreChain/main.go
diff --git a/go_basic/dataStruct/GraphStoreMatrix/main.go b/dataStruct/GraphStoreMatrix/main.go
similarity index 100%
rename from go_basic/dataStruct/GraphStoreMatrix/main.go
rename to dataStruct/GraphStoreMatrix/main.go
diff --git a/go_basic/dataStruct/InsertSort/main.go b/dataStruct/InsertSort/main.go
similarity index 100%
rename from go_basic/dataStruct/InsertSort/main.go
rename to dataStruct/InsertSort/main.go
diff --git a/go_basic/dataStruct/list/linkedListMgr/linkedListMgr.go b/dataStruct/list/linkedListMgr/linkedListMgr.go
similarity index 100%
rename from go_basic/dataStruct/list/linkedListMgr/linkedListMgr.go
rename to dataStruct/list/linkedListMgr/linkedListMgr.go
diff --git a/go_basic/dataStruct/list/main.go b/dataStruct/list/main.go
similarity index 100%
rename from go_basic/dataStruct/list/main.go
rename to dataStruct/list/main.go
diff --git a/go_basic/dataStruct/list/seqListMgr_map/seqListMgr_map.go b/dataStruct/list/seqListMgr_map/seqListMgr_map.go
similarity index 100%
rename from go_basic/dataStruct/list/seqListMgr_map/seqListMgr_map.go
rename to dataStruct/list/seqListMgr_map/seqListMgr_map.go
diff --git a/go_basic/dataStruct/list/seqListMgr_slice/seqListMgr_slice.go b/dataStruct/list/seqListMgr_slice/seqListMgr_slice.go
similarity index 100%
rename from go_basic/dataStruct/list/seqListMgr_slice/seqListMgr_slice.go
rename to dataStruct/list/seqListMgr_slice/seqListMgr_slice.go
diff --git a/go_basic/dataStruct/list/standard/node.go b/dataStruct/list/standard/node.go
similarity index 100%
rename from go_basic/dataStruct/list/standard/node.go
rename to dataStruct/list/standard/node.go
diff --git a/go_basic/dataStruct/list/standard/structInterface.go b/dataStruct/list/standard/structInterface.go
similarity index 100%
rename from go_basic/dataStruct/list/standard/structInterface.go
rename to dataStruct/list/standard/structInterface.go
diff --git a/go_basic/dataStruct/queue/linkedQueue/linkedQueue.go b/dataStruct/queue/linkedQueue/linkedQueue.go
similarity index 100%
rename from go_basic/dataStruct/queue/linkedQueue/linkedQueue.go
rename to dataStruct/queue/linkedQueue/linkedQueue.go
diff --git a/go_basic/dataStruct/queue/queueInterface/queue.go b/dataStruct/queue/queueInterface/queue.go
similarity index 100%
rename from go_basic/dataStruct/queue/queueInterface/queue.go
rename to dataStruct/queue/queueInterface/queue.go
diff --git a/go_basic/dataStruct/queue/seqQueue/seqQueue.go b/dataStruct/queue/seqQueue/seqQueue.go
similarity index 100%
rename from go_basic/dataStruct/queue/seqQueue/seqQueue.go
rename to dataStruct/queue/seqQueue/seqQueue.go
diff --git a/go_basic/dataStruct/stackStore/linkedStack/linkedStack.go b/dataStruct/stackStore/linkedStack/linkedStack.go
similarity index 100%
rename from go_basic/dataStruct/stackStore/linkedStack/linkedStack.go
rename to dataStruct/stackStore/linkedStack/linkedStack.go
diff --git a/go_basic/dataStruct/stackStore/seqStack/seqStack.go b/dataStruct/stackStore/seqStack/seqStack.go
similarity index 100%
rename from go_basic/dataStruct/stackStore/seqStack/seqStack.go
rename to dataStruct/stackStore/seqStack/seqStack.go
diff --git a/go_basic/dataStruct/stackStore/stackStandard/Stack.go b/dataStruct/stackStore/stackStandard/Stack.go
similarity index 100%
rename from go_basic/dataStruct/stackStore/stackStandard/Stack.go
rename to dataStruct/stackStore/stackStandard/Stack.go
diff --git a/go_basic/dataStruct/test.go b/dataStruct/test.go
similarity index 100%
rename from go_basic/dataStruct/test.go
rename to dataStruct/test.go
diff --git a/go_basic/dataStruct/tree/AVLtree/AVLtree.go b/dataStruct/tree/AVLtree/AVLtree.go
similarity index 100%
rename from go_basic/dataStruct/tree/AVLtree/AVLtree.go
rename to dataStruct/tree/AVLtree/AVLtree.go
diff --git a/go_basic/dataStruct/tree/RBTree/RBTree.go b/dataStruct/tree/RBTree/RBTree.go
similarity index 100%
rename from go_basic/dataStruct/tree/RBTree/RBTree.go
rename to dataStruct/tree/RBTree/RBTree.go
diff --git a/go_basic/dataStruct/tree/RBTree/util.go b/dataStruct/tree/RBTree/util.go
similarity index 100%
rename from go_basic/dataStruct/tree/RBTree/util.go
rename to dataStruct/tree/RBTree/util.go
diff --git a/go_basic/dataStruct/tree/binaryTree/binaryTree.go b/dataStruct/tree/binaryTree/binaryTree.go
similarity index 100%
rename from go_basic/dataStruct/tree/binaryTree/binaryTree.go
rename to dataStruct/tree/binaryTree/binaryTree.go
diff --git a/go_basic/dataStruct/tree/node/node.go b/dataStruct/tree/node/node.go
similarity index 100%
rename from go_basic/dataStruct/tree/node/node.go
rename to dataStruct/tree/node/node.go
diff --git a/go_basic/dataStruct/tree/treeStandard/treeStandard.go b/dataStruct/tree/treeStandard/treeStandard.go
similarity index 100%
rename from go_basic/dataStruct/tree/treeStandard/treeStandard.go
rename to dataStruct/tree/treeStandard/treeStandard.go
diff --git a/demo/redis_test/likui.go b/demo/redis_test/likui.go
new file mode 100644
index 0000000..69aaec7
--- /dev/null
+++ b/demo/redis_test/likui.go
@@ -0,0 +1,33 @@
+package main
+
+import (
+ "context"
+ "github.com/redis/go-redis/v9"
+ "log"
+ "os"
+)
+
+func main() {
+ client := redis.NewClient(&redis.Options{
+ Addr: "123.249.105.59:6379",
+ DB: 0,
+ Password: "950629",
+ PoolSize: 10,
+ })
+ result, err := client.Ping(context.Background()).Result()
+ if err != nil {
+ log.Printf("connect to redis failed err:%v", err)
+ panic("wrong")
+ }
+ log.Print(result)
+ log.SetFlags(log.Ldate | log.Ltime)
+ log.SetPrefix("[likui]")
+ log.SetOutput(os.Stdout)
+ test1(client)
+}
+func test1(client *redis.Client) {
+ set := client.Set(context.Background(), "test", "不再喜欢", 0)
+ log.Printf("operation:%v result:%v", set.String(), set.Val())
+ get := client.Get(context.Background(), "test")
+ log.Printf("operation:%v result:%v", get.String(), get.Val())
+}
diff --git a/demo/redis_test/main.go b/demo/redis_test/main.go
new file mode 100644
index 0000000..ef16b1f
--- /dev/null
+++ b/demo/redis_test/main.go
@@ -0,0 +1,338 @@
+package main
+
+import (
+ "fmt"
+ "github.com/go-redis/redis" //李鬼
+ "log"
+ "os"
+ // "github.com/redis/go-redis/v9" 正版
+)
+
+func initRedis() (client *redis.Client, err error) {
+ client = redis.NewClient(&redis.Options{
+ Addr: "123.249.105.59:6379",
+ Password: "950629",
+ DB: 0,
+ PoolSize: 100,
+ })
+ //client = redis.NewClusterClient(&redis.ClusterOptions{
+ // Addrs: []string{"123.249.105.59"},
+ // Password: "950629",
+ // PoolSize: 10,
+ //})
+ s, err := client.Ping().Result()
+ if err != nil {
+ log.Println("connect to redis failed!")
+ log.Printf("ping.result s:%s", s)
+ panic("create redis client failed!")
+ }
+ log.Println("connect to redis successfully")
+ return client, err
+}
+
+// //连接redis哨兵模式
+//
+// func initClient() {
+// redisDB = redis.NewFailoverClient(&redis.FailoverOptions{
+// MasterName: "master",
+// SentinelAddrs: []string{"x.x.x.x:3234", "x.x.x.x:23456", "x.x.x.x:35423"},
+// })
+// _, err := redisDB.Ping().Result()
+// if err != nil {
+// err = fmt.Errorf("connect to redis failed")
+// return
+// }
+// return
+// }
+//
+// //集群模式
+//
+// func initCluster() {
+// redisObject := redis.NewClusterClient(&redis.ClusterOptions{
+// Addrs: []string{":7000", ":9000", "7863"},
+// })
+// _, err := redisObject.Ping().Result()
+// if err != nil {
+// fmt.Println("connect to redis failed")
+// return
+// }
+// }
+type Student struct {
+ Id int64 `json:"id"`
+ Name string `json:"name"`
+ Gender int8 `json:"gender"`
+ Phone string `json:"phone"`
+}
+
+func test(client *redis.Client) {
+ log.SetOutput(os.Stdout)
+ log.SetFlags(log.Ltime)
+ log.SetPrefix("[redis]")
+ /************************************************
+ ******************测试返回值*Statuscmd和*StringCmd ***
+ **************顺便测试setnx和set和get *********/
+ //stat := client.Set("潘丽萍", "mylover", time.Second)
+ //
+ //v, err := stat.Result()
+ //
+ //fmt.Println("name:", stat.Name())
+ //fmt.Println("string:", stat.String())
+ //fmt.Println("val:", stat.Val())
+ //fmt.Println("err:", stat.Err())
+ //fmt.Println("args:", stat.Args())
+ //fmt.Println("result.v:", v)
+ //fmt.Println("result.err:", err)
+ //fmt.Println("--------------------------------------------")
+ //statv := client.Get("潘丽萍")
+ //v, err = statv.Result()
+ //fmt.Println("name:", statv.Name())
+ //fmt.Println("string:", statv.String())
+ //fmt.Println("val:", statv.Val())
+ //fmt.Println("err:", statv.Err())
+ //fmt.Println("args:", statv.Args())
+ //fmt.Println("result.v:", v)
+ //fmt.Println("result.err:", err)
+ ///********************************************************
+ //*******测试incr、incrby、decr、decrby***************************
+ // ***********************************************************/
+ //incr := client.Incr("潘丽萍")
+ //fmt.Println("string:", incr.String())
+ //decr := client.Decr("潘丽萍")
+ //fmt.Println("string:", decr.String())
+ //r := client.Set("l", 8, 0)
+ //log.Printf("[redis] opteration:%v result:%v\n", r.String(), r.Val())
+ //re := client.Incr("l")
+ //log.Printf("[redis] opteration:%v result:%v\n", re.String(), re.Val())
+ //res := client.IncrBy("l", int64(89))
+ //log.Printf("[redis] opteration:%v result:%v\n", res.String(), res.Val())
+ //resu := client.Decr("l")
+ //log.Printf("[redis] opteration:%v result:%v\n", resu.String(), resu.Val())
+ //resul := client.DecrBy("l", int64(50))
+ //log.Printf("[redis] opteration:%v result:%v\n", resul.String(), resul.Val())
+ /*********************************************************
+ **************存储序列化后的结构体、获取后反序列化****************
+ ********************************************************* */
+ //s := &Student{
+ // Id: 2131874897134812734,
+ // Name: "afsdfasdf",
+ // Gender: 0,
+ // Phone: "134234324234",
+ //}
+ //bytes, err := json.Marshal(s)
+ //if err != nil {
+ // log.Fatalf("marshal student failed err:%v\n", err)
+ //}
+ //nx := client.SetNX("student", bytes, time.Second)
+ //fmt.Println("string:", nx.String())
+ //get := client.Get("student")
+ //fmt.Println("string:", get.String())
+ //stu := Student{}
+ //err = json.Unmarshal([]byte(get.Val()), &stu)
+ //if err != nil {
+ // log.Printf("unmaeshal stu failed err:%v\n", err)
+ //}
+ //fmt.Println("stu:", stu)
+ /*******************************************************
+ **********************list的命令rpush、rpop、lpush、lpop、lrange、lindex**********
+ ******************************************************************************/
+ //rpush := client.RPush("lover", "潘")
+ //log.Printf("opteration:%v result:%v", rpush.String(), rpush.Val())
+ //lpush := client.LPush("lover", "丽")
+ //_ = client.LPush("lover", "萍")
+ //log.Printf("opteration:%v result:%v", lpush.String(), lpush.Val())
+ //rpop := client.RPop("lover")
+ //log.Printf("opteration:%v result:%v", rpop.String(), rpop.Val())
+ //lpop := client.LPop("lover")
+ //log.Printf("opteration:%v result:%v", lpop.String(), lpop.Val())
+ //for i := 0; i < 10; i++ {
+ // _ = client.LPush("number", i)
+ //}
+ //log.Printf("opteration:%v result:%v", rpush.String(), rpush.Val())
+ //lRange := client.LRange("number", 1, 6)
+ //log.Printf("opteration:%v result:%v", lRange.String(), lRange.Val())
+ //lIndex := client.LIndex("number", 0)
+ //log.Printf("opteration:%v result:%v", lIndex.String(), lIndex.Val())
+ /***************************************************************
+ ***********************集合set的操作 sadd、scard、smembers、sismember********
+ ************************************************************************
+ */
+ //sAdd := client.SAdd("set", "1", 2, "asfhasdfsadf", 7809018)
+ //log.Printf("opteration:%v result:%v", sAdd.String(), sAdd.Val())
+ //sCard := client.SCard("set")
+ //log.Printf("opteration:%v result:%v", sCard.String(), sCard.Val())
+ //sMembers := client.SMembers("set")
+ //log.Printf("opteration:%v result:%v", sMembers.String(), sMembers.Val())
+ //sIsMember := client.SIsMember("set", 1)
+ //log.Printf("opteration:%v result:%v", sIsMember.String(), sIsMember.Val())
+ /***********************************************************************
+ *******************hash散列 适合存储对象 操作 hset、hget、hgetall、hdel*******
+ ***********************************************************************
+ */
+ //hSet := client.HSet("潘丽萍", "name", "潘丽萍")
+ //log.Printf("opteration:%v result:%v", hSet.String(), hSet.Val())
+ //_ = client.HSet("潘丽萍", "gender", 0)
+ //_ = client.HSet("潘丽萍", "character", "作")
+ //hGet := client.HGet("潘丽萍", "character")
+ //log.Printf("opteration:%v result:%v", hGet.String(), hGet.Val())
+ //hGetAll := client.HGetAll("潘丽萍")
+ //log.Printf("opteration:%v result:%v", hGetAll.String(), hGetAll.Val())
+ //hDel := client.HDel("潘丽萍", "gender")
+ //log.Printf("opteration:%v result:%v", hDel.String(), hDel.Val())
+ //hGetAll = client.HGetAll("潘丽萍")
+ //log.Printf("opteration:%v result:%v", hGetAll.String(), hGetAll.Val())
+ /************************************************************************
+ **************有序结合zset 、成员唯一、score可重复 操作zadd、zrange、zrem**************
+ ********************************************************************************
+ */
+ //zAdd := client.ZAdd("ll", redis.Z{Member: "潘丽萍", Score: 60}, redis.Z{Member: "周小林", Score: 80})
+ //log.Printf("opteration:%v result:%v", zAdd.String(), zAdd.Err())
+ //zRange := client.ZRange("ll", 50, 70)
+ //log.Printf("opteration:%v result:%v", zRange.String(), zRange.Err())
+ //zRem := client.ZRem("ll", "周小林")
+ //log.Printf("opteration:%v result:%v", zRem.String(), zRem.Err())
+ /*********************************************************************************
+ **********************hyperloglogs 基数统计 操作 pfadd、pfcount、pfmerge*********************************
+ *********************************************************************************
+ */
+ //pfAdd := client.PFAdd("cv", "asdfasd", "fsdfs", "asfasdfwe")
+ //client.PFAdd("key", "asdas", "ada", 8, "dasda")
+ //log.Printf("opteration:%v result:%v", pfAdd.String(), pfAdd.Val())
+ //pfCount := client.PFCount("cv")
+ //log.Printf("opteration:%v result:%v", pfCount.String(), pfCount.Val())
+ //pfMerge := client.PFMerge("k3", "cv", "key")
+ //log.Printf("opteration:%v result:%v", pfMerge.String(), pfMerge.Val())
+ /***************************************************************************
+ ************Bitmap位图 打卡、未打卡、登录、未登录 操作 setbit、getbit******
+ *****************************************************************************
+ */
+ //setBit := client.SetBit("sign", 0, 1)
+ //log.Printf("opteration:%v result:%v", setBit.String(), setBit.Val())
+ //getBit := client.GetBit("sign", 0)
+ //log.Printf("opteration:%v result:%v", getBit.String(), getBit.Val())
+ //getBit = client.GetBit("sign", 1)
+ //log.Printf("opteration:%v result:%v", getBit.String(), getBit.Err())
+ /********************************************************************************
+ **********************geospatial 地理位置 geoadd(添加)、geopos(获取)、************
+ ************geodist(如果不存在,返回空)、georadius(附近的人)、georadiusbymember******
+ *************(显示指定成员一定半径其他成员)、geohash(返回11个字符的hash字符串)**********
+ *********************************************************************************
+ */
+ //geoAdd := client.GeoAdd("china:beijing" )
+ //log.Printf("opteration:%v result:%v", geoAdd.String(), geoAdd.Val())
+ //geoDist := client.GeoDist()
+ //log.Printf("opteration:%v result:%v", geoDist.String(), geoDist.Val())
+ //geoPos := client.GeoPos()
+ //log.Printf("opteration:%v result:%v", geoPos.String(), geoPos.Val())
+ //geoRadius := client.GeoRadius()
+ //log.Printf("opteration:%v result:%v", geoRadius.String(), geoRadius.Val())
+ //geoRadiusByMember := client.GeoRadiusByMember()
+ //log.Printf("opteration:%v result:%v", geoRadiusByMember.String(), geoRadiusByMember.Val())
+ //geoHash := client.GeoHash()
+ //log.Printf("opteration:%v result:%v", geoHash.String(), geoHash.Val())
+ /**********************************************************************************
+ **********stream stream 操作 xadd、xtrim、xdel、xlen、xrange、xrevrange、xread*******
+ *********************************************************************************
+ */
+ ////*******错误示例**************/////////
+ //xAdd := client.XAdd(&redis.XAddArgs{
+ // Stream: "ll",
+ // Values: map[string]interface{}{"name": "潘丽萍", "age": "23", "gender": "0"},
+ //})
+ //log.Printf("opteration:%v result:%v", xAdd.String(), xAdd.Val())
+ //xTrim := client.XTrim("ll", 64)
+ //log.Printf("opteration:%v result:%v", xTrim.String(), xTrim.Val())
+ //xDel := client.XDel("ll", "gender")
+ //log.Printf("opteration:%v result:%v", xDel.String(), xDel.Val())
+ //xLen := client.XLen("ll")
+ //log.Printf("opteration:%v result:%v", xLen.String(), xLen.Val())
+ //xRange := client.XRange("ll", "-", "+")
+ //log.Printf("opteration:%v result:%v", xRange.String(), xRange.Val())
+ //revRange := client.XRevRange("ll", "-", "+")
+ //log.Printf("opteration:%v result:%v", revRange.String(), revRange.Val())
+ //xRead := client.XRead(&redis.XReadArgs{
+ // Count: 2,
+ // Streams: []string{"ll"},
+ //})
+ //log.Printf("opteration:%v result:%v", xRead.String(), xRead.Val())
+ /*******************************************************************************
+ ********************** publish/subscribe 操作 publish、subscribe、psubscribe、punsubscribe
+
+ */
+ //ch := make(chan os.Signal)
+ //signal.Notify(ch, os.Interrupt, os.Kill)
+ //go func() {
+ // for i := 0; i < 100; i++ {
+ // publish1 := client.Publish("kl.gh.vb", "hi"+strconv.Itoa(i))
+ // publish2 := client.Publish("kl.gh.vc", "hello"+strconv.Itoa(i))
+ // time.Sleep(time.Second)
+ // r1, _ := publish1.Result()
+ // r2, _ := publish2.Result()
+ //
+ // log.Printf("opteration:%v result:%v result:%v", publish1.String(), publish1.Val(), r1)
+ // log.Printf("opteration:%v result:%v result:%v", publish2.String(), publish1.Val(), r2)
+ //
+ // }
+ //}()
+
+ //go func() {
+ // subscribe := client.Subscribe("kl.gh.vb")
+ // defer subscribe.Close()
+ // //receive, _ := subscribe.Receive()
+ // ch := subscribe.Channel()
+ // for {
+ // c := <-ch
+ // fmt.Println("|", c, "|", c.Payload)
+ // //fmt.Println(receive)
+ // }
+ //
+ //}()
+ //go func() {
+ // subscribe := client.PSubscribe("kl.gh.v?")
+ // cha := subscribe.Channel()
+ // for i := 0; i < 10000; i++ {
+ // msg := <-cha
+ // fmt.Println(msg, "|", msg.Payload)
+ // if i > 5 {
+ // _ = subscribe.Unsubscribe("kl.gh.vb")
+ // }
+ // }
+ //
+ //}()
+ //<-ch
+ //log.Printf("opteration:%v value:%v ", subscribe.String(),)
+ /**************************************************************************
+ ********************事务 操作 multi、exec、discard、watch、unwatch********************
+ *************************************************************************
+ */
+ //ch := make(chan struct{})
+ //go func() {
+ // ch <- struct{}{}
+ // _ = client.Watch(func(tx *redis.Tx) error {
+ // log.Printf("bulabula changed")
+ // return nil
+ // })
+ //}()
+ //<-ch
+ //// 开启事务
+ //pipe := client.TxPipeline()
+ //set := pipe.Set("bulabula", "sdafsqfaf", time.Second*5)
+ //log.Printf(" opterator:%v result:%v ", set.String(), set.Val())
+ //
+ //pipe.Set("sa", "sdadsad", time.Second)
+ //// 结束事务
+ //_ = pipe.Discard()
+ ////提交事务
+ //exec, _ := pipe.Exec()
+ //log.Printf("%v", exec)
+
+}
+func main() {
+ client, err := initRedis()
+ if err != nil {
+ fmt.Println("init redis failed")
+ return
+ }
+ test(client)
+
+ defer client.Close()
+}
diff --git "a/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\345\257\271\350\261\241/struct1/main.go" "b/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\345\257\271\350\261\241/struct1/main.go"
deleted file mode 100644
index 0243dd0..0000000
--- "a/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\345\257\271\350\261\241/struct1/main.go"
+++ /dev/null
@@ -1,25 +0,0 @@
-package main
-
-import (
- "fmt"
- "time"
-)
-
-var ch chan string
-
-func test() {
- select {
- case a := <-ch:
- fmt.Println(a)
- case <-time.After(time.Second * 3):
- fmt.Println("time over!")
-
- }
-}
-func main() {
- fmt.Println("start game!")
- go test()
- ch <- "潘丽萍! 我有点想念你"
- time.Sleep(time.Second * 4)
-
-}
diff --git "a/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\345\257\271\350\261\241/struct2/main.go" "b/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\345\257\271\350\261\241/struct2/main.go"
deleted file mode 100644
index 4ca5511..0000000
--- "a/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\345\257\271\350\261\241/struct2/main.go"
+++ /dev/null
@@ -1,41 +0,0 @@
-package main
-
-import (
- "fmt"
- "runtime"
-)
-
-//崩溃时传递上下文信息
-type printContext struct {
- str string
-}
-
-//保护方式允许一个函数
-
-func protectFunc(ent func()) {
- //延迟处理
- defer func() {
- err := recover()
- switch err.(type) {
- case runtime.Error:
- fmt.Println("运行时错误")
- default:
- fmt.Println("其他错误")
- }
- }()
- ent()
-}
-
-func main() {
- fmt.Println("运行之前!")
- protectFunc(func() {
- fmt.Println("手动宕机之前")
- panic(&printContext{"手动触发宕机"})
- fmt.Println("手动宕机之后")
- })
- fmt.Println("被动宕机之前")
- var p *int
- *p = 9
- fmt.Println("被动宕机之后")
- fmt.Println("运行之后")
-}
diff --git "a/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\350\277\207\347\250\213/main.go" "b/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\350\277\207\347\250\213/main.go"
deleted file mode 100644
index 06ab7d0..0000000
--- "a/face_object/\345\256\266\345\272\255\346\224\266\346\224\257\350\275\257\344\273\266/\351\235\242\345\220\221\350\277\207\347\250\213/main.go"
+++ /dev/null
@@ -1 +0,0 @@
-package main
diff --git a/gintest/test.go b/gintest/test.go
new file mode 100644
index 0000000..45b8d7a
--- /dev/null
+++ b/gintest/test.go
@@ -0,0 +1,7 @@
+package main
+
+import "github.com/gin-gonic/gin"
+
+func main() {
+ gin.Default()
+}
diff --git a/go_basic/day29/controller/admin.go b/go_basic/day29/controller/admin.go
new file mode 100644
index 0000000..6739cde
--- /dev/null
+++ b/go_basic/day29/controller/admin.go
@@ -0,0 +1,82 @@
+package controller
+
+import (
+ "net/http"
+ path2 "path"
+
+ "github.com/gin-gonic/gin"
+)
+
+type Admin struct {
+ Base
+}
+
+// 上传单个文件
+func (receiver Admin) UplodaSingleFile(c *gin.Context) {
+ value := c.PostForm("username")
+ email := c.PostForm("email")
+ file, err := c.FormFile("profile")
+ if err != nil {
+ receiver.UploadFailed(c)
+ }
+ path := path2.Join("./static/uploadfile", file.Filename)
+ err = c.SaveUploadedFile(file, path)
+ if err != nil {
+ receiver.UploadFailed(c)
+ }
+ c.JSON(http.StatusOK, gin.H{
+ "username": value,
+ "email": email,
+ "filepath": path,
+ })
+}
+
+// 获取多个名称相同的文件
+func (receiver Admin) UploadMultiFileSameName(c *gin.Context) {
+ value := c.PostForm("username")
+ email := c.PostForm("email")
+
+ //获取相同名称的多个文件
+ form, err := c.MultipartForm()
+ if err != nil {
+ receiver.UploadFailed(c)
+ }
+ files := form.File["profile[]"]
+ var arr = make([]string, 0)
+ for _, v := range files {
+ path := path2.Join("./static/uploadfile", v.Filename)
+ err := c.SaveUploadedFile(v, path)
+ if err != nil {
+ receiver.UploadFailed(c)
+ }
+ arr = append(arr, path)
+ }
+ c.JSON(http.StatusOK, gin.H{
+ "username": value,
+ "email": email,
+ "same_name_files": arr,
+ })
+
+}
+
+// 获取多个名称不同的文件
+func (receive Admin) UploadMultiFileDifferentName(c *gin.Context) {
+ value := c.PostForm("username")
+ email := c.PostForm("email")
+ file1, err := c.FormFile("profile1")
+ if err != nil {
+ receive.UploadFailed(c)
+ }
+ file2, err := c.FormFile("profile2")
+ if err != nil {
+ receive.UploadFailed(c)
+ }
+ path0 := path2.Join("./static/uploadfile", file1.Filename)
+ path1 := path2.Join("./static/uploadfile", file2.Filename)
+ arr := []string{path0, path1}
+ c.JSON(http.StatusOK, gin.H{
+ "username": value,
+ "email": email,
+ "different_name_files": arr,
+ })
+}
diff --git a/go_basic/day29/controller/base.go b/go_basic/day29/controller/base.go
new file mode 100644
index 0000000..00dbabb
--- /dev/null
+++ b/go_basic/day29/controller/base.go
@@ -0,0 +1,20 @@
+package controller
+
+import (
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+type Base struct {
+}
+
+func (b Base) UploadSuccessed(c *gin.Context) {
+ c.String(http.StatusOK, "图片上传成功!")
+
+}
+
+func (b Base) UploadFailed(c *gin.Context) {
+ c.String(http.StatusOK, "图片上传失败!")
+
+}
diff --git a/go_basic/day29/main.go b/go_basic/day29/main.go
new file mode 100644
index 0000000..b6b6448
--- /dev/null
+++ b/go_basic/day29/main.go
@@ -0,0 +1,7 @@
+package main
+
+import "go_basic/day29/router"
+
+func main() {
+ router.Init()
+}
diff --git a/go_basic/day29/router/index.go b/go_basic/day29/router/index.go
new file mode 100644
index 0000000..5338d74
--- /dev/null
+++ b/go_basic/day29/router/index.go
@@ -0,0 +1,28 @@
+package router
+
+import (
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+func Init() {
+ engine := gin.Default()
+ engine.Static("./static", "./static")
+
+ //加载模板文件
+ engine.LoadHTMLGlob("./templates/*")
+ // 展示单文件上传
+ v1api(engine)
+
+ // 展示多文件同名上传
+ v2api(engine)
+
+ //展示多文件不同名上传
+ v3api(engine)
+
+ engine.GET("/", func(c *gin.Context) {
+ c.HTML(http.StatusOK, "index.html", nil)
+ })
+ engine.Run(":8000")
+}
diff --git a/go_basic/day29/router/v1api.go b/go_basic/day29/router/v1api.go
new file mode 100644
index 0000000..4fb6cd1
--- /dev/null
+++ b/go_basic/day29/router/v1api.go
@@ -0,0 +1,16 @@
+package router
+
+import (
+ "go_basic/day29/controller"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+func v1api(e *gin.Engine) {
+ r := e.Group("/v1")
+ r.GET("/uploadsinglefile", func(c *gin.Context) {
+ c.HTML(http.StatusOK, "uploadSingleFile.html", nil)
+ })
+ r.POST("/uploadsinglefile", controller.Admin{}.UplodaSingleFile)
+}
diff --git a/go_basic/day29/router/v2api.go b/go_basic/day29/router/v2api.go
new file mode 100644
index 0000000..21fdce4
--- /dev/null
+++ b/go_basic/day29/router/v2api.go
@@ -0,0 +1,16 @@
+package router
+
+import (
+ "go_basic/day29/controller"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+func v3api(e *gin.Engine) {
+ r := e.Group("/v2")
+ r.GET("/uploadmultifilessamename", func(c *gin.Context) {
+ c.HTML(http.StatusOK, "uploadMultiFilesSameName.html", nil)
+ })
+ r.POST("/uploadmultifilessamename", controller.Admin{}.UploadMultiFileSameName)
+}
diff --git a/go_basic/day29/router/v3api.go b/go_basic/day29/router/v3api.go
new file mode 100644
index 0000000..6426cee
--- /dev/null
+++ b/go_basic/day29/router/v3api.go
@@ -0,0 +1,16 @@
+package router
+
+import (
+ "go_basic/day29/controller"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+func v2api(e *gin.Engine) {
+ r := e.Group("/v3")
+ r.GET("/uploadmultifilesdifferentname", func(c *gin.Context) {
+ c.HTML(http.StatusOK, "uploadMultiFilesDifferentName.html", nil)
+ })
+ r.POST("/uploadmultifilesdifferentname", controller.Admin{}.UploadMultiFileDifferentName)
+}
diff --git "a/go_basic/day29/static/uploadfile/vivo\345\271\263\346\235\2771.jpg" "b/go_basic/day29/static/uploadfile/vivo\345\271\263\346\235\2771.jpg"
new file mode 100644
index 0000000..5f56def
Binary files /dev/null and "b/go_basic/day29/static/uploadfile/vivo\345\271\263\346\235\2771.jpg" differ
diff --git "a/go_basic/day29/static/uploadfile/\345\215\216\344\270\272.jpg" "b/go_basic/day29/static/uploadfile/\345\215\216\344\270\272.jpg"
new file mode 100644
index 0000000..b15d557
Binary files /dev/null and "b/go_basic/day29/static/uploadfile/\345\215\216\344\270\272.jpg" differ
diff --git "a/go_basic/day29/static/uploadfile/\345\215\216\344\270\272\345\271\263\346\235\2771.jpg" "b/go_basic/day29/static/uploadfile/\345\215\216\344\270\272\345\271\263\346\235\2771.jpg"
new file mode 100644
index 0000000..296d067
Binary files /dev/null and "b/go_basic/day29/static/uploadfile/\345\215\216\344\270\272\345\271\263\346\235\2771.jpg" differ
diff --git "a/go_basic/day29/static/uploadfile/\346\237\257\345\215\227.jpg" "b/go_basic/day29/static/uploadfile/\346\237\257\345\215\227.jpg"
new file mode 100644
index 0000000..120f9c6
Binary files /dev/null and "b/go_basic/day29/static/uploadfile/\346\237\257\345\215\227.jpg" differ
diff --git "a/go_basic/day29/static/uploadfile/\350\213\271\346\236\2343.jpg" "b/go_basic/day29/static/uploadfile/\350\213\271\346\236\2343.jpg"
new file mode 100644
index 0000000..8fdc740
Binary files /dev/null and "b/go_basic/day29/static/uploadfile/\350\213\271\346\236\2343.jpg" differ
diff --git "a/go_basic/day29/static/uploadfile/\351\235\222\350\213\271\346\236\234.jpg" "b/go_basic/day29/static/uploadfile/\351\235\222\350\213\271\346\236\234.jpg"
new file mode 100644
index 0000000..1c7c86c
Binary files /dev/null and "b/go_basic/day29/static/uploadfile/\351\235\222\350\213\271\346\236\234.jpg" differ
diff --git a/go_basic/day29/templates/index.html b/go_basic/day29/templates/index.html
new file mode 100644
index 0000000..edae9a4
--- /dev/null
+++ b/go_basic/day29/templates/index.html
@@ -0,0 +1,21 @@
+{{define "index.html"}}
+
+
+
+
+ 首页
+
+
+首页
+
+
+上传单个文件
+
+上传多个相同名称的文件
+
+上传多个不同名称的文件
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/go_basic/day29/templates/uploadMultiFilesSameName.html b/go_basic/day29/templates/uploadMultiFilesSameName.html
new file mode 100644
index 0000000..84dcfbd
--- /dev/null
+++ b/go_basic/day29/templates/uploadMultiFilesSameName.html
@@ -0,0 +1,25 @@
+{{define "uploadMultiFilesSameName.html"}}
+
+
+
+
+ 上传多个相同名称的文件
+
+
+上传多个相同名称的文件
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/go_basic/day29/templates/uploadMultiFilesdifferentName.html b/go_basic/day29/templates/uploadMultiFilesdifferentName.html
new file mode 100644
index 0000000..ac2153a
--- /dev/null
+++ b/go_basic/day29/templates/uploadMultiFilesdifferentName.html
@@ -0,0 +1,26 @@
+{{define "uploadMultiFilesDifferentName.html"}}
+
+
+
+
+ 上传多个不同名称的文件
+
+
+上传多个不同名称的文件
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/go_basic/day29/templates/uploadSingleFile.html b/go_basic/day29/templates/uploadSingleFile.html
new file mode 100644
index 0000000..62ffc1d
--- /dev/null
+++ b/go_basic/day29/templates/uploadSingleFile.html
@@ -0,0 +1,24 @@
+{{define "uploadSingleFile.html"}}
+
+
+
+
+ 上传单个文件
+
+
+上传单个文件
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/go_basic/day30/main.go b/go_basic/day30/main.go
new file mode 100644
index 0000000..bceb268
--- /dev/null
+++ b/go_basic/day30/main.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "go_basic/day30/utils"
+ "net/http"
+ "os"
+ "path"
+
+ "github.com/gin-gonic/gin"
+)
+
+var ma = map[string]bool{
+ ".jpg": true,
+ ".png": true,
+ ".gif": true,
+ ".jpeg": true,
+}
+
+func main() {
+ engine := gin.Default()
+ engine.Static("/static", "./static")
+ engine.LoadHTMLGlob("./templates/*")
+ engine.GET("/", func(context *gin.Context) {
+ context.HTML(http.StatusOK, "index.html", nil)
+ })
+ engine.POST("/post", func(c *gin.Context) {
+ value := c.PostForm("username")
+ file, err := c.FormFile("profile")
+ if err != nil {
+ c.String(http.StatusOK, "文件上传失败!")
+ }
+ // 获取文件上传那一刻的秒
+ formatSeconds := utils.GetDay()
+ ext := path.Ext(file.Filename)
+ if _, ok := ma[ext]; !ok {
+ c.String(http.StatusOK, "文件格式不合法!")
+ }
+ // 构建一个文件存储路径
+ filedir := path.Join("./static/upload/", formatSeconds)
+ err = os.MkdirAll(filedir, 0666)
+ if err != nil {
+ c.String(http.StatusOK, "创建文件夹失败!")
+ }
+ // 创建文件保存路径
+ filepath := path.Join(filedir, utils.GetUnix()+ext)
+ c.SaveUploadedFile(file, filepath)
+ c.JSON(http.StatusOK, gin.H{
+ "name": value,
+ "profile": filepath,
+ })
+
+ })
+ engine.Run(":8000")
+
+}
diff --git a/go_basic/day30/static/upload/14086-08-14/1691992635.jpg b/go_basic/day30/static/upload/14086-08-14/1691992635.jpg
new file mode 100644
index 0000000..19d6651
Binary files /dev/null and b/go_basic/day30/static/upload/14086-08-14/1691992635.jpg differ
diff --git a/go_basic/day30/static/upload/2023-08-14/1691992682.jpg b/go_basic/day30/static/upload/2023-08-14/1691992682.jpg
new file mode 100644
index 0000000..9828af7
Binary files /dev/null and b/go_basic/day30/static/upload/2023-08-14/1691992682.jpg differ
diff --git a/go_basic/day30/static/upload/2023-08-14/1691992695.jpg b/go_basic/day30/static/upload/2023-08-14/1691992695.jpg
new file mode 100644
index 0000000..296d067
Binary files /dev/null and b/go_basic/day30/static/upload/2023-08-14/1691992695.jpg differ
diff --git a/go_basic/day30/templates/index.html b/go_basic/day30/templates/index.html
new file mode 100644
index 0000000..63c263b
--- /dev/null
+++ b/go_basic/day30/templates/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+ 首页
+
+
+
+
+
+
\ No newline at end of file
diff --git a/go_basic/day30/utils/utils.go b/go_basic/day30/utils/utils.go
new file mode 100644
index 0000000..c7e400e
--- /dev/null
+++ b/go_basic/day30/utils/utils.go
@@ -0,0 +1,15 @@
+package utils
+
+import (
+ "strconv"
+ "time"
+)
+
+func GetUnix() string {
+ now := time.Now().Unix()
+ return strconv.FormatInt(now, 10)
+}
+func GetDay() string {
+ now := time.Now()
+ return now.Format("2006-01-02")
+}
diff --git a/go_basic/day31/main.go b/go_basic/day31/main.go
new file mode 100644
index 0000000..8f7b8e4
--- /dev/null
+++ b/go_basic/day31/main.go
@@ -0,0 +1,89 @@
+package main
+
+import (
+ "net/http"
+
+ "github.com/gin-contrib/sessions/redis"
+
+ "github.com/gin-contrib/sessions"
+
+ "github.com/gin-contrib/sessions/cookie"
+
+ "github.com/gin-gonic/gin"
+)
+
+func main() {
+ engine := gin.Default()
+ //设置cookie
+ engine.GET("/", func(c *gin.Context) {
+ c.SetCookie("email", "884639894", 3600, "/", "localhost", false, true)
+ c.String(http.StatusOK, "设置cookie")
+ })
+ // 获取cookie
+ engine.GET("/cookie", func(c *gin.Context) {
+ email, err := c.Cookie("email")
+ if err != nil {
+ c.String(http.StatusOK, "获取cookie失败!")
+
+ }
+ c.String(http.StatusOK, "cookie="+email)
+ })
+ // 删除cookie 把cookie值置为空 或者把过期时间置为-1
+ engine.GET("/delete", func(c *gin.Context) {
+ c.SetCookie("email", "", -1, "/", "localhost", true, true)
+ cookie, _ := c.Cookie("email")
+ c.String(http.StatusOK, "cookie="+cookie)
+ })
+ // 设置二级域名共享cookie a.sncot.top b.sncot.top 注意路径设置为 /
+ engine.GET("/delay", func(c *gin.Context) {
+ c.SetCookie("hobby", "设置过期时间", 4, "/", ".sncot.top", false, true)
+ c.String(http.StatusOK, "二级域名共享cookie")
+ })
+
+ /*
+ session
+ gin框架本身并没有集成session 可以使用第三方插件使用
+ github.com/gin-contrib/sessions
+
+ */
+
+ // 配置session中间件
+
+ // 创建基于cookie的存储引擎,secret适用于加密的密钥
+ {
+ store := cookie.NewStore([]byte("secret"))
+ // 配置session的中间件
+ engine.Use(sessions.Sessions("mySession", store))
+ engine.GET("/session", func(c *gin.Context) {
+ // 设置session
+ session := sessions.Default(c)
+ session.Set("email", "我是第一个session")
+ session.Save() //设置session时必须调用
+
+ get := session.Get("email")
+ s := get.(string)
+ c.String(http.StatusOK, "设置了一个session|"+s)
+ })
+ }
+
+ // 创建基于redis的session的存储方式
+ {
+ //创建基于redis的存储引擎‘
+ store, _ := redis.NewStore(10, "tcp", "47.92.232.226:6379", "950629", []byte("sceret"))
+ engine.Use(sessions.Sessions("mySession", store))
+ engine.GET("/redis", func(c *gin.Context) {
+ session := sessions.Default(c)
+ //设置session的过期时间
+ session.Options(sessions.Options{MaxAge: 3600 * 6}) //6hour
+ session.Set("redis", "我是第一个redis存储的session")
+ session.Save()
+ get := session.Get("redis")
+ s := get.(string)
+ c.String(http.StatusOK, "redis存储的第一个session值+"+s)
+
+ })
+ }
+
+ engine.Run(":80")
+
+}
diff --git a/go_basic/day32/go.mod b/go_basic/day32/go.mod
new file mode 100644
index 0000000..34f9b51
--- /dev/null
+++ b/go_basic/day32/go.mod
@@ -0,0 +1,3 @@
+module day32
+
+go 1.18
diff --git a/go_basic/day32/main.go b/go_basic/day32/main.go
new file mode 100644
index 0000000..baa5fe8
--- /dev/null
+++ b/go_basic/day32/main.go
@@ -0,0 +1,43 @@
+package main
+
+import (
+ "fmt"
+ "net"
+ "net/rpc"
+ "net/rpc/jsonrpc"
+)
+
+type Stu struct {
+}
+
+func (s Stu) SayHi(para string, para2 *string) error {
+ *para2 = "hello!" + para
+ return nil
+
+}
+func main() {
+ err := rpc.RegisterName("stu", new(Stu))
+ if err != nil {
+ fmt.Println("unknown reason!")
+ return
+ }
+ listen, err := net.Listen("tcp", "127.0.0.1:8000")
+
+ if err != nil {
+ fmt.Println("net listening failed!")
+ return
+ }
+ defer listen.Close()
+ for {
+ accept, err := listen.Accept()
+ if err != nil {
+ fmt.Println("create connection failed!")
+ continue
+ }
+ // go的rpc默认使用gob编码格式 此编码格式是go独有的
+ //go rpc.ServeConn(accept)
+
+ // 使用jsonrpc格式编码代替gob编码格式 jsonrpc编码格式不支持http协议
+ go rpc.ServeCodec(jsonrpc.NewServerCodec(accept))
+ }
+}
diff --git a/go_basic/day33/go.mod b/go_basic/day33/go.mod
new file mode 100644
index 0000000..f346e19
--- /dev/null
+++ b/go_basic/day33/go.mod
@@ -0,0 +1,3 @@
+module day33
+
+go 1.18
diff --git a/go_basic/day33/main.go b/go_basic/day33/main.go
new file mode 100644
index 0000000..b1abd23
--- /dev/null
+++ b/go_basic/day33/main.go
@@ -0,0 +1,50 @@
+package main
+
+import (
+ "fmt"
+ "net"
+ "net/rpc"
+ "net/rpc/jsonrpc"
+)
+
+func main() {
+ // 使用go rpc默认的gob编码格式进行交互
+ //{
+ //
+ // dial, err := rpc.Dial("tcp", "127.0.0.1:8000")
+ //
+ // if err != nil {
+ // fmt.Println("connect to 127.0.0.1:8000 failed!")
+ // return
+ // }
+ // var str string
+ // start := time.Now().Unix()
+ // err = dial.Call("stu.SayHi", "潘丽萍", &str)
+ // if err != nil {
+ // fmt.Println("rpc failed!")
+ // return
+ // }
+ // end := time.Now().Unix()
+ // fmt.Println(end - start)
+ // fmt.Println(str)
+ //}
+
+ //使用jsonrpc编码格式进行交互
+ {
+ dial, err := net.Dial("tcp", "47.92.232.226:8000")
+ if err != nil {
+ fmt.Println("connect failed!")
+ return
+ }
+ // 使用json进行编码解码
+ client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(dial))
+ var str string
+ err = client.Call("stu.SayHi", "潘丽萍", &str)
+ if err != nil {
+ fmt.Println("RPC failed!")
+ return
+ }
+ fmt.Println(str)
+ }
+ //dial.Go("stu.SayHi", "周小林", &str, done)
+}
diff --git a/go_basic/day34/README.md b/go_basic/day34/README.md
new file mode 100644
index 0000000..ad07965
--- /dev/null
+++ b/go_basic/day34/README.md
@@ -0,0 +1,11 @@
+### proto
+##### 编译一般proto文件
+指令
+`protoc --go_out=./ *.proto`
+./ 表示在当前目录下 *.proto表示所有的以proto为后缀的文件
+
+
+##### 编译rpc服务
+**注意:**生成的是接口
+指令
+`protoc --go-grpc_out=./ *.proto`
\ No newline at end of file
diff --git a/go_basic/day34/proto/GoodsService/service_grpc.pb.go b/go_basic/day34/proto/GoodsService/service_grpc.pb.go
new file mode 100644
index 0000000..ab8ddd5
--- /dev/null
+++ b/go_basic/day34/proto/GoodsService/service_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.24.0--rc1
+// source: service.proto
+
+package GoodsService
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ GoodsService_AddGoods_FullMethodName = "/GoodsService/AddGoods"
+)
+
+// GoodsServiceClient is the client API for GoodsService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type GoodsServiceClient interface {
+ AddGoods(ctx context.Context, in *AddGoodsReq, opts ...grpc.CallOption) (*AddGoodsRes, error)
+}
+
+type goodsServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewGoodsServiceClient(cc grpc.ClientConnInterface) GoodsServiceClient {
+ return &goodsServiceClient{cc}
+}
+
+func (c *goodsServiceClient) AddGoods(ctx context.Context, in *AddGoodsReq, opts ...grpc.CallOption) (*AddGoodsRes, error) {
+ out := new(AddGoodsRes)
+ err := c.cc.Invoke(ctx, GoodsService_AddGoods_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// GoodsServiceServer is the server API for GoodsService service.
+// All implementations must embed UnimplementedGoodsServiceServer
+// for forward compatibility
+type GoodsServiceServer interface {
+ AddGoods(context.Context, *AddGoodsReq) (*AddGoodsRes, error)
+ mustEmbedUnimplementedGoodsServiceServer()
+}
+
+// UnimplementedGoodsServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedGoodsServiceServer struct {
+}
+
+func (UnimplementedGoodsServiceServer) AddGoods(context.Context, *AddGoodsReq) (*AddGoodsRes, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method AddGoods not implemented")
+}
+func (UnimplementedGoodsServiceServer) mustEmbedUnimplementedGoodsServiceServer() {}
+
+// UnsafeGoodsServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to GoodsServiceServer will
+// result in compilation errors.
+type UnsafeGoodsServiceServer interface {
+ mustEmbedUnimplementedGoodsServiceServer()
+}
+
+func RegisterGoodsServiceServer(s grpc.ServiceRegistrar, srv GoodsServiceServer) {
+ s.RegisterService(&GoodsService_ServiceDesc, srv)
+}
+
+func _GoodsService_AddGoods_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(AddGoodsReq)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(GoodsServiceServer).AddGoods(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: GoodsService_AddGoods_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(GoodsServiceServer).AddGoods(ctx, req.(*AddGoodsReq))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// GoodsService_ServiceDesc is the grpc.ServiceDesc for GoodsService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var GoodsService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "GoodsService",
+ HandlerType: (*GoodsServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "AddGoods",
+ Handler: _GoodsService_AddGoods_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "service.proto",
+}
diff --git a/go_basic/day34/proto/order.proto b/go_basic/day34/proto/order.proto
new file mode 100644
index 0000000..77d7350
--- /dev/null
+++ b/go_basic/day34/proto/order.proto
@@ -0,0 +1,24 @@
+syntax="proto3";
+option go_package="./order;order";
+message order{
+ int64 id = 1;
+ double price = 2;
+ string name = 3;
+ string tel = 4;
+ string address = 5;
+ string time = 6;
+
+ OrderItem orderItem = 7;
+ phoneType p = 8;
+}
+message OrderItem{
+ int64 goodsId = 1;
+ string title = 2;
+ double price = 3;
+ int32 num = 4;
+}
+enum phoneType{
+ mobile = 0;
+ home = 1;
+ worker = 2;
+}
\ No newline at end of file
diff --git a/go_basic/day34/proto/order/order.pb.go b/go_basic/day34/proto/order/order.pb.go
new file mode 100644
index 0000000..50c2980
--- /dev/null
+++ b/go_basic/day34/proto/order/order.pb.go
@@ -0,0 +1,355 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.31.0
+// protoc v4.24.0--rc1
+// source: order.proto
+
+package order
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type PhoneType int32
+
+const (
+ PhoneType_mobile PhoneType = 0
+ PhoneType_home PhoneType = 1
+ PhoneType_worker PhoneType = 2
+)
+
+// Enum value maps for PhoneType.
+var (
+ PhoneType_name = map[int32]string{
+ 0: "mobile",
+ 1: "home",
+ 2: "worker",
+ }
+ PhoneType_value = map[string]int32{
+ "mobile": 0,
+ "home": 1,
+ "worker": 2,
+ }
+)
+
+func (x PhoneType) Enum() *PhoneType {
+ p := new(PhoneType)
+ *p = x
+ return p
+}
+
+func (x PhoneType) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (PhoneType) Descriptor() protoreflect.EnumDescriptor {
+ return file_order_proto_enumTypes[0].Descriptor()
+}
+
+func (PhoneType) Type() protoreflect.EnumType {
+ return &file_order_proto_enumTypes[0]
+}
+
+func (x PhoneType) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use PhoneType.Descriptor instead.
+func (PhoneType) EnumDescriptor() ([]byte, []int) {
+ return file_order_proto_rawDescGZIP(), []int{0}
+}
+
+type Order struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+ Price float64 `protobuf:"fixed64,2,opt,name=price,proto3" json:"price,omitempty"`
+ Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+ Tel string `protobuf:"bytes,4,opt,name=tel,proto3" json:"tel,omitempty"`
+ Address string `protobuf:"bytes,5,opt,name=address,proto3" json:"address,omitempty"`
+ Time string `protobuf:"bytes,6,opt,name=time,proto3" json:"time,omitempty"`
+ OrderItem *OrderItem `protobuf:"bytes,7,opt,name=orderItem,proto3" json:"orderItem,omitempty"`
+ P PhoneType `protobuf:"varint,8,opt,name=p,proto3,enum=PhoneType" json:"p,omitempty"`
+}
+
+func (x *Order) Reset() {
+ *x = Order{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_order_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Order) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Order) ProtoMessage() {}
+
+func (x *Order) ProtoReflect() protoreflect.Message {
+ mi := &file_order_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Order.ProtoReflect.Descriptor instead.
+func (*Order) Descriptor() ([]byte, []int) {
+ return file_order_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Order) GetId() int64 {
+ if x != nil {
+ return x.Id
+ }
+ return 0
+}
+
+func (x *Order) GetPrice() float64 {
+ if x != nil {
+ return x.Price
+ }
+ return 0
+}
+
+func (x *Order) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *Order) GetTel() string {
+ if x != nil {
+ return x.Tel
+ }
+ return ""
+}
+
+func (x *Order) GetAddress() string {
+ if x != nil {
+ return x.Address
+ }
+ return ""
+}
+
+func (x *Order) GetTime() string {
+ if x != nil {
+ return x.Time
+ }
+ return ""
+}
+
+func (x *Order) GetOrderItem() *OrderItem {
+ if x != nil {
+ return x.OrderItem
+ }
+ return nil
+}
+
+func (x *Order) GetP() PhoneType {
+ if x != nil {
+ return x.P
+ }
+ return PhoneType_mobile
+}
+
+type OrderItem struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ GoodsId int64 `protobuf:"varint,1,opt,name=goodsId,proto3" json:"goodsId,omitempty"`
+ Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
+ Price float64 `protobuf:"fixed64,3,opt,name=price,proto3" json:"price,omitempty"`
+ Num int32 `protobuf:"varint,4,opt,name=num,proto3" json:"num,omitempty"`
+}
+
+func (x *OrderItem) Reset() {
+ *x = OrderItem{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_order_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *OrderItem) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OrderItem) ProtoMessage() {}
+
+func (x *OrderItem) ProtoReflect() protoreflect.Message {
+ mi := &file_order_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use OrderItem.ProtoReflect.Descriptor instead.
+func (*OrderItem) Descriptor() ([]byte, []int) {
+ return file_order_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *OrderItem) GetGoodsId() int64 {
+ if x != nil {
+ return x.GoodsId
+ }
+ return 0
+}
+
+func (x *OrderItem) GetTitle() string {
+ if x != nil {
+ return x.Title
+ }
+ return ""
+}
+
+func (x *OrderItem) GetPrice() float64 {
+ if x != nil {
+ return x.Price
+ }
+ return 0
+}
+
+func (x *OrderItem) GetNum() int32 {
+ if x != nil {
+ return x.Num
+ }
+ return 0
+}
+
+var File_order_proto protoreflect.FileDescriptor
+
+var file_order_proto_rawDesc = []byte{
+ 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc5, 0x01,
+ 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+ 0x74, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a,
+ 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d,
+ 0x65, 0x12, 0x28, 0x0a, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d,
+ 0x52, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x18, 0x0a, 0x01, 0x70,
+ 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x54, 0x79,
+ 0x70, 0x65, 0x52, 0x01, 0x70, 0x22, 0x63, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x74,
+ 0x65, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05,
+ 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x01, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x75, 0x6d, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6e, 0x75, 0x6d, 0x2a, 0x2d, 0x0a, 0x09, 0x70, 0x68,
+ 0x6f, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c,
+ 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x68, 0x6f, 0x6d, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a,
+ 0x06, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x10, 0x02, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x2f, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x3b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x33,
+}
+
+var (
+ file_order_proto_rawDescOnce sync.Once
+ file_order_proto_rawDescData = file_order_proto_rawDesc
+)
+
+func file_order_proto_rawDescGZIP() []byte {
+ file_order_proto_rawDescOnce.Do(func() {
+ file_order_proto_rawDescData = protoimpl.X.CompressGZIP(file_order_proto_rawDescData)
+ })
+ return file_order_proto_rawDescData
+}
+
+var file_order_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_order_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_order_proto_goTypes = []interface{}{
+ (PhoneType)(0), // 0: phoneType
+ (*Order)(nil), // 1: order
+ (*OrderItem)(nil), // 2: OrderItem
+}
+var file_order_proto_depIdxs = []int32{
+ 2, // 0: order.orderItem:type_name -> OrderItem
+ 0, // 1: order.p:type_name -> phoneType
+ 2, // [2:2] is the sub-list for method output_type
+ 2, // [2:2] is the sub-list for method input_type
+ 2, // [2:2] is the sub-list for extension type_name
+ 2, // [2:2] is the sub-list for extension extendee
+ 0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_order_proto_init() }
+func file_order_proto_init() {
+ if File_order_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_order_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Order); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_order_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*OrderItem); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_order_proto_rawDesc,
+ NumEnums: 1,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_order_proto_goTypes,
+ DependencyIndexes: file_order_proto_depIdxs,
+ EnumInfos: file_order_proto_enumTypes,
+ MessageInfos: file_order_proto_msgTypes,
+ }.Build()
+ File_order_proto = out.File
+ file_order_proto_rawDesc = nil
+ file_order_proto_goTypes = nil
+ file_order_proto_depIdxs = nil
+}
diff --git a/go_basic/day34/proto/service.proto b/go_basic/day34/proto/service.proto
new file mode 100644
index 0000000..05aec69
--- /dev/null
+++ b/go_basic/day34/proto/service.proto
@@ -0,0 +1,14 @@
+syntax="proto3";
+option go_package="./GoodsService";
+// RPC接口 定义RPC服务 生成 接口
+service GoodsService{
+ rpc AddGoods(AddGoodsReq) returns (AddGoodsRes);
+}
+message AddGoodsReq{
+ string title = 1;
+
+}
+message AddGoodsRes{
+
+ bool success = 2;
+}
\ No newline at end of file
diff --git a/go_basic/day34/proto/userinfo.proto b/go_basic/day34/proto/userinfo.proto
new file mode 100644
index 0000000..f8d5d9b
--- /dev/null
+++ b/go_basic/day34/proto/userinfo.proto
@@ -0,0 +1,7 @@
+syntax = "proto3";
+option go_package = "./userInfo;user";
+message userinfo{
+ string username = 1;
+ int32 age = 2;
+ repeated string hobby = 3;
+}
\ No newline at end of file
diff --git a/go_basic/day35/main.go b/go_basic/day35/main.go
new file mode 100644
index 0000000..3ddf810
--- /dev/null
+++ b/go_basic/day35/main.go
@@ -0,0 +1,7 @@
+package main
+
+import "google.golang.org/grpc"
+
+func main() {
+ _ := grpc.NewServer()
+}
diff --git a/go_basic/day35/proto/service.proto b/go_basic/day35/proto/service.proto
new file mode 100644
index 0000000..16355e5
--- /dev/null
+++ b/go_basic/day35/proto/service.proto
@@ -0,0 +1,12 @@
+syntax = "proto3";
+option go_package = "./service";
+service Dial{
+ rpc Add(Req) returns (Res);
+}
+
+message Req{
+ string name = 1;
+}
+message Res{
+ string reply = 1;
+}
\ No newline at end of file
diff --git a/go_basic/day36/main.go b/go_basic/day36/main.go
new file mode 100644
index 0000000..a7f6cfd
--- /dev/null
+++ b/go_basic/day36/main.go
@@ -0,0 +1,19 @@
+package main
+
+import (
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+func main() {
+ engine := gin.Default()
+ engine.GET("/898989", func(c *gin.Context) {
+ c.JSONP(http.StatusOK, gin.H{
+ "hello": "asjdakjfas",
+ "sfjs": 12,
+ })
+
+ })
+ engine.Run(":8000")
+}
diff --git a/go_basic/go.mod b/go_basic/go.mod
index c495428..8ad89bf 100644
--- a/go_basic/go.mod
+++ b/go_basic/go.mod
@@ -2,10 +2,10 @@ module go_basic
go 1.18
-
+require github.com/Shopify/sarama v1.34.1
require (
- github.com/Shopify/sarama v1.34.1
+ github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff // indirect
github.com/bwmarrin/snowflake v0.3.0 // indirect
github.com/coreos/etcd v3.3.27+incompatible // indirect
github.com/coreos/go-semver v0.3.0 // indirect
@@ -16,6 +16,7 @@ require (
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect
github.com/eapache/queue v1.1.0 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
+ github.com/gin-contrib/sessions v0.0.5 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.8.1 // indirect
github.com/go-playground/locales v0.14.0 // indirect
@@ -25,9 +26,13 @@ require (
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/goccy/go-json v0.9.8 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang/protobuf v1.5.3 // indirect
+ github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
+ github.com/gomodule/redigo v2.0.0+incompatible // indirect
github.com/google/uuid v1.3.0 // indirect
+ github.com/gorilla/context v1.1.1 // indirect
+ github.com/gorilla/securecookie v1.1.1 // indirect
+ github.com/gorilla/sessions v1.2.1 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-uuid v1.0.2 // indirect
@@ -79,8 +84,8 @@ require (
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect
- google.golang.org/grpc v1.56.2 // indirect
- google.golang.org/protobuf v1.31.0 // indirect
+ google.golang.org/grpc v1.47.0 // indirect
+ google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/fsnotify.v1 v1.4.7 // indirect
gopkg.in/ini.v1 v1.66.6 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
@@ -90,5 +95,5 @@ require (
replace (
github.com/Shopify/sarama => github.com/Shopify/sarama v1.19.0
- google.golang.org/grpc => google.golang.org/grpc v1.26.0
+
)
diff --git a/go_basic/go.sum b/go_basic/go.sum
index 7351343..b72d5d2 100644
--- a/go_basic/go.sum
+++ b/go_basic/go.sum
@@ -53,6 +53,8 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff h1:RmdPFa+slIr4SCBg4st/l/vZWVe9QJKMXGO60Bxbe04=
+github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -63,6 +65,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
@@ -91,6 +94,7 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
@@ -98,6 +102,8 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE=
+github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
@@ -161,6 +167,8 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -195,8 +203,13 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
+github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI=
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
@@ -704,8 +717,13 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8=
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
diff --git a/gormtest/go.mod b/gormtest/go.mod
new file mode 100644
index 0000000..a44d95c
--- /dev/null
+++ b/gormtest/go.mod
@@ -0,0 +1,14 @@
+module gormtest
+
+go 1.18
+
+require (
+ gorm.io/driver/mysql v1.0.4
+ gorm.io/gorm v1.20.12
+)
+
+require (
+ github.com/go-sql-driver/mysql v1.5.0 // indirect
+ github.com/jinzhu/inflection v1.0.0 // indirect
+ github.com/jinzhu/now v1.1.1 // indirect
+)
diff --git a/gormtest/go.sum b/gormtest/go.sum
new file mode 100644
index 0000000..f3606e0
--- /dev/null
+++ b/gormtest/go.sum
@@ -0,0 +1,10 @@
+github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E=
+github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+gorm.io/driver/mysql v1.0.4 h1:TATTzt+kR+IV0+h3iUB3dHUe8omCvQ0rOkmfCsUBohk=
+gorm.io/driver/mysql v1.0.4/go.mod h1:MEgp8tk2n60cSBCq5iTcPDw3ns8Gs+zOva9EUhkknTs=
+gorm.io/gorm v1.20.12 h1:ebZ5KrSHzet+sqOCVdH9mTjW91L298nX3v5lVxAzSUY=
+gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
diff --git a/gormtest/main.go b/gormtest/main.go
new file mode 100644
index 0000000..1708211
--- /dev/null
+++ b/gormtest/main.go
@@ -0,0 +1,243 @@
+package main
+
+import (
+ "database/sql"
+ "fmt"
+
+ "gorm.io/driver/mysql"
+
+ "gorm.io/gorm"
+)
+
+var (
+ DB *gorm.DB
+)
+
+type Stu struct {
+ Id int `gorm:"primaryKey"`
+ Name string
+ Age int
+}
+type Em struct {
+ Id int `gorm:"autoIncrement;primaryKey"`
+ Email string `gorm:"column:email"`
+ StuId int `gorm:"column:stu_id"`
+}
+
+func init() {
+ // 通过一个现有的连接来初始化 *grom.DB
+ dsn := "root:950629@tcp(47.92.232.226)/test?charset=utf8mb4&parseTime=True&loc=Local"
+ coon, err := sql.Open("mysql", dsn)
+ if err != nil {
+ return
+ }
+ db, err := gorm.Open(mysql.New(mysql.Config{
+ Conn: coon,
+ }), &gorm.Config{})
+ if err != nil {
+ return
+ }
+ DB = db
+ //// 创建一个连接池来维护连接
+ //sqlDB, err := DB.DB()
+ //if err != nil {
+ // return
+ //}
+ //sqlDB.SetConnMaxLifetime(time.Hour)
+ //sqlDB.SetMaxIdleConns(10)
+ //sqlDB.SetMaxOpenConns(100)
+ //sqlDB.SetConnMaxIdleTime(time.Hour * 24)
+}
+
+// SQLCreate
+// @Summary 创建数据记录
+// @Description 通过结构体数据创建数据到数据库里
+func SQLCreate() {
+ //创建单条记录
+ stu := Stu{
+ 6,
+ "潘丽萍",
+ 18,
+ }
+ tx := DB.Table("stu").Create(&stu)
+ fmt.Println("打印变动的row数:", tx)
+
+ //创建多条记录
+ stus := []*Stu{
+ &Stu{7, "周周", 19},
+ &Stu{8, "潘潘", 20},
+ }
+ rows := DB.Create(stus)
+ fmt.Println("打印影响到的row:", rows)
+
+ //根据单个map创建记录
+ DB := DB.Table("stu").Create(map[string]interface{}{
+ "id": 9,
+ "name": "樊樊",
+ "age": 19,
+ })
+
+ fmt.Println(DB)
+
+ //根据map组创建记录
+ DB.Model(&Stu{}).Create([]map[string]interface{}{
+ {"id": 10, "name": "丽丽", "age": 18},
+ {"id": 11, "name": "小丽", "age": 17},
+ {"id": 12, "name": "君君", "age": 19},
+ {"id": 13, "name": "笑话", "age": 15},
+ })
+}
+
+// SQLSelect
+// @Summary 查询数据记录
+// @Description 查询数据记录并将其存储到结构体里
+func SQLSelect() {
+
+ // @单条查询
+
+ // 实例化一个存储数据的对象
+ stu1 := Stu{}
+
+ //降序排序,查询第一个
+ DB.Table("stu").First(&stu1)
+ fmt.Println(stu1)
+
+ //不排序,查询默认的第一个
+ stu2 := Stu{}
+ DB.Table("stu").Order("age").Take(&stu2)
+ fmt.Println(stu2)
+
+ //倒序查询第一个
+ stu3 := Stu{}
+ DB.Table("stu").Last(&stu3)
+ fmt.Println(stu3)
+
+ //根据主键值查询一个对象 注意:只能根据主键值
+ stu4 := Stu{Id: 8}
+ DB.Table("stu").Find(&stu4)
+ fmt.Println(stu4)
+
+ //// 实例化一个存储对象的map
+ //result := map[string]interface{}{}
+ //DB.Model(&Stu{}).First(result) //以此类推take last
+ //
+ //// @多条记录查询
+ //stus := []*Stu{}
+ //DB.Model(&Stu{}).Limit(2).Find(stus) //同理还有 where or offset select等
+ //fmt.Println(stus)
+
+ // @多条查询
+ //根据主键值,也可不设置主键值,查询所有
+ stus := []Stu{}
+ tx := DB.Table("stu").Find(&stus, []int{7, 8, 9})
+ fmt.Println(stus, tx.RowsAffected, tx.Error)
+
+ //根据非主键值查询 string
+ stu5 := Stu{}
+ DB.Table("stu").Where("name=?", "潘潘").Find(&stu5)
+ fmt.Println(stu5)
+
+ //查询不等于 <> select * from stu where name <> "周周";
+ stu6 := []Stu{}
+ DB.Table("stu").Where("name <> ?", "周周").Find(&stu6)
+ fmt.Println(stu6)
+
+ //查询 IN select * from stu where name in ("周周","潘潘");
+ stu7 := []Stu{}
+ DB.Table("stu").Where("name in ?", []string{"潘潘", "周周"}).Find(&stu7)
+ //DB.Table("stu").Find(&stu7, "name in ?", []string{"潘潘", "周周"})
+ fmt.Println(stu7, "||||")
+
+ //查询 > < select * from stu where age >18 and name in ("周周","潘潘");
+ stu8 := []Stu{}
+ DB.Table("stu").Where("age > ? and name in ?", 18, []string{"周周", "潘潘"}).Find(&stu8)
+ //DB.Table("stu").Find(&stu8, "age >? and name in?",18,[]string{"周周", "潘潘"})
+ fmt.Println(stu8)
+
+ // between and select * from stu where age between 17 and 20
+ stu9 := Stu{}
+ DB.Table("stu").Where("age between ? and ?", 18, 19).Find(&stu9)
+ fmt.Println(stu9)
+
+ // 指定字段内容 select * from stu where name = "潘潘"; 下面三种方式等效
+ stu10 := []Stu{}
+ //DB.Table("stu").Where(&Stu{Name: "潘潘"}).Find(&stu10)
+ //DB.Table("stu").Where(map[string]interface{}{
+ // "name": "潘潘",
+ //}).Find(&stu10)
+ //DB.Table("stu").Find(&stu10, Stu{Name: "潘潘"})
+ DB.Table("stu").Find(&stu10, map[string]interface{}{
+ "name": "潘潘",
+ })
+ fmt.Println(stu10)
+
+ // not select * from stu where not name = "潘潘";
+ stu11 := []Stu{}
+ //DB.Table("stu").Not("name = ?", []string{"潘潘", "周周"}).Find(&stu11)
+ DB.Table("stu").Not(map[string]interface{}{
+ "name": []string{"潘潘", "周周"},
+ }).Find(&stu11)
+ //DB.Table("stu").Where("name <> ?",[]string{"潘潘","周周"}).Find(&stu11)
+ fmt.Println(stu11)
+
+ // limit
+ stu12 := []Stu{}
+ DB.Table("stu").Limit(1).Find(&stu12, "name = ?", "潘潘")
+ fmt.Println(stu12, 12)
+
+ //order 排序 select * from stu order by age asc;
+ stu13 := []Stu{}
+ DB.Table("stu").Order("age asc").Find(&stu13)
+ fmt.Println(stu13, 13)
+
+ // limit&offset 偏移量 select * from stu offset 4 limit 3 order by id asc;
+ stu14 := []Stu{}
+ DB.Table("stu").Order("id asc").Offset(4).Limit(3).Find(&stu14)
+ fmt.Println(stu14, 14)
+
+ // select 选择特定字段
+ stu15 := []Stu{}
+ //DB.Table("stu").Select("name", "age").Find(&stu15)
+ DB.Table("stu").Select([]string{"name", "age"}).Find(&stu15)
+ rows, err := DB.Table("stu").Select("COALESCE(age,?)", 15).Rows()
+ defer rows.Close()
+ for rows.Next() {
+
+ }
+ fmt.Println(stu15, 15, rows, err)
+
+ // group by &having 分组
+ //stu16 := []Stu{}
+ //DB.Table("stu").Group("name").Having("count(*) > ?", 1).Find(&stu16)
+ //fmt.Println(stu16, 16)
+
+ // 将结果存入一个数据库中没有表对应的变量中
+ var h int
+ DB.Table("stu").Select("sum(age) as su").Scan(&h)
+ fmt.Println(h)
+
+ // distinct 去重
+ stu17 := []Stu{}
+ DB.Table("stu").Distinct("name").Find(&stu17)
+ fmt.Println(stu17, 17)
+ // like 模糊查询
+ stu18 := []Stu{}
+ DB.Table("stu").Where("name like ?", "潘_").Find(&stu18)
+ fmt.Println(stu18, 18)
+
+}
+
+// SQLUpdate
+// @Summary 更新数据库记录
+// @Description 更新数据库记录
+func SQLUpdate() {}
+
+// SQLDelete
+// @Summary 删除数据记录
+// @Description 从数据库中删除数据库记录
+func SQLDelete() {}
+func main() {
+ //SQLCreate()
+ SQLSelect()
+ DB.Create(&Em{})
+}
diff --git a/jwt-verify/go.mod b/jwt-verify/go.mod
new file mode 100644
index 0000000..dd20898
--- /dev/null
+++ b/jwt-verify/go.mod
@@ -0,0 +1,5 @@
+module jwt-verify
+
+go 1.18
+
+require github.com/golang-jwt/jwt v3.2.2+incompatible
diff --git a/jwt-verify/go.sum b/jwt-verify/go.sum
new file mode 100644
index 0000000..efdb2a9
--- /dev/null
+++ b/jwt-verify/go.sum
@@ -0,0 +1,2 @@
+github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
+github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
diff --git a/jwt-verify/main.go b/jwt-verify/main.go
new file mode 100644
index 0000000..a28e340
--- /dev/null
+++ b/jwt-verify/main.go
@@ -0,0 +1,29 @@
+package main
+
+import (
+ "fmt"
+ "jwt-verify/token"
+ "time"
+)
+
+const (
+ id = 121923108723812741
+ email = "nuts_plp@126.com"
+ issuer = "pss"
+ secret = "密文"
+ expire = time.Hour * 3
+)
+
+func main() {
+ generateToken, err := token.GenerateToken(id, email, issuer, secret, expire)
+ if err != nil {
+ return
+ }
+ fmt.Println(generateToken)
+ ok, claim := token.ParseToken(generateToken, secret)
+ if !ok {
+ return
+ }
+ fmt.Println(claim)
+
+}
diff --git a/jwt-verify/token/token.go b/jwt-verify/token/token.go
new file mode 100644
index 0000000..547b096
--- /dev/null
+++ b/jwt-verify/token/token.go
@@ -0,0 +1,59 @@
+package token
+
+import (
+ "fmt"
+ "time"
+
+ "github.com/golang-jwt/jwt"
+)
+
+type MyClaim struct {
+ UserId int64
+ UserEmail string
+ *jwt.StandardClaims
+}
+
+// GenerateToken
+// @Summary 生成token
+// @Description 通过传入用户id 用户邮箱 token签发人 密文 token有效时间 生成token字符串和错误信息
+// @param id int64, email issuer secret string, expire time.Duration
+// @Return tokenS ,err
+func GenerateToken(id int64, email, issuer, secret string, expire time.Duration) (string, error) {
+
+ //自定义声明,把自己要签名的内容放进声明里
+ clime := MyClaim{
+ id,
+ email,
+ &jwt.StandardClaims{
+ ExpiresAt: time.Now().Add(expire).Unix(),
+ Issuer: issuer,
+ IssuedAt: time.Now().Unix(),
+ },
+ }
+ // 选择算法对声明进行加密生成token
+ token := jwt.NewWithClaims(jwt.SigningMethodHS256, clime)
+ // 对token进行签名
+ return token.SignedString([]byte(secret))
+}
+
+// ParseToken
+// @Summary 解析token
+// @Description 通过传入密文和token字符串获取用户的声明信息
+// @Param tokenS secret
+// @Return bool *MyClaim
+func ParseToken(tokenS, secret string) (bool, *MyClaim) {
+ clain := new(MyClaim)
+ // 解析token字符串 获取用户的声明信息
+ token, err := jwt.ParseWithClaims(tokenS, clain, func(token *jwt.Token) (interface{}, error) {
+ return []byte(secret), nil
+ })
+ if err != nil {
+ fmt.Println("解析失败!")
+ return false, nil
+ }
+ if !token.Valid {
+ return false, nil
+ }
+ return true, clain
+
+}
diff --git a/jwt-verify/token/token_test.go b/jwt-verify/token/token_test.go
new file mode 100644
index 0000000..c87b3c0
--- /dev/null
+++ b/jwt-verify/token/token_test.go
@@ -0,0 +1,34 @@
+package token
+
+import (
+ "reflect"
+ "testing"
+ "time"
+)
+
+const (
+ id = 121923108723812741
+ email = "nuts_plp@126.com"
+ issuer = "pss"
+ secret = "密文"
+ expire = time.Hour * 3
+)
+
+var tokenS string
+
+func TestGenerateToken(t *testing.T) {
+ _, _ = GenerateToken(int64(id), email, issuer, secret, expire)
+
+}
+func TestParseToken(t *testing.T) {
+ ok, claim := ParseToken(tokenS, secret)
+ if !ok {
+
+ }
+ if !reflect.DeepEqual(claim.UserId, id) {
+
+ }
+ if !reflect.DeepEqual(claim.UserEmail, email) {
+
+ }
+}
diff --git a/network_programme/socket_udp1/client.go b/network_programme/socket_udp1/client.go
index 6485520..3f6636b 100644
--- a/network_programme/socket_udp1/client.go
+++ b/network_programme/socket_udp1/client.go
@@ -5,7 +5,7 @@ import (
"net"
)
-func testTCP() {
+func main() {
addr, _ := net.ResolveUDPAddr("udp", "127.0.0.1:8887")
conn, _ := net.DialUDP("udp", nil, addr)
defer conn.Close()
@@ -25,7 +25,3 @@ func testTCP() {
}
}
-func main() {
- testTCP()
-
-}
diff --git a/network_rpc/buf_compile/README.md b/network_rpc/buf_compile/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/network_rpc/buf_compile/client/main.go b/network_rpc/buf_compile/client/main.go
new file mode 100644
index 0000000..2c5a1e4
--- /dev/null
+++ b/network_rpc/buf_compile/client/main.go
@@ -0,0 +1,23 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+
+ echov1 "github.com/buf_compile/proto/service/nuts/Echo/v1"
+
+ "google.golang.org/grpc/credentials/insecure"
+
+ "google.golang.org/grpc"
+)
+
+var local = flag.String("client-grpc", ":9090", "")
+
+func main() {
+ conn, _ := grpc.Dial(*local, grpc.WithTransportCredentials(insecure.NewCredentials()))
+ client := echov1.NewEchoServiceClient(conn)
+ echo, _ := client.Echo(context.Background(), &echov1.EchoServiceEchoRequest{Name: "潘丽萍"})
+ fmt.Println(echo.GetValue())
+
+}
diff --git a/network_rpc/buf_compile/go.mod b/network_rpc/buf_compile/go.mod
new file mode 100644
index 0000000..54741b7
--- /dev/null
+++ b/network_rpc/buf_compile/go.mod
@@ -0,0 +1,18 @@
+module github.com/buf_compile
+
+go 1.21
+
+require (
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1
+ google.golang.org/grpc v1.60.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ golang.org/x/net v0.17.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.14.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect
+)
diff --git a/network_rpc/buf_compile/go.sum b/network_rpc/buf_compile/go.sum
new file mode 100644
index 0000000..1bd3646
--- /dev/null
+++ b/network_rpc/buf_compile/go.sum
@@ -0,0 +1,27 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=
+google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=
+google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo=
+google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE=
+google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k=
+google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/network_rpc/buf_compile/http/main.go b/network_rpc/buf_compile/http/main.go
new file mode 100644
index 0000000..d1baf5b
--- /dev/null
+++ b/network_rpc/buf_compile/http/main.go
@@ -0,0 +1,52 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+
+ echov1 "github.com/buf_compile/proto/service/nuts/echo/v1"
+
+ "log"
+ "net/http"
+
+ "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+var local = flag.String("http-grpc", ":9090", "")
+
+func main() {
+ //flag.Parse()
+ //mux := runtime.NewServeMux()
+ //_ = echo.RegisterEchoServiceHandlerFromEndpoint(context.Background(), mux, *local, []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())})
+ //_ = http.ListenAndServe(*local, mux)
+
+ flag.Parse()
+ mux := runtime.NewServeMux()
+ mux.HandlePath("GET", "/ping", handlerPing)
+ opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
+ err := echov1.RegisterEchoServiceHandlerFromEndpoint(context.Background(), mux, *local, opts)
+ if err != nil {
+ log.Printf("register failed!%s\n", err)
+ return
+ }
+ err = http.ListenAndServe(":9091", mux)
+ if err != nil {
+ log.Printf("listen failed!%s\n", err)
+ return
+ }
+}
+
+func handlerPing(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
+ _, _ = fmt.Fprintf(w, "{\"msg\":\"pong\" }")
+}
+
+func handlerUpload(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
+ err := r.ParseForm()
+ if err != nil {
+ fmt.Fprintf(w, "upload failed! err:%d\n", http.StatusBadGateway)
+ }
+ log.Printf("adasdfsdgasgas\n")
+}
diff --git a/network_rpc/buf_compile/proto/buf.gen.yaml b/network_rpc/buf_compile/proto/buf.gen.yaml
new file mode 100644
index 0000000..9020f1d
--- /dev/null
+++ b/network_rpc/buf_compile/proto/buf.gen.yaml
@@ -0,0 +1,23 @@
+version: v1
+managed:
+ enabled: true
+ go_package_prefix:
+ default: .
+ except:
+ - buf.build/googleapis/googleapis
+plugins:
+ - plugin: go
+ out: service
+ opt:
+ - paths=source_relative
+ - plugin: go-grpc
+ out: service
+ opt:
+ - paths=source_relative
+ - plugin: grpc-gateway
+ out: service
+ opt:
+ - paths=source_relative
+ - grpc_api_configuration=nuts/echo/echo.yaml
+ - generate_unbound_methods=true
+
diff --git a/network_rpc/buf_compile/proto/nuts/echo/buf.lock b/network_rpc/buf_compile/proto/nuts/echo/buf.lock
new file mode 100644
index 0000000..c91b581
--- /dev/null
+++ b/network_rpc/buf_compile/proto/nuts/echo/buf.lock
@@ -0,0 +1,2 @@
+# Generated by buf. DO NOT EDIT.
+version: v1
diff --git a/network_rpc/buf_compile/proto/nuts/echo/buf.md b/network_rpc/buf_compile/proto/nuts/echo/buf.md
new file mode 100644
index 0000000..0f23f8c
--- /dev/null
+++ b/network_rpc/buf_compile/proto/nuts/echo/buf.md
@@ -0,0 +1,3 @@
+#### buf test
+
+this is my first buf registry.
\ No newline at end of file
diff --git a/network_rpc/buf_compile/proto/nuts/echo/buf.yaml b/network_rpc/buf_compile/proto/nuts/echo/buf.yaml
new file mode 100644
index 0000000..64fc867
--- /dev/null
+++ b/network_rpc/buf_compile/proto/nuts/echo/buf.yaml
@@ -0,0 +1,9 @@
+version: v1
+name: buf.build/nuts/echo
+
+breaking:
+ use:
+ - FILE
+lint:
+ use:
+ - DEFAULT
diff --git a/network_rpc/buf_compile/proto/nuts/echo/echo.yaml b/network_rpc/buf_compile/proto/nuts/echo/echo.yaml
new file mode 100644
index 0000000..06f53e0
--- /dev/null
+++ b/network_rpc/buf_compile/proto/nuts/echo/echo.yaml
@@ -0,0 +1,28 @@
+type: google.api.Service
+config_version: 3
+
+
+http:
+ rules:
+ - selector: nuts.echo.v1.EchoService.Echo
+ post: "/v1/example/echo"
+ body: "*"
+# additional_bindings:
+# - get: "/v1/example/" #get 方法没有body
+# - fetch: "/v1/example"
+# body:
+ - selector: nuts.echo.v1.EchoService.EchoBody
+ post: "/v1/echobody"
+ body: "*"
+ additional_bindings:
+ - get: "/v1/echobody/{id}"
+ - get: "/v1/echobody/{id}/{num}"
+ - selector: nuts.echo.v1.EchoService.EchoHeader
+ put: "/v1/echoheader/{id}/{num}"
+ - selector: nuts.echo.v1.EchoService.EchoUpload
+ post: "/v1/echoupload"
+ body: "*"
+ additional_bindings:
+ - put: "/v1/echoupload"
+ body: "*"
+
diff --git a/network_rpc/buf_compile/proto/nuts/echo/v1/echo.proto b/network_rpc/buf_compile/proto/nuts/echo/v1/echo.proto
new file mode 100644
index 0000000..0425b55
--- /dev/null
+++ b/network_rpc/buf_compile/proto/nuts/echo/v1/echo.proto
@@ -0,0 +1,40 @@
+syntax="proto3";
+
+package nuts.echo.v1;
+
+//import "annotations.proto";
+//import "http.proto";
+
+message EchoServiceEchoRequest{
+ string name=1;
+}
+message EchoServiceEchoResponse{
+ string value=1;
+}
+message EchoServiceEchoBodyRequest{
+ string id=1;
+ string num=2;
+}
+message EchoServiceEchoBodyResponse{
+ string value=1;
+}
+message EchoServiceEchoHeaderRequest{
+ int32 id=1;
+ string num=2;
+}
+message EchoServiceEchoHeaderResponse{
+ string value=1;
+}
+message EchoServiceEchoUploadRequest{
+ string name=1;
+ bytes content=2;
+}
+message EchoServiceEchoUploadResponse{
+ string value=1;
+}
+service EchoService{
+ rpc Echo(EchoServiceEchoRequest)returns(EchoServiceEchoResponse){}
+ rpc EchoBody(EchoServiceEchoBodyRequest)returns(EchoServiceEchoBodyResponse){}
+ rpc EchoHeader(EchoServiceEchoHeaderRequest)returns(EchoServiceEchoHeaderResponse){}
+ rpc EchoUpload(stream EchoServiceEchoUploadRequest)returns(EchoServiceEchoUploadResponse){}
+}
diff --git a/network_rpc/buf_compile/server/main.go b/network_rpc/buf_compile/server/main.go
new file mode 100644
index 0000000..dbfe687
--- /dev/null
+++ b/network_rpc/buf_compile/server/main.go
@@ -0,0 +1,84 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "io"
+ "log"
+ "net"
+ "os"
+
+ "google.golang.org/grpc/metadata"
+
+ echov1 "github.com/buf_compile/proto/service/nuts/echo/v1"
+
+ "google.golang.org/grpc"
+)
+
+var local = flag.String("grpc-server", ":9090", "")
+
+func main() {
+ flag.Parse()
+ conn, _ := net.Listen("tcp", *local)
+ server := grpc.NewServer()
+ echov1.RegisterEchoServiceServer(server, &Serv{})
+ _ = server.Serve(conn)
+}
+
+type Serv struct {
+ echov1.UnimplementedEchoServiceServer
+}
+
+func (s *Serv) Echo(ctx context.Context, request *echov1.EchoServiceEchoRequest) (*echov1.EchoServiceEchoResponse, error) {
+ log.Printf("[server] recv %v\n", request.GetName())
+ return &echov1.EchoServiceEchoResponse{Value: "hello! this is 回声桶 ,recv %s\n" + request.GetName()}, nil
+}
+
+func (s *Serv) EchoBody(ctx context.Context, req *echov1.EchoServiceEchoBodyRequest) (*echov1.EchoServiceEchoBodyResponse, error) {
+ return &echov1.EchoServiceEchoBodyResponse{Value: fmt.Sprintf("[EchoBody] recv id:%v num:%v", req.GetId(), req.GetNum())}, nil
+}
+func (s *Serv) EchoHeader(ctx context.Context, req *echov1.EchoServiceEchoHeaderRequest) (*echov1.EchoServiceEchoHeaderResponse, error) {
+ return &echov1.EchoServiceEchoHeaderResponse{Value: fmt.Sprintf("[EchoHeader] recv id:%v num:%v", req.GetId(), req.GetNum())}, nil
+
+}
+func (s *Serv) EchoUpload(stream echov1.EchoService_EchoUploadServer) error {
+ //获取传递的文件名称
+ md, ok := metadata.FromIncomingContext(stream.Context())
+ if !ok {
+ return nil
+ }
+ fileName, ok := md["file_name"]
+ if !ok {
+ return nil
+ }
+ file_name := fileName[0]
+ log.Printf("[server] recv file name:%v\n", file_name)
+ filepath := "file/" + file_name
+
+ //创建存储文件的名称
+ file, err := os.OpenFile(filepath, os.O_CREATE|os.O_WRONLY, 0666)
+ if err != nil {
+ fmt.Printf("[server] create file failed! file_name:%s\n", file.Name())
+ return err
+ }
+ defer file.Close()
+ //接收文件
+ for {
+ recv, err := stream.Recv()
+ if err == io.EOF {
+ return stream.SendAndClose(&echov1.EchoServiceEchoUploadResponse{Value: fmt.Sprintf("%s was recvived! ok", file.Name())})
+ }
+ if err != nil {
+ log.Printf("[server] get an unexpected error! %v\n", err)
+ return err
+ }
+ n, err := file.Write(recv.Content)
+ if err != nil {
+ log.Printf("[server] content write to file failed! %v\n", err)
+ return err
+ }
+ fmt.Printf("[server] recv %d\n", n)
+ }
+
+}
diff --git a/network_rpc/buf_test/client/main.go b/network_rpc/buf_test/client/main.go
new file mode 100644
index 0000000..67fba81
--- /dev/null
+++ b/network_rpc/buf_test/client/main.go
@@ -0,0 +1,18 @@
+package main
+
+import (
+ "context"
+ "fmt"
+
+ echov1 "github.com/buf_test/proto/service/nuts/echo/v1"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+func main() {
+ dial, _ := grpc.Dial(":9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
+ client := echov1.NewEchoServiceClient(dial)
+ resp, _ := client.Echo(context.Background(), &echov1.Arg{Value: "asdaksda"})
+ fmt.Println(resp.GetValue())
+
+}
diff --git a/network_rpc/buf_test/go.mod b/network_rpc/buf_test/go.mod
new file mode 100644
index 0000000..35df005
--- /dev/null
+++ b/network_rpc/buf_test/go.mod
@@ -0,0 +1,18 @@
+module github.com/buf_test
+
+go 1.21.0
+
+require (
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1
+ google.golang.org/grpc v1.60.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ golang.org/x/net v0.17.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.14.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect
+)
diff --git a/network_rpc/buf_test/go.sum b/network_rpc/buf_test/go.sum
new file mode 100644
index 0000000..1bd3646
--- /dev/null
+++ b/network_rpc/buf_test/go.sum
@@ -0,0 +1,27 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=
+google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=
+google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo=
+google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE=
+google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k=
+google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/network_rpc/buf_test/http/main.go b/network_rpc/buf_test/http/main.go
new file mode 100644
index 0000000..8732e33
--- /dev/null
+++ b/network_rpc/buf_test/http/main.go
@@ -0,0 +1,54 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "log"
+ "net/http"
+
+ echov1 "github.com/buf_test/proto/service/nuts/echo/v1"
+ "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+var local = flag.String("grpc-server-endpoint", "127.0.0.1:9091", "")
+
+//var grpcEndPoint = flag.String("grpc-server-endpoint", "127.0.0.1:9090", "")
+
+func main() {
+ //flag.Parse()
+ flag.Parse()
+ mux := runtime.NewServeMux()
+ fmt.Println(*local)
+ //fmt.Println(*grpcEndPoint)
+ //mux := runtime.NewServeMux()
+ opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
+ //opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
+ err := echov1.RegisterEchoServiceHandlerFromEndpoint(context.Background(), mux, *local, opts)
+ //err := servicev1.RegisterEchoServiceHandlerFromEndpoint(context.Background(), mux, *grpcEndPoint, opts)
+ if err != nil {
+ log.Fatal(err)
+ }
+ err = http.ListenAndServe(":9091", mux)
+ //err = http.ListenAndServe(":9091", mux)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ //flag.Parse()
+ //mux := runtime.NewServeMux()
+ //opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
+ //err := echov1.RegisterEchoServiceHandlerFromEndpoint(context.Background(), mux, *grpcEndPoint, opts)
+ //if err != nil {
+ // log.Printf("register failed!%s\n", err)
+ // return
+ //}
+ //err = http.ListenAndServe(":9091", mux)
+ //if err != nil {
+ // log.Printf("listen failed!%s\n", err)
+ // return
+ //}
+
+}
diff --git a/network_rpc/buf_test/proto/buf.gen.yaml b/network_rpc/buf_test/proto/buf.gen.yaml
new file mode 100644
index 0000000..1e24caa
--- /dev/null
+++ b/network_rpc/buf_test/proto/buf.gen.yaml
@@ -0,0 +1,19 @@
+version: v1
+managed:
+ enabled: true
+ go_package_prefix:
+ default: .
+plugins:
+ - plugin: go
+ out: service
+ opt:
+ - paths=source_relative
+ - plugin: go-grpc
+ out: service
+ opt:
+ - paths=source_relative
+ - plugin: grpc-gateway
+ out: service
+ opt:
+ - paths=source_relative
+ - grpc_api_configuration=nuts/echo/echo.yaml
\ No newline at end of file
diff --git a/network_rpc/buf_test/proto/nuts/echo/buf.yaml b/network_rpc/buf_test/proto/nuts/echo/buf.yaml
new file mode 100644
index 0000000..e90d28b
--- /dev/null
+++ b/network_rpc/buf_test/proto/nuts/echo/buf.yaml
@@ -0,0 +1,10 @@
+version: v1
+name: buf.build/nuts/echo
+deps:
+ - buf.build/googleapis/googleapis
+breaking:
+ use:
+ - FILE
+lint:
+ use:
+ - DEFAULT
diff --git a/network_rpc/buf_test/proto/nuts/echo/echo.yaml b/network_rpc/buf_test/proto/nuts/echo/echo.yaml
new file mode 100644
index 0000000..174822f
--- /dev/null
+++ b/network_rpc/buf_test/proto/nuts/echo/echo.yaml
@@ -0,0 +1,7 @@
+type: google.api.Service
+version: 3
+http:
+ rules:
+ - selector: nuts.echo.v1.EchoService.Echo
+ post: "/v1/example"
+ body: "*"
diff --git a/network_rpc/buf_test/proto/nuts/echo/v1/echo.proto b/network_rpc/buf_test/proto/nuts/echo/v1/echo.proto
new file mode 100644
index 0000000..ce79d19
--- /dev/null
+++ b/network_rpc/buf_test/proto/nuts/echo/v1/echo.proto
@@ -0,0 +1,16 @@
+syntax="proto3";
+
+package my.service.v1;
+import "google/api/annotations.proto";
+message StrMessage{
+ string value=1;
+}
+
+service EchoService{
+ rpc Echo(StrMessage)returns(StrMessage){
+ option (google.api.http) ={
+ post: "v1/example/echo"
+ body: "*"
+ };
+ }
+}
\ No newline at end of file
diff --git a/network_rpc/buf_test/proto/service/nuts/echo/v1/echo.pb.go b/network_rpc/buf_test/proto/service/nuts/echo/v1/echo.pb.go
new file mode 100644
index 0000000..2bf3ca5
--- /dev/null
+++ b/network_rpc/buf_test/proto/service/nuts/echo/v1/echo.pb.go
@@ -0,0 +1,157 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc (unknown)
+// source: nuts/echo/v1/echo.proto
+
+package servicev1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type StrMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *StrMessage) Reset() {
+ *x = StrMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_echo_v1_echo_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *StrMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StrMessage) ProtoMessage() {}
+
+func (x *StrMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_echo_v1_echo_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StrMessage.ProtoReflect.Descriptor instead.
+func (*StrMessage) Descriptor() ([]byte, []int) {
+ return file_nuts_echo_v1_echo_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *StrMessage) GetValue() string {
+ if x != nil {
+ return x.Value
+ }
+ return ""
+}
+
+var File_nuts_echo_v1_echo_proto protoreflect.FileDescriptor
+
+var file_nuts_echo_v1_echo_proto_rawDesc = []byte{
+ 0x0a, 0x17, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x65,
+ 0x63, 0x68, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x6d, 0x79, 0x2e, 0x73, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x22, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x4d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0x4b, 0x0a, 0x0b,
+ 0x45, 0x63, 0x68, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x45,
+ 0x63, 0x68, 0x6f, 0x12, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x19,
+ 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53,
+ 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x8c, 0x01, 0x0a, 0x11, 0x63, 0x6f,
+ 0x6d, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x42,
+ 0x09, 0x45, 0x63, 0x68, 0x6f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x16, 0x6e, 0x75,
+ 0x74, 0x73, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x76, 0x31, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x53, 0x58, 0xaa, 0x02, 0x0d, 0x4d, 0x79, 0x2e,
+ 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, 0x4d, 0x79, 0x5c,
+ 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, 0x4d, 0x79, 0x5c,
+ 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,
+ 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4d, 0x79, 0x3a, 0x3a, 0x53, 0x65, 0x72,
+ 0x76, 0x69, 0x63, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_nuts_echo_v1_echo_proto_rawDescOnce sync.Once
+ file_nuts_echo_v1_echo_proto_rawDescData = file_nuts_echo_v1_echo_proto_rawDesc
+)
+
+func file_nuts_echo_v1_echo_proto_rawDescGZIP() []byte {
+ file_nuts_echo_v1_echo_proto_rawDescOnce.Do(func() {
+ file_nuts_echo_v1_echo_proto_rawDescData = protoimpl.X.CompressGZIP(file_nuts_echo_v1_echo_proto_rawDescData)
+ })
+ return file_nuts_echo_v1_echo_proto_rawDescData
+}
+
+var file_nuts_echo_v1_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_nuts_echo_v1_echo_proto_goTypes = []interface{}{
+ (*StrMessage)(nil), // 0: my.service.v1.StrMessage
+}
+var file_nuts_echo_v1_echo_proto_depIdxs = []int32{
+ 0, // 0: my.service.v1.EchoService.Echo:input_type -> my.service.v1.StrMessage
+ 0, // 1: my.service.v1.EchoService.Echo:output_type -> my.service.v1.StrMessage
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_nuts_echo_v1_echo_proto_init() }
+func file_nuts_echo_v1_echo_proto_init() {
+ if File_nuts_echo_v1_echo_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_nuts_echo_v1_echo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*StrMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_nuts_echo_v1_echo_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_nuts_echo_v1_echo_proto_goTypes,
+ DependencyIndexes: file_nuts_echo_v1_echo_proto_depIdxs,
+ MessageInfos: file_nuts_echo_v1_echo_proto_msgTypes,
+ }.Build()
+ File_nuts_echo_v1_echo_proto = out.File
+ file_nuts_echo_v1_echo_proto_rawDesc = nil
+ file_nuts_echo_v1_echo_proto_goTypes = nil
+ file_nuts_echo_v1_echo_proto_depIdxs = nil
+}
diff --git a/network_rpc/buf_test/proto/service/nuts/echo/v1/echo.pb.gw.go b/network_rpc/buf_test/proto/service/nuts/echo/v1/echo.pb.gw.go
new file mode 100644
index 0000000..a57022c
--- /dev/null
+++ b/network_rpc/buf_test/proto/service/nuts/echo/v1/echo.pb.gw.go
@@ -0,0 +1,171 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: nuts/echo/v1/echo.proto
+
+/*
+Package servicev1 is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package servicev1
+
+import (
+ "context"
+ "io"
+ "net/http"
+
+ "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+ "github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/metadata"
+ "google.golang.org/grpc/status"
+ "google.golang.org/protobuf/proto"
+)
+
+// Suppress "imported and not used" errors
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+var _ = metadata.Join
+
+func request_EchoService_Echo_0(ctx context.Context, marshaler runtime.Marshaler, client EchoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.Echo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_EchoService_Echo_0(ctx context.Context, marshaler runtime.Marshaler, server EchoServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.Echo(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+// RegisterEchoServiceHandlerServer registers the http handlers for service EchoService to "mux".
+// UnaryRPC :call EchoServiceServer directly.
+// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
+// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterEchoServiceHandlerFromEndpoint instead.
+func RegisterEchoServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server EchoServiceServer) error {
+
+ mux.Handle("POST", pattern_EchoService_Echo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/my.service.v1.EchoService/Echo", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/Echo"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_EchoService_Echo_0(annotatedContext, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_Echo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ return nil
+}
+
+// RegisterEchoServiceHandlerFromEndpoint is same as RegisterEchoServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterEchoServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+ conn, err := grpc.DialContext(ctx, endpoint, opts...)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err != nil {
+ if cerr := conn.Close(); cerr != nil {
+ grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+ }
+ return
+ }
+ go func() {
+ <-ctx.Done()
+ if cerr := conn.Close(); cerr != nil {
+ grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+ }
+ }()
+ }()
+
+ return RegisterEchoServiceHandler(ctx, mux, conn)
+}
+
+// RegisterEchoServiceHandler registers the http handlers for service EchoService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterEchoServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+ return RegisterEchoServiceHandlerClient(ctx, mux, NewEchoServiceClient(conn))
+}
+
+// RegisterEchoServiceHandlerClient registers the http handlers for service EchoService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "EchoServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "EchoServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "EchoServiceClient" to call the correct interceptors.
+func RegisterEchoServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client EchoServiceClient) error {
+
+ mux.Handle("POST", pattern_EchoService_Echo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/my.service.v1.EchoService/Echo", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/Echo"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_EchoService_Echo_0(annotatedContext, inboundMarshaler, client, req, pathParams)
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_Echo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ return nil
+}
+
+var (
+ pattern_EchoService_Echo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"my.service.v1.EchoService", "Echo"}, ""))
+)
+
+var (
+ forward_EchoService_Echo_0 = runtime.ForwardResponseMessage
+)
diff --git a/network_rpc/buf_test/proto/service/nuts/echo/v1/echo_grpc.pb.go b/network_rpc/buf_test/proto/service/nuts/echo/v1/echo_grpc.pb.go
new file mode 100644
index 0000000..e7c072f
--- /dev/null
+++ b/network_rpc/buf_test/proto/service/nuts/echo/v1/echo_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc (unknown)
+// source: nuts/echo/v1/echo.proto
+
+package servicev1
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ EchoService_Echo_FullMethodName = "/my.service.v1.EchoService/Echo"
+)
+
+// EchoServiceClient is the client API for EchoService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type EchoServiceClient interface {
+ Echo(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error)
+}
+
+type echoServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewEchoServiceClient(cc grpc.ClientConnInterface) EchoServiceClient {
+ return &echoServiceClient{cc}
+}
+
+func (c *echoServiceClient) Echo(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error) {
+ out := new(StrMessage)
+ err := c.cc.Invoke(ctx, EchoService_Echo_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// EchoServiceServer is the server API for EchoService service.
+// All implementations must embed UnimplementedEchoServiceServer
+// for forward compatibility
+type EchoServiceServer interface {
+ Echo(context.Context, *StrMessage) (*StrMessage, error)
+ mustEmbedUnimplementedEchoServiceServer()
+}
+
+// UnimplementedEchoServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedEchoServiceServer struct {
+}
+
+func (UnimplementedEchoServiceServer) Echo(context.Context, *StrMessage) (*StrMessage, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented")
+}
+func (UnimplementedEchoServiceServer) mustEmbedUnimplementedEchoServiceServer() {}
+
+// UnsafeEchoServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to EchoServiceServer will
+// result in compilation errors.
+type UnsafeEchoServiceServer interface {
+ mustEmbedUnimplementedEchoServiceServer()
+}
+
+func RegisterEchoServiceServer(s grpc.ServiceRegistrar, srv EchoServiceServer) {
+ s.RegisterService(&EchoService_ServiceDesc, srv)
+}
+
+func _EchoService_Echo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(StrMessage)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(EchoServiceServer).Echo(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: EchoService_Echo_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(EchoServiceServer).Echo(ctx, req.(*StrMessage))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// EchoService_ServiceDesc is the grpc.ServiceDesc for EchoService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var EchoService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "my.service.v1.EchoService",
+ HandlerType: (*EchoServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Echo",
+ Handler: _EchoService_Echo_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "nuts/echo/v1/echo.proto",
+}
diff --git a/network_rpc/buf_test/server/main.go b/network_rpc/buf_test/server/main.go
new file mode 100644
index 0000000..9eaf56b
--- /dev/null
+++ b/network_rpc/buf_test/server/main.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+ "context"
+ "flag"
+
+ echov1 "github.com/buf_test/proto/service/nuts/echo/v1"
+
+ "log"
+ "net"
+ "strconv"
+
+ "google.golang.org/grpc"
+)
+
+type Serv struct {
+ echov1.UnimplementedEchoServiceServer
+}
+
+func (s *Serv) Echo(ctx context.Context, message *echov1.StrMessage) (*echov1.StrMessage, error) {
+ log.Printf("recv value:%s\n", message.GetValue())
+ return &echov1.StrMessage{Value: message.GetValue()}, nil
+
+}
+
+//
+//func (s *Serv) EchoBody(ctx context.Context, message *v1.StrMessage) (*v1.StrMessage, error) {
+// return &v1.StrMessage{Value: "I'am " + message.GetValue()}, nil
+//
+//}
+//
+//func (s *Serv) EchoFuck(ctx context.Context, message *v1.StrMessage) (*v1.StrMessage, error) {
+// return &v1.StrMessage{Value: "fuck," + message.GetValue()}, nil
+//
+//}
+
+var grpcServerEnterPoint = flag.String("grpc-server-endpoint", "127.0.0.1:9090", "")
+var port = flag.Int("port", 9090, "")
+
+func main() {
+ flag.Parse()
+ conn, _ := net.Listen("tcp", ":"+strconv.Itoa(*port))
+ server := grpc.NewServer()
+ echov1.RegisterEchoServiceServer(server, &Serv{})
+ _ = server.Serve(conn)
+
+}
diff --git a/network_rpc/demo_test/apps/gateway/cmd/main.go b/network_rpc/demo_test/apps/gateway/cmd/main.go
new file mode 100644
index 0000000..63116a7
--- /dev/null
+++ b/network_rpc/demo_test/apps/gateway/cmd/main.go
@@ -0,0 +1,21 @@
+package main
+
+import (
+ "net/http"
+ "time"
+
+ "github.com/nuts/demo_test/apps/gateway/internal/routers"
+)
+
+func main() {
+ engine := routers.NewEngine()
+ server := http.Server{
+ Addr: ":9090",
+ Handler: engine,
+ ReadTimeout: time.Second * 8,
+ WriteTimeout: time.Second * 8,
+ MaxHeaderBytes: 2 << 2,
+ }
+ _ = server.ListenAndServe()
+
+}
diff --git a/network_rpc/demo_test/apps/gateway/internal/logic/logic.go b/network_rpc/demo_test/apps/gateway/internal/logic/logic.go
new file mode 100644
index 0000000..b2b9bc6
--- /dev/null
+++ b/network_rpc/demo_test/apps/gateway/internal/logic/logic.go
@@ -0,0 +1,71 @@
+package logic
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "net/http"
+
+ msg2 "github.com/nuts/demo_test/pkg/msg"
+
+ hello_servicev1 "github.com/nuts/demo_test/idl/service/nuts/hello/v1"
+
+ clientv3 "go.etcd.io/etcd/client/v3"
+ "go.etcd.io/etcd/client/v3/naming/resolver"
+
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+
+ "github.com/gin-gonic/gin"
+)
+
+var (
+ etcdFlag = flag.String("etcd", ":2379", "etcd endpoints")
+)
+
+func Login(ctx *gin.Context) {
+
+}
+func Pong(ctx *gin.Context) {
+ ctx.JSON(http.StatusOK, gin.H{"msg": "pong"})
+}
+
+func Hello(ctx *gin.Context) {
+ //解析ctx中的参数
+ msg := new(msg2.Req)
+ err := ctx.ShouldBindJSON(msg)
+ if err != nil {
+ fmt.Printf("parse para failed! %v\n", err)
+ return
+ }
+ flag.Parse()
+ url, err := clientv3.NewFromURL(*etcdFlag)
+ if err != nil {
+ fmt.Printf("create etcd client failed! %v\n", err)
+ return
+ }
+ builder, err := resolver.NewBuilder(url)
+ if err != nil {
+ fmt.Printf("create builder failed! %v\n", err)
+ return
+ }
+ //创建一个grpc客户端
+ dial, err := grpc.Dial("etcd:///nuts/hello/v1",
+ grpc.WithResolvers(builder),
+ grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`),
+ grpc.WithTransportCredentials(insecure.NewCredentials()))
+ if err != nil {
+ fmt.Printf("connect to etcd failed! %v\n", err)
+ return
+ }
+ //
+ client := hello_servicev1.NewHelloServiceClient(dial)
+ echo, err := client.Echo(context.TODO(), &hello_servicev1.EchoRequest{
+ Value: msg.Value,
+ })
+ if err != nil {
+ fmt.Printf("rpc failed! %v\n", err)
+ return
+ }
+ ctx.JSON(http.StatusOK, gin.H{"resp": echo.GetValue()})
+}
diff --git a/network_rpc/demo_test/apps/gateway/internal/routers/engine.go b/network_rpc/demo_test/apps/gateway/internal/routers/engine.go
new file mode 100644
index 0000000..c46e3d6
--- /dev/null
+++ b/network_rpc/demo_test/apps/gateway/internal/routers/engine.go
@@ -0,0 +1,10 @@
+package routers
+
+import "github.com/gin-gonic/gin"
+
+func NewEngine() *gin.Engine {
+ engine := gin.Default()
+ en := handlers(engine)
+ return en
+
+}
diff --git a/network_rpc/demo_test/apps/gateway/internal/routers/routers.go b/network_rpc/demo_test/apps/gateway/internal/routers/routers.go
new file mode 100644
index 0000000..c4e7fc2
--- /dev/null
+++ b/network_rpc/demo_test/apps/gateway/internal/routers/routers.go
@@ -0,0 +1,23 @@
+package routers
+
+import (
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+ "github.com/nuts/demo_test/apps/gateway/internal/logic"
+ "github.com/nuts/demo_test/pkg/middleware"
+)
+
+func handlers(engine *gin.Engine) *gin.Engine {
+ engine.GET("/ping", logic.Pong)
+ engine.GET("/login", logic.Login)
+ authEngine := engine.Group("/auth/v1")
+ authEngine.Use(middleware.Auth, middleware.Core)
+ {
+ authEngine.POST("/hello", logic.Hello)
+ }
+ engine.NoRoute(func(context *gin.Context) {
+ context.JSON(http.StatusNotFound, gin.H{"msg": "source not found!"})
+ })
+ return engine
+}
diff --git a/network_rpc/demo_test/apps/gateway/rpc/server.go b/network_rpc/demo_test/apps/gateway/rpc/server.go
new file mode 100644
index 0000000..df7bb1e
--- /dev/null
+++ b/network_rpc/demo_test/apps/gateway/rpc/server.go
@@ -0,0 +1,10 @@
+package server
+
+import "github.com/gin-gonic/gin"
+
+type Serv struct {
+}
+
+func Run(router gin.IRouter) {
+
+}
diff --git a/network_rpc/demo_test/apps/hello1/cmd/main.go b/network_rpc/demo_test/apps/hello1/cmd/main.go
new file mode 100644
index 0000000..1f4a4a6
--- /dev/null
+++ b/network_rpc/demo_test/apps/hello1/cmd/main.go
@@ -0,0 +1,8 @@
+package main
+
+import "github.com/nuts/demo_test/apps/hello1/internal/server"
+
+func main() {
+ serv := server.NewServer()
+ serv.Run()
+}
diff --git a/network_rpc/demo_test/apps/hello1/internal/server/server.go b/network_rpc/demo_test/apps/hello1/internal/server/server.go
new file mode 100644
index 0000000..2ada0e5
--- /dev/null
+++ b/network_rpc/demo_test/apps/hello1/internal/server/server.go
@@ -0,0 +1,71 @@
+package server
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "net"
+
+ "go.etcd.io/etcd/client/v3/naming/endpoints"
+
+ clientv3 "go.etcd.io/etcd/client/v3"
+ "google.golang.org/grpc"
+
+ hello_servicev1 "github.com/nuts/demo_test/idl/service/nuts/hello/v1"
+)
+
+var (
+ localFlag = flag.String("hello1", ":9091", "hello1 service endpoint")
+ etcdFlag = flag.String("etcd", ":2379", "etcd server endpoint")
+)
+
+type Serv struct {
+ *hello_servicev1.UnimplementedHelloServiceServer
+}
+
+func (s *Serv) Echo(ctx context.Context, request *hello_servicev1.EchoRequest) (response *hello_servicev1.EchoResponse, err error) {
+ fmt.Println(request.GetValue() + ",潘丽萍")
+ return &hello_servicev1.EchoResponse{Value: request.Value + ",潘丽萍"}, nil
+}
+
+func (s *Serv) Run() {
+ flag.Parse()
+ listen, err := net.Listen("tcp", *localFlag)
+ if err != nil {
+ fmt.Printf("[server1] listen %s failed! %v\n", *localFlag, err)
+ return
+ }
+ // 创建一个grpc服务
+ server := grpc.NewServer()
+ //将grpc服务与此服务实例绑定
+ hello_servicev1.RegisterHelloServiceServer(server, &Serv{})
+ // 创建一个etcd客户端
+ client, err := clientv3.NewFromURL(*etcdFlag)
+ if err != nil {
+ fmt.Printf("[server1] create etcd client failed! %s\n", err)
+ }
+ //通过etcd客户端实现一个管理,并将此服务注册到etcd
+ manager, err := endpoints.NewManager(client, "nuts/hello/v1")
+ if err != nil {
+ fmt.Printf("[server1] create manager failed! %v\n", err)
+ return
+ }
+ ctx, cancelFunc := context.WithCancel(context.Background())
+ defer cancelFunc()
+ lease, err := client.Grant(ctx, 2004)
+ if err != nil {
+ fmt.Printf("[server1] create lease failed! %v\n", err)
+ return
+ }
+ //将此服务注册到注册中心
+ err = manager.AddEndpoint(ctx, "nuts/hello/v1/hello1", endpoints.Endpoint{Addr: *localFlag}, clientv3.WithLease(lease.ID))
+ if err != nil {
+ fmt.Printf("[server1] service register failed! %v\n", err)
+ return
+ }
+ // 监听服务
+ server.Serve(listen)
+}
+func NewServer() *Serv {
+ return &Serv{}
+}
diff --git a/network_rpc/demo_test/apps/hello2/cmd/main.go b/network_rpc/demo_test/apps/hello2/cmd/main.go
new file mode 100644
index 0000000..cc111ad
--- /dev/null
+++ b/network_rpc/demo_test/apps/hello2/cmd/main.go
@@ -0,0 +1,8 @@
+package main
+
+import "github.com/nuts/demo_test/apps/hello2/internal/server"
+
+func main() {
+ serv := server.NewServer()
+ serv.Run()
+}
diff --git a/network_rpc/demo_test/apps/hello2/internal/server/hello2.go b/network_rpc/demo_test/apps/hello2/internal/server/hello2.go
new file mode 100644
index 0000000..9e9ed34
--- /dev/null
+++ b/network_rpc/demo_test/apps/hello2/internal/server/hello2.go
@@ -0,0 +1,69 @@
+package server
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "net"
+
+ clientv3 "go.etcd.io/etcd/client/v3"
+ "go.etcd.io/etcd/client/v3/naming/endpoints"
+
+ "google.golang.org/grpc"
+
+ hello_servicev1 "github.com/nuts/demo_test/idl/service/nuts/hello/v1"
+)
+
+var (
+ localFlog = flag.String("[server2]", ":9092", "local service2")
+ etcdFlog = flag.String("[serve2]", ":2379", "etcd server endpoints")
+)
+
+type Serv struct {
+ *hello_servicev1.UnimplementedHelloServiceServer
+}
+
+func NewServer() *Serv {
+ return &Serv{}
+}
+
+func (s *Serv) Echo(ctx context.Context, request *hello_servicev1.EchoRequest) (*hello_servicev1.EchoResponse, error) {
+ fmt.Printf("%v,周小林\n", request.GetValue())
+ return &hello_servicev1.EchoResponse{Value: request.GetValue() + ",周小林"}, nil
+
+}
+func (s Serv) Run() {
+ flag.Parse()
+ conn, err := net.Listen("tcp", *localFlog)
+ if err != nil {
+ fmt.Printf("[server2] listen %s failed! %v\n", *localFlog, err)
+ return
+ }
+ //创建grpc服务并绑定服务
+ server := grpc.NewServer()
+ hello_servicev1.RegisterHelloServiceServer(server, &Serv{})
+ //创建一个etcd客户端
+ client, err := clientv3.NewFromURL(*etcdFlog)
+ if err != nil {
+ fmt.Printf("[server2] create etcd client failed! %v\n", err)
+ return
+ }
+ manager, err := endpoints.NewManager(client, "nuts/hello/v1")
+ if err != nil {
+ fmt.Printf("[server2] create manager failed! %v\n", err)
+ return
+ }
+ ctx, cancelFunc := context.WithCancel(context.Background())
+ defer cancelFunc()
+ lease, err := client.Grant(ctx, 2000)
+ if err != nil {
+ fmt.Printf("[server2] create lease failed! %v\n", err)
+ return
+ }
+ err = manager.AddEndpoint(ctx, "nuts/hello/v1/hello2", endpoints.Endpoint{Addr: *localFlog}, clientv3.WithLease(lease.ID))
+ if err != nil {
+ fmt.Printf("[server2] service register failed! %v\n", err)
+ return
+ }
+ server.Serve(conn)
+}
diff --git a/network_rpc/demo_test/go.mod b/network_rpc/demo_test/go.mod
new file mode 100644
index 0000000..399bf72
--- /dev/null
+++ b/network_rpc/demo_test/go.mod
@@ -0,0 +1,65 @@
+module github.com/nuts/demo_test
+
+go 1.21
+
+require (
+ github.com/gin-gonic/gin v1.9.1
+ google.golang.org/grpc v1.60.1
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/IBM/sarama v1.43.0 // indirect
+ github.com/bytedance/sonic v1.9.1 // indirect
+ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+ github.com/coreos/go-semver v0.3.0 // indirect
+ github.com/coreos/go-systemd/v22 v22.3.2 // indirect
+ github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/eapache/go-resiliency v1.6.0 // indirect
+ github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
+ github.com/eapache/queue v1.1.0 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.14.0 // indirect
+ github.com/goccy/go-json v0.10.2 // indirect
+ github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang/protobuf v1.5.3 // indirect
+ github.com/golang/snappy v0.0.4 // indirect
+ github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-multierror v1.1.1 // indirect
+ github.com/hashicorp/go-uuid v1.0.3 // indirect
+ github.com/jcmturner/aescts/v2 v2.0.0 // indirect
+ github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
+ github.com/jcmturner/gofork v1.7.6 // indirect
+ github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect
+ github.com/jcmturner/rpc/v2 v2.0.3 // indirect
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/klauspost/compress v1.17.7 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.4 // indirect
+ github.com/leodido/go-urn v1.2.4 // indirect
+ github.com/mattn/go-isatty v0.0.19 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/pelletier/go-toml/v2 v2.0.8 // indirect
+ github.com/pierrec/lz4/v4 v4.1.21 // indirect
+ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+ github.com/ugorji/go/codec v1.2.11 // indirect
+ go.etcd.io/etcd/api/v3 v3.5.11 // indirect
+ go.etcd.io/etcd/client/pkg/v3 v3.5.11 // indirect
+ go.etcd.io/etcd/client/v3 v3.5.11 // indirect
+ go.uber.org/atomic v1.7.0 // indirect
+ go.uber.org/multierr v1.6.0 // indirect
+ go.uber.org/zap v1.17.0 // indirect
+ golang.org/x/arch v0.3.0 // indirect
+ golang.org/x/crypto v0.20.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
+ golang.org/x/text v0.14.0 // indirect
+ google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/network_rpc/demo_test/go.sum b/network_rpc/demo_test/go.sum
new file mode 100644
index 0000000..83166ee
--- /dev/null
+++ b/network_rpc/demo_test/go.sum
@@ -0,0 +1,216 @@
+github.com/IBM/sarama v1.43.0 h1:YFFDn8mMI2QL0wOrG0J2sFoVIAFl7hS9JQi2YZsXtJc=
+github.com/IBM/sarama v1.43.0/go.mod h1:zlE6HEbC/SMQ9mhEYaF7nNLYOUyrs0obySKCckWP9BM=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
+github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30=
+github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho=
+github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws=
+github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0=
+github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
+github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
+github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
+github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
+github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
+github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
+github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
+github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=
+github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
+github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
+github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=
+github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
+github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
+github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
+github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
+github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
+github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
+github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.etcd.io/etcd/api/v3 v3.5.11 h1:B54KwXbWDHyD3XYAwprxNzTe7vlhR69LuBgZnMVvS7E=
+go.etcd.io/etcd/api/v3 v3.5.11/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4=
+go.etcd.io/etcd/client/pkg/v3 v3.5.11 h1:bT2xVspdiCj2910T0V+/KHcVKjkUrCZVtk8J2JF2z1A=
+go.etcd.io/etcd/client/pkg/v3 v3.5.11/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=
+go.etcd.io/etcd/client/v3 v3.5.11 h1:ajWtgoNSZJ1gmS8k+icvPtqsqEav+iUorF7b0qozgUU=
+go.etcd.io/etcd/client/v3 v3.5.11/go.mod h1:a6xQUEqFJ8vztO1agJh/KQKOMfFI8og52ZconzcDJwE=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
+golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
+golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos=
+golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0=
+google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk=
+google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU=
+google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY=
+google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU=
+google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/network_rpc/demo_test/idl/buf.gen.yaml b/network_rpc/demo_test/idl/buf.gen.yaml
new file mode 100644
index 0000000..5b425d5
--- /dev/null
+++ b/network_rpc/demo_test/idl/buf.gen.yaml
@@ -0,0 +1,14 @@
+version: v1
+managed:
+ enabled: true
+ go_package_prefix:
+ default: .
+plugins:
+ - plugin: go
+ out: service
+ opt:
+ - paths=source_relative
+ - plugin: go-grpc
+ out: service
+ opt:
+ - paths=source_relative
\ No newline at end of file
diff --git a/network_rpc/demo_test/idl/default.etcd/member/snap/db b/network_rpc/demo_test/idl/default.etcd/member/snap/db
new file mode 100644
index 0000000..ed5d5e7
Binary files /dev/null and b/network_rpc/demo_test/idl/default.etcd/member/snap/db differ
diff --git a/network_rpc/demo_test/idl/default.etcd/member/wal/0000000000000000-0000000000000000.wal b/network_rpc/demo_test/idl/default.etcd/member/wal/0000000000000000-0000000000000000.wal
new file mode 100644
index 0000000..4e55ea3
Binary files /dev/null and b/network_rpc/demo_test/idl/default.etcd/member/wal/0000000000000000-0000000000000000.wal differ
diff --git a/network_rpc/demo_test/idl/nuts/hello/v1/hello.proto b/network_rpc/demo_test/idl/nuts/hello/v1/hello.proto
new file mode 100644
index 0000000..1a80892
--- /dev/null
+++ b/network_rpc/demo_test/idl/nuts/hello/v1/hello.proto
@@ -0,0 +1,13 @@
+syntax="proto3";
+package nuts.hello_service.v1;
+
+service HelloService{
+ rpc Echo(EchoRequest)returns(EchoResponse){}
+}
+
+message EchoRequest{
+ string value=1;
+}
+message EchoResponse{
+ string value=1;
+}
\ No newline at end of file
diff --git a/network_rpc/demo_test/idl/nuts/login/v1/login.proto b/network_rpc/demo_test/idl/nuts/login/v1/login.proto
new file mode 100644
index 0000000..22c6090
--- /dev/null
+++ b/network_rpc/demo_test/idl/nuts/login/v1/login.proto
@@ -0,0 +1,14 @@
+syntax="proto3";
+package nuts.login.v1;
+
+service LoginService{
+ rpc Login(LoginRequest)returns(LoginResponse){}
+}
+
+message LoginRequest{
+ string name=1;
+ string password=2;
+}
+message LoginResponse{
+ string resp=1;
+}
diff --git a/network_rpc/demo_test/idl/nuts/register/v1/register.proto b/network_rpc/demo_test/idl/nuts/register/v1/register.proto
new file mode 100644
index 0000000..f93752f
--- /dev/null
+++ b/network_rpc/demo_test/idl/nuts/register/v1/register.proto
@@ -0,0 +1,13 @@
+syntax="proto3";
+package nuts.register.v1;
+service RegisterService{
+ rpc Register(RegisterRequest)returns(RegisterResponse){}
+}
+
+message RegisterRequest{
+ string name=1;
+ string password=2;
+}
+message RegisterResponse{
+ string resp=1;
+}
\ No newline at end of file
diff --git a/network_rpc/demo_test/idl/service/nuts/hello/v1/hello.pb.go b/network_rpc/demo_test/idl/service/nuts/hello/v1/hello.pb.go
new file mode 100644
index 0000000..93c5a21
--- /dev/null
+++ b/network_rpc/demo_test/idl/service/nuts/hello/v1/hello.pb.go
@@ -0,0 +1,225 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc (unknown)
+// source: nuts/hello/v1/hello.proto
+
+package hello_servicev1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type EchoRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *EchoRequest) Reset() {
+ *x = EchoRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_hello_v1_hello_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EchoRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EchoRequest) ProtoMessage() {}
+
+func (x *EchoRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_hello_v1_hello_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EchoRequest.ProtoReflect.Descriptor instead.
+func (*EchoRequest) Descriptor() ([]byte, []int) {
+ return file_nuts_hello_v1_hello_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *EchoRequest) GetValue() string {
+ if x != nil {
+ return x.Value
+ }
+ return ""
+}
+
+type EchoResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *EchoResponse) Reset() {
+ *x = EchoResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_hello_v1_hello_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EchoResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EchoResponse) ProtoMessage() {}
+
+func (x *EchoResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_hello_v1_hello_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EchoResponse.ProtoReflect.Descriptor instead.
+func (*EchoResponse) Descriptor() ([]byte, []int) {
+ return file_nuts_hello_v1_hello_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *EchoResponse) GetValue() string {
+ if x != nil {
+ return x.Value
+ }
+ return ""
+}
+
+var File_nuts_hello_v1_hello_proto protoreflect.FileDescriptor
+
+var file_nuts_hello_v1_hello_proto_rawDesc = []byte{
+ 0x0a, 0x19, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2f, 0x76, 0x31, 0x2f,
+ 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x6e, 0x75, 0x74,
+ 0x73, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+ 0x76, 0x31, 0x22, 0x23, 0x0a, 0x0b, 0x45, 0x63, 0x68, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x45, 0x63, 0x68, 0x6f, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0x61, 0x0a,
+ 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a,
+ 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x22, 0x2e, 0x6e, 0x75, 0x74, 0x73, 0x2e, 0x68, 0x65, 0x6c,
+ 0x6c, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x63,
+ 0x68, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6e, 0x75, 0x74, 0x73,
+ 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x45, 0x63, 0x68, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+ 0x42, 0xb8, 0x01, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x75, 0x74, 0x73, 0x2e, 0x68, 0x65,
+ 0x6c, 0x6c, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0a,
+ 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x6e, 0x75,
+ 0x74, 0x73, 0x2f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2f, 0x76, 0x31, 0x3b, 0x68, 0x65, 0x6c, 0x6c,
+ 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x48,
+ 0x58, 0xaa, 0x02, 0x14, 0x4e, 0x75, 0x74, 0x73, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x53, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x14, 0x4e, 0x75, 0x74, 0x73, 0x5c,
+ 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0xe2,
+ 0x02, 0x20, 0x4e, 0x75, 0x74, 0x73, 0x5c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x53, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+ 0x74, 0x61, 0xea, 0x02, 0x16, 0x4e, 0x75, 0x74, 0x73, 0x3a, 0x3a, 0x48, 0x65, 0x6c, 0x6c, 0x6f,
+ 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_nuts_hello_v1_hello_proto_rawDescOnce sync.Once
+ file_nuts_hello_v1_hello_proto_rawDescData = file_nuts_hello_v1_hello_proto_rawDesc
+)
+
+func file_nuts_hello_v1_hello_proto_rawDescGZIP() []byte {
+ file_nuts_hello_v1_hello_proto_rawDescOnce.Do(func() {
+ file_nuts_hello_v1_hello_proto_rawDescData = protoimpl.X.CompressGZIP(file_nuts_hello_v1_hello_proto_rawDescData)
+ })
+ return file_nuts_hello_v1_hello_proto_rawDescData
+}
+
+var file_nuts_hello_v1_hello_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_nuts_hello_v1_hello_proto_goTypes = []interface{}{
+ (*EchoRequest)(nil), // 0: nuts.hello_service.v1.EchoRequest
+ (*EchoResponse)(nil), // 1: nuts.hello_service.v1.EchoResponse
+}
+var file_nuts_hello_v1_hello_proto_depIdxs = []int32{
+ 0, // 0: nuts.hello_service.v1.HelloService.Echo:input_type -> nuts.hello_service.v1.EchoRequest
+ 1, // 1: nuts.hello_service.v1.HelloService.Echo:output_type -> nuts.hello_service.v1.EchoResponse
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_nuts_hello_v1_hello_proto_init() }
+func file_nuts_hello_v1_hello_proto_init() {
+ if File_nuts_hello_v1_hello_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_nuts_hello_v1_hello_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EchoRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_nuts_hello_v1_hello_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EchoResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_nuts_hello_v1_hello_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_nuts_hello_v1_hello_proto_goTypes,
+ DependencyIndexes: file_nuts_hello_v1_hello_proto_depIdxs,
+ MessageInfos: file_nuts_hello_v1_hello_proto_msgTypes,
+ }.Build()
+ File_nuts_hello_v1_hello_proto = out.File
+ file_nuts_hello_v1_hello_proto_rawDesc = nil
+ file_nuts_hello_v1_hello_proto_goTypes = nil
+ file_nuts_hello_v1_hello_proto_depIdxs = nil
+}
diff --git a/network_rpc/demo_test/idl/service/nuts/hello/v1/hello_grpc.pb.go b/network_rpc/demo_test/idl/service/nuts/hello/v1/hello_grpc.pb.go
new file mode 100644
index 0000000..627d4a0
--- /dev/null
+++ b/network_rpc/demo_test/idl/service/nuts/hello/v1/hello_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc (unknown)
+// source: nuts/hello/v1/hello.proto
+
+package hello_servicev1
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ HelloService_Echo_FullMethodName = "/nuts.hello_service.v1.HelloService/Echo"
+)
+
+// HelloServiceClient is the client API for HelloService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type HelloServiceClient interface {
+ Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error)
+}
+
+type helloServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewHelloServiceClient(cc grpc.ClientConnInterface) HelloServiceClient {
+ return &helloServiceClient{cc}
+}
+
+func (c *helloServiceClient) Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error) {
+ out := new(EchoResponse)
+ err := c.cc.Invoke(ctx, HelloService_Echo_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// HelloServiceServer is the server API for HelloService service.
+// All implementations must embed UnimplementedHelloServiceServer
+// for forward compatibility
+type HelloServiceServer interface {
+ Echo(context.Context, *EchoRequest) (*EchoResponse, error)
+ mustEmbedUnimplementedHelloServiceServer()
+}
+
+// UnimplementedHelloServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedHelloServiceServer struct {
+}
+
+func (UnimplementedHelloServiceServer) Echo(context.Context, *EchoRequest) (*EchoResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented")
+}
+func (UnimplementedHelloServiceServer) mustEmbedUnimplementedHelloServiceServer() {}
+
+// UnsafeHelloServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to HelloServiceServer will
+// result in compilation errors.
+type UnsafeHelloServiceServer interface {
+ mustEmbedUnimplementedHelloServiceServer()
+}
+
+func RegisterHelloServiceServer(s grpc.ServiceRegistrar, srv HelloServiceServer) {
+ s.RegisterService(&HelloService_ServiceDesc, srv)
+}
+
+func _HelloService_Echo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(EchoRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HelloServiceServer).Echo(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: HelloService_Echo_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HelloServiceServer).Echo(ctx, req.(*EchoRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// HelloService_ServiceDesc is the grpc.ServiceDesc for HelloService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var HelloService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "nuts.hello_service.v1.HelloService",
+ HandlerType: (*HelloServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Echo",
+ Handler: _HelloService_Echo_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "nuts/hello/v1/hello.proto",
+}
diff --git a/network_rpc/demo_test/idl/service/nuts/login/v1/login.pb.go b/network_rpc/demo_test/idl/service/nuts/login/v1/login.pb.go
new file mode 100644
index 0000000..45ff042
--- /dev/null
+++ b/network_rpc/demo_test/idl/service/nuts/login/v1/login.pb.go
@@ -0,0 +1,230 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc (unknown)
+// source: nuts/login/v1/login.proto
+
+package loginv1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type LoginRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
+}
+
+func (x *LoginRequest) Reset() {
+ *x = LoginRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_login_v1_login_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *LoginRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginRequest) ProtoMessage() {}
+
+func (x *LoginRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_login_v1_login_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead.
+func (*LoginRequest) Descriptor() ([]byte, []int) {
+ return file_nuts_login_v1_login_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *LoginRequest) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *LoginRequest) GetPassword() string {
+ if x != nil {
+ return x.Password
+ }
+ return ""
+}
+
+type LoginResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Resp string `protobuf:"bytes,1,opt,name=resp,proto3" json:"resp,omitempty"`
+}
+
+func (x *LoginResponse) Reset() {
+ *x = LoginResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_login_v1_login_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *LoginResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginResponse) ProtoMessage() {}
+
+func (x *LoginResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_login_v1_login_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead.
+func (*LoginResponse) Descriptor() ([]byte, []int) {
+ return file_nuts_login_v1_login_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *LoginResponse) GetResp() string {
+ if x != nil {
+ return x.Resp
+ }
+ return ""
+}
+
+var File_nuts_login_v1_login_proto protoreflect.FileDescriptor
+
+var file_nuts_login_v1_login_proto_rawDesc = []byte{
+ 0x0a, 0x19, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x2f,
+ 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x6e, 0x75, 0x74,
+ 0x73, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x22, 0x3e, 0x0a, 0x0c, 0x4c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a,
+ 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x23, 0x0a, 0x0d, 0x4c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72,
+ 0x65, 0x73, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x32,
+ 0x54, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
+ 0x44, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x6e, 0x75, 0x74, 0x73, 0x2e,
+ 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6e, 0x75, 0x74, 0x73, 0x2e, 0x6c, 0x6f, 0x67,
+ 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x8c, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x75,
+ 0x74, 0x73, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x4c, 0x6f, 0x67,
+ 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x15, 0x6e, 0x75, 0x74, 0x73, 0x2f,
+ 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x76, 0x31,
+ 0xa2, 0x02, 0x03, 0x4e, 0x4c, 0x58, 0xaa, 0x02, 0x0d, 0x4e, 0x75, 0x74, 0x73, 0x2e, 0x4c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, 0x4e, 0x75, 0x74, 0x73, 0x5c, 0x4c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, 0x4e, 0x75, 0x74, 0x73, 0x5c, 0x4c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+ 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4e, 0x75, 0x74, 0x73, 0x3a, 0x3a, 0x4c, 0x6f, 0x67, 0x69, 0x6e,
+ 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_nuts_login_v1_login_proto_rawDescOnce sync.Once
+ file_nuts_login_v1_login_proto_rawDescData = file_nuts_login_v1_login_proto_rawDesc
+)
+
+func file_nuts_login_v1_login_proto_rawDescGZIP() []byte {
+ file_nuts_login_v1_login_proto_rawDescOnce.Do(func() {
+ file_nuts_login_v1_login_proto_rawDescData = protoimpl.X.CompressGZIP(file_nuts_login_v1_login_proto_rawDescData)
+ })
+ return file_nuts_login_v1_login_proto_rawDescData
+}
+
+var file_nuts_login_v1_login_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_nuts_login_v1_login_proto_goTypes = []interface{}{
+ (*LoginRequest)(nil), // 0: nuts.login.v1.LoginRequest
+ (*LoginResponse)(nil), // 1: nuts.login.v1.LoginResponse
+}
+var file_nuts_login_v1_login_proto_depIdxs = []int32{
+ 0, // 0: nuts.login.v1.LoginService.Login:input_type -> nuts.login.v1.LoginRequest
+ 1, // 1: nuts.login.v1.LoginService.Login:output_type -> nuts.login.v1.LoginResponse
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_nuts_login_v1_login_proto_init() }
+func file_nuts_login_v1_login_proto_init() {
+ if File_nuts_login_v1_login_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_nuts_login_v1_login_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*LoginRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_nuts_login_v1_login_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*LoginResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_nuts_login_v1_login_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_nuts_login_v1_login_proto_goTypes,
+ DependencyIndexes: file_nuts_login_v1_login_proto_depIdxs,
+ MessageInfos: file_nuts_login_v1_login_proto_msgTypes,
+ }.Build()
+ File_nuts_login_v1_login_proto = out.File
+ file_nuts_login_v1_login_proto_rawDesc = nil
+ file_nuts_login_v1_login_proto_goTypes = nil
+ file_nuts_login_v1_login_proto_depIdxs = nil
+}
diff --git a/network_rpc/demo_test/idl/service/nuts/login/v1/login_grpc.pb.go b/network_rpc/demo_test/idl/service/nuts/login/v1/login_grpc.pb.go
new file mode 100644
index 0000000..7c99856
--- /dev/null
+++ b/network_rpc/demo_test/idl/service/nuts/login/v1/login_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc (unknown)
+// source: nuts/login/v1/login.proto
+
+package loginv1
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ LoginService_Login_FullMethodName = "/nuts.login.v1.LoginService/Login"
+)
+
+// LoginServiceClient is the client API for LoginService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type LoginServiceClient interface {
+ Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error)
+}
+
+type loginServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewLoginServiceClient(cc grpc.ClientConnInterface) LoginServiceClient {
+ return &loginServiceClient{cc}
+}
+
+func (c *loginServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) {
+ out := new(LoginResponse)
+ err := c.cc.Invoke(ctx, LoginService_Login_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// LoginServiceServer is the server API for LoginService service.
+// All implementations must embed UnimplementedLoginServiceServer
+// for forward compatibility
+type LoginServiceServer interface {
+ Login(context.Context, *LoginRequest) (*LoginResponse, error)
+ mustEmbedUnimplementedLoginServiceServer()
+}
+
+// UnimplementedLoginServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedLoginServiceServer struct {
+}
+
+func (UnimplementedLoginServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Login not implemented")
+}
+func (UnimplementedLoginServiceServer) mustEmbedUnimplementedLoginServiceServer() {}
+
+// UnsafeLoginServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to LoginServiceServer will
+// result in compilation errors.
+type UnsafeLoginServiceServer interface {
+ mustEmbedUnimplementedLoginServiceServer()
+}
+
+func RegisterLoginServiceServer(s grpc.ServiceRegistrar, srv LoginServiceServer) {
+ s.RegisterService(&LoginService_ServiceDesc, srv)
+}
+
+func _LoginService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(LoginRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(LoginServiceServer).Login(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: LoginService_Login_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(LoginServiceServer).Login(ctx, req.(*LoginRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// LoginService_ServiceDesc is the grpc.ServiceDesc for LoginService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var LoginService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "nuts.login.v1.LoginService",
+ HandlerType: (*LoginServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Login",
+ Handler: _LoginService_Login_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "nuts/login/v1/login.proto",
+}
diff --git a/network_rpc/demo_test/idl/service/nuts/register/v1/register.pb.go b/network_rpc/demo_test/idl/service/nuts/register/v1/register.pb.go
new file mode 100644
index 0000000..1892795
--- /dev/null
+++ b/network_rpc/demo_test/idl/service/nuts/register/v1/register.pb.go
@@ -0,0 +1,234 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc (unknown)
+// source: nuts/register/v1/register.proto
+
+package registerv1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type RegisterRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
+}
+
+func (x *RegisterRequest) Reset() {
+ *x = RegisterRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_register_v1_register_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RegisterRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RegisterRequest) ProtoMessage() {}
+
+func (x *RegisterRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_register_v1_register_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead.
+func (*RegisterRequest) Descriptor() ([]byte, []int) {
+ return file_nuts_register_v1_register_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *RegisterRequest) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *RegisterRequest) GetPassword() string {
+ if x != nil {
+ return x.Password
+ }
+ return ""
+}
+
+type RegisterResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Resp string `protobuf:"bytes,1,opt,name=resp,proto3" json:"resp,omitempty"`
+}
+
+func (x *RegisterResponse) Reset() {
+ *x = RegisterResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_register_v1_register_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RegisterResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RegisterResponse) ProtoMessage() {}
+
+func (x *RegisterResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_register_v1_register_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RegisterResponse.ProtoReflect.Descriptor instead.
+func (*RegisterResponse) Descriptor() ([]byte, []int) {
+ return file_nuts_register_v1_register_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *RegisterResponse) GetResp() string {
+ if x != nil {
+ return x.Resp
+ }
+ return ""
+}
+
+var File_nuts_register_v1_register_proto protoreflect.FileDescriptor
+
+var file_nuts_register_v1_register_proto_rawDesc = []byte{
+ 0x0a, 0x1f, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2f,
+ 0x76, 0x31, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x12, 0x10, 0x6e, 0x75, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
+ 0x2e, 0x76, 0x31, 0x22, 0x41, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
+ 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65,
+ 0x73, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x32, 0x66,
+ 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x12, 0x53, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x21, 0x2e,
+ 0x6e, 0x75, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31,
+ 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x22, 0x2e, 0x6e, 0x75, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
+ 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xa4, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e,
+ 0x75, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42,
+ 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
+ 0x5a, 0x1b, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2f,
+ 0x76, 0x31, 0x3b, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03,
+ 0x4e, 0x52, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x75, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x75, 0x74, 0x73, 0x5c, 0x52, 0x65,
+ 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, 0x75, 0x74, 0x73,
+ 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42,
+ 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x75, 0x74, 0x73, 0x3a,
+ 0x3a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_nuts_register_v1_register_proto_rawDescOnce sync.Once
+ file_nuts_register_v1_register_proto_rawDescData = file_nuts_register_v1_register_proto_rawDesc
+)
+
+func file_nuts_register_v1_register_proto_rawDescGZIP() []byte {
+ file_nuts_register_v1_register_proto_rawDescOnce.Do(func() {
+ file_nuts_register_v1_register_proto_rawDescData = protoimpl.X.CompressGZIP(file_nuts_register_v1_register_proto_rawDescData)
+ })
+ return file_nuts_register_v1_register_proto_rawDescData
+}
+
+var file_nuts_register_v1_register_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_nuts_register_v1_register_proto_goTypes = []interface{}{
+ (*RegisterRequest)(nil), // 0: nuts.register.v1.RegisterRequest
+ (*RegisterResponse)(nil), // 1: nuts.register.v1.RegisterResponse
+}
+var file_nuts_register_v1_register_proto_depIdxs = []int32{
+ 0, // 0: nuts.register.v1.RegisterService.Register:input_type -> nuts.register.v1.RegisterRequest
+ 1, // 1: nuts.register.v1.RegisterService.Register:output_type -> nuts.register.v1.RegisterResponse
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_nuts_register_v1_register_proto_init() }
+func file_nuts_register_v1_register_proto_init() {
+ if File_nuts_register_v1_register_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_nuts_register_v1_register_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RegisterRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_nuts_register_v1_register_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RegisterResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_nuts_register_v1_register_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_nuts_register_v1_register_proto_goTypes,
+ DependencyIndexes: file_nuts_register_v1_register_proto_depIdxs,
+ MessageInfos: file_nuts_register_v1_register_proto_msgTypes,
+ }.Build()
+ File_nuts_register_v1_register_proto = out.File
+ file_nuts_register_v1_register_proto_rawDesc = nil
+ file_nuts_register_v1_register_proto_goTypes = nil
+ file_nuts_register_v1_register_proto_depIdxs = nil
+}
diff --git a/network_rpc/demo_test/idl/service/nuts/register/v1/register_grpc.pb.go b/network_rpc/demo_test/idl/service/nuts/register/v1/register_grpc.pb.go
new file mode 100644
index 0000000..b220018
--- /dev/null
+++ b/network_rpc/demo_test/idl/service/nuts/register/v1/register_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc (unknown)
+// source: nuts/register/v1/register.proto
+
+package registerv1
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ RegisterService_Register_FullMethodName = "/nuts.register.v1.RegisterService/Register"
+)
+
+// RegisterServiceClient is the client API for RegisterService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type RegisterServiceClient interface {
+ Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error)
+}
+
+type registerServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewRegisterServiceClient(cc grpc.ClientConnInterface) RegisterServiceClient {
+ return ®isterServiceClient{cc}
+}
+
+func (c *registerServiceClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) {
+ out := new(RegisterResponse)
+ err := c.cc.Invoke(ctx, RegisterService_Register_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// RegisterServiceServer is the server API for RegisterService service.
+// All implementations must embed UnimplementedRegisterServiceServer
+// for forward compatibility
+type RegisterServiceServer interface {
+ Register(context.Context, *RegisterRequest) (*RegisterResponse, error)
+ mustEmbedUnimplementedRegisterServiceServer()
+}
+
+// UnimplementedRegisterServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedRegisterServiceServer struct {
+}
+
+func (UnimplementedRegisterServiceServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Register not implemented")
+}
+func (UnimplementedRegisterServiceServer) mustEmbedUnimplementedRegisterServiceServer() {}
+
+// UnsafeRegisterServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to RegisterServiceServer will
+// result in compilation errors.
+type UnsafeRegisterServiceServer interface {
+ mustEmbedUnimplementedRegisterServiceServer()
+}
+
+func RegisterRegisterServiceServer(s grpc.ServiceRegistrar, srv RegisterServiceServer) {
+ s.RegisterService(&RegisterService_ServiceDesc, srv)
+}
+
+func _RegisterService_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(RegisterRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(RegisterServiceServer).Register(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: RegisterService_Register_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(RegisterServiceServer).Register(ctx, req.(*RegisterRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// RegisterService_ServiceDesc is the grpc.ServiceDesc for RegisterService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var RegisterService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "nuts.register.v1.RegisterService",
+ HandlerType: (*RegisterServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Register",
+ Handler: _RegisterService_Register_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "nuts/register/v1/register.proto",
+}
diff --git a/network_rpc/demo_test/makefile b/network_rpc/demo_test/makefile
new file mode 100644
index 0000000..65feb68
--- /dev/null
+++ b/network_rpc/demo_test/makefile
@@ -0,0 +1,8 @@
+IDL_PATH = $(shell pwd)/idl
+PROTO_PATH := hello login register
+protos = $(word 1,$@)
+
+
+.PHONY:proto
+proto:
+ echo "$(IDL_PATH)/nuts/$(protos)/v1/"
diff --git a/network_rpc/demo_test/pkg/middleware/auth.go b/network_rpc/demo_test/pkg/middleware/auth.go
new file mode 100644
index 0000000..ce5e1c5
--- /dev/null
+++ b/network_rpc/demo_test/pkg/middleware/auth.go
@@ -0,0 +1,7 @@
+package middleware
+
+import "github.com/gin-gonic/gin"
+
+func Auth(ctx *gin.Context) {
+ ctx.Next()
+}
diff --git a/network_rpc/demo_test/pkg/middleware/core.go b/network_rpc/demo_test/pkg/middleware/core.go
new file mode 100644
index 0000000..22b50ab
--- /dev/null
+++ b/network_rpc/demo_test/pkg/middleware/core.go
@@ -0,0 +1,7 @@
+package middleware
+
+import "github.com/gin-gonic/gin"
+
+func Core(ctx *gin.Context) {
+ ctx.Next()
+}
diff --git a/network_rpc/demo_test/pkg/msg/msg.go b/network_rpc/demo_test/pkg/msg/msg.go
new file mode 100644
index 0000000..3dc525d
--- /dev/null
+++ b/network_rpc/demo_test/pkg/msg/msg.go
@@ -0,0 +1,5 @@
+package msg
+
+type Req struct {
+ Value string `json:"msg"`
+}
diff --git a/network_rpc/grpc_01/cacert.csr b/network_rpc/grpc_01/cacert.csr
new file mode 100644
index 0000000..a421c7b
--- /dev/null
+++ b/network_rpc/grpc_01/cacert.csr
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDazCCAlOgAwIBAgIUQEBqb3JqMKCnjSzUO9gxHTwmxnswDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMzExMjYwNjQ4NTRaFw0yMzEy
+MjYwNjQ4NTRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
+HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDDWQG9Q5skSirsqtt0pHaCNv85xwvHogYg5ZTmteBR
+rkh/VAueAeJqB8wYK31MagzShr24X8LQgHZBw9+ikpyyIF9PUPSiXM4dRgK+z+T2
+5ZhZ02To7JWwvYlJ//LGN34wCuTeU87KcFYjgTRvFEv4vmaFn6uPphvS8Wl1ShHt
+1XOeA9WFVzOdX+stdHleSrmZIz+yfIUAdxBn2ilYUePZDxoM6e1O/CbMUFZ1oraA
+ZJwBs8Oc6GQL70UymNqGVw4XMnx6dbisYNPBOicbpgVfrFCEHFNC973ukhEQApxk
+Aq3AVr5gjRydTy9r5U0Sk7EABR7h1iIXqiWVRHGkQECpAgMBAAGjUzBRMB0GA1Ud
+DgQWBBRBs16hw9L8XD1jJJMkpk+gobkb7DAfBgNVHSMEGDAWgBRBs16hw9L8XD1j
+JJMkpk+gobkb7DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBW
+LEHa1u6dvoxzYjpQ527JKOwTeUgfN8wwv0zSXBbyPbCCgKFEum0GEjNSRdnlGaFg
+7WNgfFNYjORm9BewQuE/5+Sjmbv3QHPhEzSh4WGCwB+YtQcF8+wERdC4anW05TW9
+/MfQmAziLwuNr4MsA/ojQsYm7E89RtUdtqrwGShoYQj7nTVtxQ9ebbwICZo9YOX7
+NRhJEWQID40n5C9ZeBylbAh6x8KtICurhV5zVHkiV+p/GCkdk2Nc2PGTVYF59vDh
+oJJaPeICMapIRraFNBSael48t/4ZprudefVTdjjfJjXUpOfG/KmhNA+ltKBiAi6b
+Q2i6EhGLssM4MImARH31
+-----END CERTIFICATE-----
diff --git a/network_rpc/grpc_01/cakey.key b/network_rpc/grpc_01/cakey.key
new file mode 100644
index 0000000..073b839
--- /dev/null
+++ b/network_rpc/grpc_01/cakey.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDDWQG9Q5skSirs
+qtt0pHaCNv85xwvHogYg5ZTmteBRrkh/VAueAeJqB8wYK31MagzShr24X8LQgHZB
+w9+ikpyyIF9PUPSiXM4dRgK+z+T25ZhZ02To7JWwvYlJ//LGN34wCuTeU87KcFYj
+gTRvFEv4vmaFn6uPphvS8Wl1ShHt1XOeA9WFVzOdX+stdHleSrmZIz+yfIUAdxBn
+2ilYUePZDxoM6e1O/CbMUFZ1oraAZJwBs8Oc6GQL70UymNqGVw4XMnx6dbisYNPB
+OicbpgVfrFCEHFNC973ukhEQApxkAq3AVr5gjRydTy9r5U0Sk7EABR7h1iIXqiWV
+RHGkQECpAgMBAAECggEAV246zQ65HSDk3VALMMV7FQSwbpebuhnWTFr0rd2xLF2o
+rPRczrdhMruSqS6twcmlO4R63U5ezxrv0rdsHEMqRr8eaU1+cDzBM3DmQaiifa58
+5ZcrjuR0isoJ7EjVy8mCfNYjYS55Wzm0E+f8I8sdxZLSJ/QywPRDd8H8xTYFmEAs
+bvQ2TZ5wLTZHlZfgJQL+yDYbxd8J+qA3Qehv2r/PyvXuz+Oz8w5avoQ95ZKIUmTS
+aJd8HfQXUcNcmd29DrmBW8BAcfNchS9aZ45E7EF7b2LO7iYy/B1cmfY2Bg9tV5R5
+Q9dpZPsweFqFhicSb9Yz+t/AcgN5mTE+5cksq00dUQKBgQDjPIvZ6QJH5y4IPnse
+X1FGilJoXxYwFZ4Tm7QAvPRWSqERnipoX6trI+oQo5EsiR8CWo3KEEMaX0bYwxGb
+hSTHs2urf2bs+pN0fbssx7pGJ+5NDHDy2i1FTM9ny+dAAdra4XerGUaxKPvjILXj
+paPQJ2a6wUY4vYXHXOULn0LogwKBgQDcEx+c6rwQ7fXwGI6wK5kHJ+imfGUuU5hr
+1GzxLQQFEPsOfbzeEpcHBbl/BfoY6sONCa9FtkHiz7hAnK6rbuX1oWFCa9IrT2Pg
+KdSt69THRkfJKIRfGPJ4/KSsTQgGi/Zz4Docj6y68zMYD7okRunpAYBftooD1+9x
+UyYE0vJyYwKBgQC5xypfQYzH1E1iGBL4Rd1g2n19LyAot8PBLC8B23m3gtQkXzc0
+leLDeV1HtTJfQsvDVN1PMfRqfzKgzPp8N2JWkm2YjFRNsp8TQifg+HlmGgdNnrpJ
+Ee6pFZ8LsTyiq+GNyX/YtpWBCYzFqFyMfUNsTopCbPlIMkpJL71ivxYomQKBgCCD
+Kr5x50rQ/O51kk7wgfEOsk42PnRzoSb9AQM4VUmyUoS3irl8IZfF/ruHVIVt2Wny
+rlQsMtuhOGVDQILPJWX+a3H2n9wKJIUvaN4w4wR1m5FaTQQHmXrKSEG0N6VP9B72
+V1900l3kI/5ABI3rdA8aS67YNteOhS9Gy20XBP5lAoGAAp3bnC8MzktUx4kJIAN7
+tlqT7+xMrVID2ysg8Tmj3JqsqRFYZZpNciRmo3XF1dZ9z/lrnGMh30hohbLIPwVd
+DNQXdKgIrK1W+PaQ5Cbia8x67U2rPIFWsgat0SrNc8R0ERdnFV/B5hL4m01xboPr
+QJsbaqs25efs/bBYVdmZVxw=
+-----END PRIVATE KEY-----
diff --git a/network_rpc/grpc_01/client/main.go b/network_rpc/grpc_01/client/main.go
new file mode 100644
index 0000000..0f5de53
--- /dev/null
+++ b/network_rpc/grpc_01/client/main.go
@@ -0,0 +1,54 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ service "grpct/proto"
+ "time"
+
+ "google.golang.org/grpc/credentials"
+
+ "google.golang.org/grpc"
+)
+
+type ClientTokenAuth struct{}
+
+func (receiver ClientTokenAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
+ return map[string]string{
+ "appid": "panliping",
+ "appkey": "iloveyou",
+ }, nil
+}
+
+func (receiver ClientTokenAuth) RequireTransportSecurity() bool {
+ return false
+
+}
+
+func main() {
+ cert, _ := credentials.NewClientTLSFromFile("D:\\JetBrains\\GoLand_workspace\\com.github\\nuts\\go-study\\network_rpc\\grpc_01\\ca.crt", "*.nuts.com")
+ //创建链接 禁用安全传输,没有加密和验证
+
+ //使用token认证
+ //conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithTransportCredentials(insecure.NewCredentials()),
+ // grpc.WithPerRPCCredentials(new(ClientTokenAuth)))
+ conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithTransportCredentials(cert))
+ if err != nil {
+ fmt.Printf("conn create failed! err:%s\n", err)
+ return
+ }
+ defer conn.Close()
+ // 创建一个客户端
+ start := time.Now()
+ client := service.NewSayHelloClient(conn)
+ //调用方法,获取响应
+ resp, err := client.SayHi(context.Background(), &service.Request{Name: "潘丽萍"})
+ if err != nil {
+ fmt.Printf("resp failed! err:%s\n", err)
+ return
+ }
+ sub := time.Now().Sub(start)
+ //打印响应
+ fmt.Println(resp.GetAnswer())
+ fmt.Println(sub)
+}
diff --git a/network_rpc/grpc_01/go.mod b/network_rpc/grpc_01/go.mod
new file mode 100644
index 0000000..c53fe33
--- /dev/null
+++ b/network_rpc/grpc_01/go.mod
@@ -0,0 +1,16 @@
+module grpct
+
+go 1.18
+
+require (
+ google.golang.org/grpc v1.59.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ golang.org/x/net v0.14.0 // indirect
+ golang.org/x/sys v0.11.0 // indirect
+ golang.org/x/text v0.12.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
+)
diff --git a/network_rpc/grpc_01/go.sum b/network_rpc/grpc_01/go.sum
new file mode 100644
index 0000000..1b1e8ef
--- /dev/null
+++ b/network_rpc/grpc_01/go.sum
@@ -0,0 +1,20 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
+google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
+google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/network_rpc/grpc_01/openssl.cfg b/network_rpc/grpc_01/openssl.cfg
new file mode 100644
index 0000000..029a6cb
--- /dev/null
+++ b/network_rpc/grpc_01/openssl.cfg
@@ -0,0 +1,393 @@
+#
+# OpenSSL example configuration file.
+# See doc/man5/config.pod for more info.
+#
+# This is mostly being used for generation of certificate requests,
+# but may be used for auto loading of providers
+
+# Note that you can include other files from the main configuration
+# file using the .include directive.
+#.include filename
+
+# This definition stops the following lines choking if HOME isn't
+# defined.
+HOME = .
+
+ # Use this in order to automatically load providers.
+openssl_conf = openssl_init
+
+# Comment out the next line to ignore configuration errors
+config_diagnostics = 1
+
+# Extra OBJECT IDENTIFIER info:
+# oid_file = $ENV::HOME/.oid
+oid_section = new_oids
+
+# To use this configuration file with the "-extfile" option of the
+# "openssl x509" utility, name here the section containing the
+# X.509v3 extensions to use:
+# extensions =
+# (Alternatively, use a configuration file that has only
+# X.509v3 extensions in its main [= default] section.)
+
+[ new_oids ]
+# We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
+# Add a simple OID like this:
+# testoid1=1.2.3.4
+# Or use config file substitution like this:
+# testoid2=${testoid1}.5.6
+
+# Policies used by the TSA examples.
+tsa_policy1 = 1.2.3.4.1
+tsa_policy2 = 1.2.3.4.5.6
+tsa_policy3 = 1.2.3.4.5.7
+
+# For FIPS
+# Optionally include a file that is generated by the OpenSSL fipsinstall
+# application. This file contains configuration data required by the OpenSSL
+# fips provider. It contains a named section e.g. [fips_sect] which is
+# referenced from the [provider_sect] below.
+# Refer to the OpenSSL security policy for more information.
+# .include fipsmodule.cnf
+
+[openssl_init]
+providers = provider_sect
+
+# List of providers to load
+[provider_sect]
+default = default_sect
+# The fips section name should match the section name inside the
+# included fipsmodule.cnf.
+# fips = fips_sect
+
+# If no providers are activated explicitly, the default one is activated implicitly.
+# See man 7 OSSL_PROVIDER-default for more details.
+#
+# If you add a section explicitly activating any other provider(s), you most
+# probably need to explicitly activate the default provider, otherwise it
+# becomes unavailable in openssl. As a consequence applications depending on
+# OpenSSL may not work correctly which could lead to significant system
+# problems including inability to remotely access the system.
+[default_sect]
+# activate = 1
+
+
+####################################################################
+[ ca ]
+default_ca = CA_default # The default ca section
+
+####################################################################
+[ CA_default ]
+
+dir = ./demoCA # Where everything is kept
+certs = $dir/certs # Where the issued certs are kept
+crl_dir = $dir/crl # Where the issued crl are kept
+database = $dir/index.txt # database index file.
+#unique_subject = no # Set to 'no' to allow creation of
+ # several certs with same subject.
+new_certs_dir = $dir/newcerts # default place for new certs.
+
+certificate = $dir/cacert.pem # The CA certificate
+serial = $dir/serial # The current serial number
+crlnumber = $dir/crlnumber # the current crl number
+ # must be commented out to leave a V1 CRL
+crl = $dir/crl.pem # The current CRL
+private_key = $dir/private/cakey.pem# The private key
+
+x509_extensions = usr_cert # The extensions to add to the cert
+
+# Comment out the following two lines for the "traditional"
+# (and highly broken) format.
+name_opt = ca_default # Subject Name options
+cert_opt = ca_default # Certificate field options
+
+# Extension copying option: use with caution.
+copy_extensions = copy
+
+# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
+# so this is commented out by default to leave a V1 CRL.
+# crlnumber must also be commented out to leave a V1 CRL.
+# crl_extensions = crl_ext
+
+default_days = 365 # how long to certify for
+default_crl_days= 30 # how long before next CRL
+default_md = default # use public key default MD
+preserve = no # keep passed DN ordering
+
+# A few difference way of specifying how similar the request should look
+# For type CA, the listed attributes must be the same, and the optional
+# and supplied fields are just that :-)
+policy = policy_match
+
+# For the CA policy
+[ policy_match ]
+countryName = match
+stateOrProvinceName = match
+organizationName = match
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+# For the 'anything' policy
+# At this point in time, you must list all acceptable 'object'
+# types.
+[ policy_anything ]
+countryName = optional
+stateOrProvinceName = optional
+localityName = optional
+organizationName = optional
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+####################################################################
+[ req ]
+default_bits = 2048
+default_keyfile = privkey.pem
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+x509_extensions = v3_ca # The extensions to add to the self signed cert
+
+# Passwords for private keys if not present they will be prompted for
+# input_password = secret
+# output_password = secret
+
+# This sets a mask for permitted string types. There are several options.
+# default: PrintableString, T61String, BMPString.
+# pkix : PrintableString, BMPString (PKIX recommendation before 2004)
+# utf8only: only UTF8Strings (PKIX recommendation after 2004).
+# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
+# MASK:XXXX a literal mask value.
+# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
+string_mask = utf8only
+
+req_extensions = v3_req # The extensions to add to a certificate request
+
+[ req_distinguished_name ]
+countryName = Country Name (2 letter code)
+countryName_default = AU
+countryName_min = 2
+countryName_max = 2
+
+stateOrProvinceName = State or Province Name (full name)
+stateOrProvinceName_default = Some-State
+
+localityName = Locality Name (eg, city)
+
+0.organizationName = Organization Name (eg, company)
+0.organizationName_default = Internet Widgits Pty Ltd
+
+# we can do this but it is not needed normally :-)
+#1.organizationName = Second Organization Name (eg, company)
+#1.organizationName_default = World Wide Web Pty Ltd
+
+organizationalUnitName = Organizational Unit Name (eg, section)
+#organizationalUnitName_default =
+
+commonName = Common Name (e.g. server FQDN or YOUR name)
+commonName_max = 64
+
+emailAddress = Email Address
+emailAddress_max = 64
+
+# SET-ex3 = SET extension number 3
+
+[ req_attributes ]
+challengePassword = A challenge password
+challengePassword_min = 4
+challengePassword_max = 20
+
+unstructuredName = An optional company name
+
+[ usr_cert ]
+
+# These extensions are added when 'ca' signs a request.
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+# This is required for TSA certificates.
+# extendedKeyUsage = critical,timeStamping
+
+[ v3_req ]
+
+# Extensions to add to a certificate request
+
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+subjectAltName = @alt_names
+[ alt_names]
+DNS.1=*.nuts.com
+
+[ v3_ca ]
+
+
+# Extensions for a typical CA
+
+
+# PKIX recommendation.
+
+subjectKeyIdentifier=hash
+
+authorityKeyIdentifier=keyid:always,issuer
+
+basicConstraints = critical,CA:true
+
+# Key usage: this is typical for a CA certificate. However since it will
+# prevent it being used as an test self-signed certificate it is best
+# left out by default.
+# keyUsage = cRLSign, keyCertSign
+
+# Include email address in subject alt name: another PKIX recommendation
+# subjectAltName=email:copy
+# Copy issuer details
+# issuerAltName=issuer:copy
+
+# DER hex encoding of an extension: beware experts only!
+# obj=DER:02:03
+# Where 'obj' is a standard or added object
+# You can even override a supported extension:
+# basicConstraints= critical, DER:30:03:01:01:FF
+
+[ crl_ext ]
+
+# CRL extensions.
+# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
+
+# issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+[ proxy_cert_ext ]
+# These extensions should be added when creating a proxy certificate
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+# This really needs to be in place for it to be a proxy certificate.
+proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
+
+####################################################################
+[ tsa ]
+
+default_tsa = tsa_config1 # the default TSA section
+
+[ tsa_config1 ]
+
+# These are used by the TSA reply generation only.
+dir = ./demoCA # TSA root directory
+serial = $dir/tsaserial # The current serial number (mandatory)
+crypto_device = builtin # OpenSSL engine to use for signing
+signer_cert = $dir/tsacert.pem # The TSA signing certificate
+ # (optional)
+certs = $dir/cacert.pem # Certificate chain to include in reply
+ # (optional)
+signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
+signer_digest = sha256 # Signing digest to use. (Optional)
+default_policy = tsa_policy1 # Policy if request did not specify it
+ # (optional)
+other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
+digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory)
+accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
+clock_precision_digits = 0 # number of digits after dot. (optional)
+ordering = yes # Is ordering defined for timestamps?
+ # (optional, default: no)
+tsa_name = yes # Must the TSA name be included in the reply?
+ # (optional, default: no)
+ess_cert_id_chain = no # Must the ESS cert id chain be included?
+ # (optional, default: no)
+ess_cert_id_alg = sha1 # algorithm to compute certificate
+ # identifier (optional, default: sha1)
+
+[insta] # CMP using Insta Demo CA
+# Message transfer
+server = pki.certificate.fi:8700
+# proxy = # set this as far as needed, e.g., http://192.168.1.1:8080
+# tls_use = 0
+path = pkix/
+
+# Server authentication
+recipient = "/C=FI/O=Insta Demo/CN=Insta Demo CA" # or set srvcert or issuer
+ignore_keyusage = 1 # potentially needed quirk
+unprotected_errors = 1 # potentially needed quirk
+extracertsout = insta.extracerts.pem
+
+# Client authentication
+ref = 3078 # user identification
+secret = pass:insta # can be used for both client and server side
+
+# Generic message options
+cmd = ir # default operation, can be overridden on cmd line with, e.g., kur
+
+# Certificate enrollment
+subject = "/CN=openssl-cmp-test"
+newkey = insta.priv.pem
+out_trusted = insta.ca.crt
+certout = insta.cert.pem
+
+[pbm] # Password-based protection for Insta CA
+# Server and client authentication
+ref = $insta::ref # 3078
+secret = $insta::secret # pass:insta
+
+[signature] # Signature-based protection for Insta CA
+# Server authentication
+trusted = insta.ca.crt # does not include keyUsage digitalSignature
+
+# Client authentication
+secret = # disable PBM
+key = $insta::newkey # insta.priv.pem
+cert = $insta::certout # insta.cert.pem
+
+[ir]
+cmd = ir
+
+[cr]
+cmd = cr
+
+[kur]
+# Certificate update
+cmd = kur
+oldcert = $insta::certout # insta.cert.pem
+
+[rr]
+# Certificate revocation
+cmd = rr
+oldcert = $insta::certout # insta.cert.pem
diff --git a/network_rpc/grpc_01/openssl.md b/network_rpc/grpc_01/openssl.md
new file mode 100644
index 0000000..4e29cc8
--- /dev/null
+++ b/network_rpc/grpc_01/openssl.md
@@ -0,0 +1,18 @@
+> 复制openssl的配置文件到项目所在目录下
+> 找到[ CA_default ] 去掉copy_extension = copy的注释
+> 找到[ req ] 打开req_extensions = v3_req 的注释
+> 找到[ v3_req ] 添加subjectAltName = @alt_names
+> 添加新的标签 [ alt_names ] 并添加标签字段 DNS.1 = *.nuts.com
+
+## 生成私钥和证书
+```shell
+openssl genpkey -algorithm RSA -out test.key #生成私钥
+```
+```shell
+openssl req -new -nodes -key test.key -out test.csr -days 365 -subj "/C=cn/OU=myorg/O=mycomp/CN=myname" -config ./openssl.cfg -extensions v3_req #根据私钥生成证书请求文件
+```
+```shell
+openssl x509 -req -days 365 -in test.csr -out test.pem -CA server.crt -CAkey server.key -CAcreateserial -extfile ./openssl.cfg -extensions v3_req #生成SAN证书 pem
+```
+
+
diff --git a/network_rpc/grpc_01/proto.md b/network_rpc/grpc_01/proto.md
new file mode 100644
index 0000000..b858997
--- /dev/null
+++ b/network_rpc/grpc_01/proto.md
@@ -0,0 +1,46 @@
+>1、syntax
+> 声明proto文件版本
+
+>2、option go_package="./;service"
+> 声明生成go代码
+
+>3、message
+> protobuf中定义一个消息类形式通过该关键字定义,相当于go中的结构体,定义对象。消息就是传输数据的格式,在消息中承载数据对应每一个字段,每个字段都有名和类型。
+
+>4、字段规则
+> >required:消息体中必填字段,不设置会导致编码异常,再protobuf2中使用,再protobuf3中被删去
+> >optional:消息体可选字段。protobuf3中没有了required、optional等关键字说明,都默认为optional
+> >repeated:消息体中可重复字段,重复的值的顺序会被保留在go中,重复的会被定义为切片
+> 消息号
+> >在消息体中,每个字段都必须有一个唯一标识的标识号,是[1,2^29-1]范围中的一个整数
+> 嵌套消息
+> >可以在其他消息类型中定义,使用消息类型,如下示例
+
+```protobuf
+syntax = "proto3";
+message PersonInfo{
+ message Person{
+ string name = 1;
+ int32 height = 2;
+ repeated int32 weight = 3;
+ }
+ repeated Person info = 1;
+}
+```
+
+>5、服务定义
+> 如果想要将消息类型用在rpc系统中,可以在.proto文件中定义一个rpc服务接口,protocol buffer编译器会根据所选择的生成不同语言服务接口代码及存根
+
+```protobuf
+syntax="proto3";
+service ServiceSearch{
+ rpc Search(SearchRequest)returns(SearchResponse);
+
+}
+```
+>上述定义了一个rpc服务,该方法接受SearchRequest为参数返回SearchResponse
+
+
+>两种认证方式
+> > TLS
+> > token
\ No newline at end of file
diff --git a/network_rpc/grpc_01/proto/hello.pb.go b/network_rpc/grpc_01/proto/hello.pb.go
new file mode 100644
index 0000000..51356c6
--- /dev/null
+++ b/network_rpc/grpc_01/proto/hello.pb.go
@@ -0,0 +1,227 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.24.0
+// source: hello.proto
+
+package service
+
+import (
+ reflect "reflect"
+ sync "sync"
+
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Request struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ Age int32 `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
+ Hobbies []string `protobuf:"bytes,3,rep,name=hobbies,proto3" json:"hobbies,omitempty"`
+}
+
+func (x *Request) Reset() {
+ *x = Request{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_hello_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Request) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Request) ProtoMessage() {}
+
+func (x *Request) ProtoReflect() protoreflect.Message {
+ mi := &file_hello_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Request.ProtoReflect.Descriptor instead.
+func (*Request) Descriptor() ([]byte, []int) {
+ return file_hello_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Request) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *Request) GetAge() int32 {
+ if x != nil {
+ return x.Age
+ }
+ return 0
+}
+
+func (x *Request) GetHobbies() []string {
+ if x != nil {
+ return x.Hobbies
+ }
+ return nil
+}
+
+type Response struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Answer string `protobuf:"bytes,1,opt,name=answer,proto3" json:"answer,omitempty"`
+}
+
+func (x *Response) Reset() {
+ *x = Response{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_hello_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Response) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Response) ProtoMessage() {}
+
+func (x *Response) ProtoReflect() protoreflect.Message {
+ mi := &file_hello_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Response.ProtoReflect.Descriptor instead.
+func (*Response) Descriptor() ([]byte, []int) {
+ return file_hello_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Response) GetAnswer() string {
+ if x != nil {
+ return x.Answer
+ }
+ return ""
+}
+
+var File_hello_proto protoreflect.FileDescriptor
+
+var file_hello_proto_rawDesc = []byte{
+ 0x0a, 0x0b, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x49, 0x0a,
+ 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03,
+ 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x18,
+ 0x0a, 0x07, 0x68, 0x6f, 0x62, 0x62, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
+ 0x07, 0x68, 0x6f, 0x62, 0x62, 0x69, 0x65, 0x73, 0x22, 0x22, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x32, 0x28, 0x0a, 0x08,
+ 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x1c, 0x0a, 0x05, 0x53, 0x61, 0x79, 0x48,
+ 0x69, 0x12, 0x08, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x09, 0x2e, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x2f, 0x3b, 0x73, 0x65, 0x72,
+ 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_hello_proto_rawDescOnce sync.Once
+ file_hello_proto_rawDescData = file_hello_proto_rawDesc
+)
+
+func file_hello_proto_rawDescGZIP() []byte {
+ file_hello_proto_rawDescOnce.Do(func() {
+ file_hello_proto_rawDescData = protoimpl.X.CompressGZIP(file_hello_proto_rawDescData)
+ })
+ return file_hello_proto_rawDescData
+}
+
+var file_hello_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_hello_proto_goTypes = []interface{}{
+ (*Request)(nil), // 0: Request
+ (*Response)(nil), // 1: Response
+}
+var file_hello_proto_depIdxs = []int32{
+ 0, // 0: SayHello.SayHi:input_type -> Request
+ 1, // 1: SayHello.SayHi:output_type -> Response
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_hello_proto_init() }
+func file_hello_proto_init() {
+ if File_hello_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_hello_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Request); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_hello_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Response); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_hello_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_hello_proto_goTypes,
+ DependencyIndexes: file_hello_proto_depIdxs,
+ MessageInfos: file_hello_proto_msgTypes,
+ }.Build()
+ File_hello_proto = out.File
+ file_hello_proto_rawDesc = nil
+ file_hello_proto_goTypes = nil
+ file_hello_proto_depIdxs = nil
+}
diff --git a/network_rpc/grpc_01/proto/hello.proto b/network_rpc/grpc_01/proto/hello.proto
new file mode 100644
index 0000000..9efa924
--- /dev/null
+++ b/network_rpc/grpc_01/proto/hello.proto
@@ -0,0 +1,16 @@
+syntax= "proto3";
+option go_package="./;service";
+
+message Request{
+ string name = 1;
+ int32 age =2;
+ repeated string hobbies = 3;
+}
+message Response{
+ string answer = 1;
+
+}
+
+service SayHello{
+ rpc SayHi(Request)returns (Response);
+}
\ No newline at end of file
diff --git a/network_rpc/grpc_01/proto/hello_grpc.pb.go b/network_rpc/grpc_01/proto/hello_grpc.pb.go
new file mode 100644
index 0000000..43f3d8d
--- /dev/null
+++ b/network_rpc/grpc_01/proto/hello_grpc.pb.go
@@ -0,0 +1,110 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.24.0
+// source: hello.proto
+
+package service
+
+import (
+ context "context"
+
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ SayHello_SayHi_FullMethodName = "/SayHello/SayHi"
+)
+
+// SayHelloClient is the client API for SayHello service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SayHelloClient interface {
+ SayHi(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
+}
+
+type sayHelloClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewSayHelloClient(cc grpc.ClientConnInterface) SayHelloClient {
+ return &sayHelloClient{cc}
+}
+
+func (c *sayHelloClient) SayHi(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) {
+ out := new(Response)
+ err := c.cc.Invoke(ctx, SayHello_SayHi_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// SayHelloServer is the server API for SayHello service.
+// All implementations must embed UnimplementedSayHelloServer
+// for forward compatibility
+type SayHelloServer interface {
+ SayHi(context.Context, *Request) (*Response, error)
+ mustEmbedUnimplementedSayHelloServer()
+}
+
+// UnimplementedSayHelloServer must be embedded to have forward compatible implementations.
+type UnimplementedSayHelloServer struct {
+}
+
+func (UnimplementedSayHelloServer) SayHi(context.Context, *Request) (*Response, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SayHi not implemented")
+}
+func (UnimplementedSayHelloServer) mustEmbedUnimplementedSayHelloServer() {}
+
+// UnsafeSayHelloServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SayHelloServer will
+// result in compilation errors.
+type UnsafeSayHelloServer interface {
+ mustEmbedUnimplementedSayHelloServer()
+}
+
+func RegisterSayHelloServer(s grpc.ServiceRegistrar, srv SayHelloServer) {
+ s.RegisterService(&SayHello_ServiceDesc, srv)
+}
+
+func _SayHello_SayHi_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(Request)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(SayHelloServer).SayHi(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: SayHello_SayHi_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(SayHelloServer).SayHi(ctx, req.(*Request))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// SayHello_ServiceDesc is the grpc.ServiceDesc for SayHello service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SayHello_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "SayHello",
+ HandlerType: (*SayHelloServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "SayHi",
+ Handler: _SayHello_SayHi_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "hello.proto",
+}
diff --git a/network_rpc/grpc_01/server/main.go b/network_rpc/grpc_01/server/main.go
new file mode 100644
index 0000000..c08c197
--- /dev/null
+++ b/network_rpc/grpc_01/server/main.go
@@ -0,0 +1,72 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ service "grpct/proto"
+ "net"
+
+ "google.golang.org/grpc/credentials"
+
+ "google.golang.org/grpc"
+)
+
+// Serve 我们自己定义的服务
+type Serve struct {
+ service.UnimplementedSayHelloServer
+}
+
+// token 认证
+// SayHi 实现接口,完成我们自己的业务
+//func (s *Serve) SayHi(ctx context.Context, request *service.Request) (*service.Response, error) {
+// mt, ok := metadata.FromIncomingContext(ctx)
+// if !ok {
+// fmt.Printf("get metadata failed!\n")
+// return nil, nil
+// }
+// // 获取元数据token相关数据,和数据库做对比
+// var appid string
+// var appkey string
+// if v, ok := mt["appid"]; ok {
+// appid = v[0]
+// }
+// if v, ok := mt["appkey"]; ok {
+// appkey = v[0]
+// }
+// if appid == "panliping" && appkey == "iloveyou" {
+// return &service.Response{Answer: "HI!" + request.Name}, nil
+// }
+// return nil, errors.New("token data wrong")
+//}
+
+func (s *Serve) SayHi(ctx context.Context, request *service.Request) (*service.Response, error) {
+ return &service.Response{
+ Answer: "hi!" + request.Name,
+ }, nil
+}
+func main() {
+
+ // tls认证
+ cert, err := credentials.NewServerTLSFromFile("D:\\JetBrains\\GoLand_workspace\\com.github\\nuts\\go-study\\network_rpc\\grpc_01\\ca.crt", "D:\\JetBrains\\GoLand_workspace\\com.github\\nuts\\go-study\\network_rpc\\grpc_01\\server.keycd ")
+ if err != nil {
+ fmt.Println("certificate generate failed")
+ return
+ }
+ // 监听端口
+ listen, err := net.Listen("tcp", ":8080")
+ if err != nil {
+ return
+ }
+ // 延迟关闭连接
+ defer listen.Close()
+ //创建一个grpc服务
+ grpcServer := grpc.NewServer(grpc.Creds(cert))
+ //在grpc服务中注册我们自己编写的服务
+ service.RegisterSayHelloServer(grpcServer, &Serve{})
+ //启动服务
+ err = grpcServer.Serve(listen)
+ if err != nil {
+ fmt.Printf("start server failed! err:%s", err)
+ return
+ }
+}
diff --git a/network_rpc/grpc_change/go.mod b/network_rpc/grpc_change/go.mod
new file mode 100644
index 0000000..bf79f96
--- /dev/null
+++ b/network_rpc/grpc_change/go.mod
@@ -0,0 +1,16 @@
+module github.com/grpc_change
+
+go 1.21
+
+require (
+ google.golang.org/grpc v1.60.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ golang.org/x/net v0.16.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.13.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect
+)
diff --git a/network_rpc/grpc_change/go.sum b/network_rpc/grpc_change/go.sum
new file mode 100644
index 0000000..d3a61a1
--- /dev/null
+++ b/network_rpc/grpc_change/go.sum
@@ -0,0 +1,21 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos=
+golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY=
+google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k=
+google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/network_rpc/grpc_change/proto/search.proto b/network_rpc/grpc_change/proto/search.proto
new file mode 100644
index 0000000..f7229df
--- /dev/null
+++ b/network_rpc/grpc_change/proto/search.proto
@@ -0,0 +1,13 @@
+syntax="proto3";
+option go_package="./;ser";
+
+
+message req{
+ string request=1;
+}
+message resp{
+ string response=1;
+}
+service SearchV{
+ rpc Search(req)returns(resp);
+}
\ No newline at end of file
diff --git a/network_rpc/grpc_change/readme.md b/network_rpc/grpc_change/readme.md
new file mode 100644
index 0000000..499ae6a
--- /dev/null
+++ b/network_rpc/grpc_change/readme.md
@@ -0,0 +1,4 @@
+### proto-go插件
+- proto-gen-go
+- proto-gen-go-grpc
+- protoc --go_out=./service --go-grpc_out=./service proto/*.proto
\ No newline at end of file
diff --git a/network_rpc/grpc_change/service/search.pb.go b/network_rpc/grpc_change/service/search.pb.go
new file mode 100644
index 0000000..1fecaab
--- /dev/null
+++ b/network_rpc/grpc_change/service/search.pb.go
@@ -0,0 +1,207 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.24.0
+// source: proto/search.proto
+
+package ser
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Req struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Request string `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
+}
+
+func (x *Req) Reset() {
+ *x = Req{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_search_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Req) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Req) ProtoMessage() {}
+
+func (x *Req) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_search_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Req.ProtoReflect.Descriptor instead.
+func (*Req) Descriptor() ([]byte, []int) {
+ return file_proto_search_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Req) GetRequest() string {
+ if x != nil {
+ return x.Request
+ }
+ return ""
+}
+
+type Resp struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Response string `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
+}
+
+func (x *Resp) Reset() {
+ *x = Resp{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_search_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Resp) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Resp) ProtoMessage() {}
+
+func (x *Resp) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_search_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Resp.ProtoReflect.Descriptor instead.
+func (*Resp) Descriptor() ([]byte, []int) {
+ return file_proto_search_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Resp) GetResponse() string {
+ if x != nil {
+ return x.Response
+ }
+ return ""
+}
+
+var File_proto_search_proto protoreflect.FileDescriptor
+
+var file_proto_search_proto_rawDesc = []byte{
+ 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1f, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x72,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x70, 0x12, 0x1a, 0x0a,
+ 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x20, 0x0a, 0x07, 0x53, 0x65, 0x61,
+ 0x72, 0x63, 0x68, 0x56, 0x12, 0x15, 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x04,
+ 0x2e, 0x72, 0x65, 0x71, 0x1a, 0x05, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x42, 0x08, 0x5a, 0x06, 0x2e,
+ 0x2f, 0x3b, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_proto_search_proto_rawDescOnce sync.Once
+ file_proto_search_proto_rawDescData = file_proto_search_proto_rawDesc
+)
+
+func file_proto_search_proto_rawDescGZIP() []byte {
+ file_proto_search_proto_rawDescOnce.Do(func() {
+ file_proto_search_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_search_proto_rawDescData)
+ })
+ return file_proto_search_proto_rawDescData
+}
+
+var file_proto_search_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_proto_search_proto_goTypes = []interface{}{
+ (*Req)(nil), // 0: req
+ (*Resp)(nil), // 1: resp
+}
+var file_proto_search_proto_depIdxs = []int32{
+ 0, // 0: SearchV.Search:input_type -> req
+ 1, // 1: SearchV.Search:output_type -> resp
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_proto_search_proto_init() }
+func file_proto_search_proto_init() {
+ if File_proto_search_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_proto_search_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Req); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_search_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Resp); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_proto_search_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_proto_search_proto_goTypes,
+ DependencyIndexes: file_proto_search_proto_depIdxs,
+ MessageInfos: file_proto_search_proto_msgTypes,
+ }.Build()
+ File_proto_search_proto = out.File
+ file_proto_search_proto_rawDesc = nil
+ file_proto_search_proto_goTypes = nil
+ file_proto_search_proto_depIdxs = nil
+}
diff --git a/network_rpc/grpc_change/service/search_grpc.pb.go b/network_rpc/grpc_change/service/search_grpc.pb.go
new file mode 100644
index 0000000..240b3cb
--- /dev/null
+++ b/network_rpc/grpc_change/service/search_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.24.0
+// source: proto/search.proto
+
+package ser
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ SearchV_Search_FullMethodName = "/SearchV/Search"
+)
+
+// SearchVClient is the client API for SearchV service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SearchVClient interface {
+ Search(ctx context.Context, in *Req, opts ...grpc.CallOption) (*Resp, error)
+}
+
+type searchVClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewSearchVClient(cc grpc.ClientConnInterface) SearchVClient {
+ return &searchVClient{cc}
+}
+
+func (c *searchVClient) Search(ctx context.Context, in *Req, opts ...grpc.CallOption) (*Resp, error) {
+ out := new(Resp)
+ err := c.cc.Invoke(ctx, SearchV_Search_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// SearchVServer is the server API for SearchV service.
+// All implementations must embed UnimplementedSearchVServer
+// for forward compatibility
+type SearchVServer interface {
+ Search(context.Context, *Req) (*Resp, error)
+ mustEmbedUnimplementedSearchVServer()
+}
+
+// UnimplementedSearchVServer must be embedded to have forward compatible implementations.
+type UnimplementedSearchVServer struct {
+}
+
+func (UnimplementedSearchVServer) Search(context.Context, *Req) (*Resp, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Search not implemented")
+}
+func (UnimplementedSearchVServer) mustEmbedUnimplementedSearchVServer() {}
+
+// UnsafeSearchVServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SearchVServer will
+// result in compilation errors.
+type UnsafeSearchVServer interface {
+ mustEmbedUnimplementedSearchVServer()
+}
+
+func RegisterSearchVServer(s grpc.ServiceRegistrar, srv SearchVServer) {
+ s.RegisterService(&SearchV_ServiceDesc, srv)
+}
+
+func _SearchV_Search_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(Req)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(SearchVServer).Search(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: SearchV_Search_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(SearchVServer).Search(ctx, req.(*Req))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// SearchV_ServiceDesc is the grpc.ServiceDesc for SearchV service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SearchV_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "SearchV",
+ HandlerType: (*SearchVServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Search",
+ Handler: _SearchV_Search_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "proto/search.proto",
+}
diff --git a/network_rpc/grpc_gateway/client/main.go b/network_rpc/grpc_gateway/client/main.go
new file mode 100644
index 0000000..3d0a02b
--- /dev/null
+++ b/network_rpc/grpc_gateway/client/main.go
@@ -0,0 +1,21 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+
+ v1 "github.com/grpc_gateway/service/v1"
+ "google.golang.org/grpc/credentials/insecure"
+
+ "google.golang.org/grpc"
+)
+
+const PORT = 9090
+
+func main() {
+ conn, _ := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(insecure.NewCredentials()))
+ client := v1.NewEchoServiceClient(conn)
+ resp, _ := client.Echo(context.Background(), &v1.StrMessage{Value: "潘丽萍"})
+ fmt.Println("recv ", resp.GetValue())
+}
diff --git a/network_rpc/grpc_gateway/go.mod b/network_rpc/grpc_gateway/go.mod
new file mode 100644
index 0000000..b9ae933
--- /dev/null
+++ b/network_rpc/grpc_gateway/go.mod
@@ -0,0 +1,18 @@
+module github.com/grpc_gateway
+
+go 1.21
+
+require (
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1
+ google.golang.org/grpc v1.59.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ golang.org/x/net v0.17.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.14.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect
+)
diff --git a/network_rpc/grpc_gateway/go.sum b/network_rpc/grpc_gateway/go.sum
new file mode 100644
index 0000000..cc69242
--- /dev/null
+++ b/network_rpc/grpc_gateway/go.sum
@@ -0,0 +1,27 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=
+google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=
+google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo=
+google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE=
+google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
+google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/network_rpc/grpc_gateway/http/main.go b/network_rpc/grpc_gateway/http/main.go
new file mode 100644
index 0000000..7c67abf
--- /dev/null
+++ b/network_rpc/grpc_gateway/http/main.go
@@ -0,0 +1,34 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "log"
+ "net/http"
+
+ servicev1 "github.com/grpc_gateway/proto/service2/nuts/echo/v1"
+
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+
+ "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+)
+
+var grpcEndPoint = flag.String("grpc-server-endpoint", "127.0.0.1:9090", "")
+
+func main() {
+ flag.Parse()
+ mux := runtime.NewServeMux()
+ opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
+ err := servicev1.RegisterEchoServiceHandlerFromEndpoint(context.Background(), mux, *grpcEndPoint, opts)
+ if err != nil {
+ log.Printf("register failed!%s\n", err)
+ return
+ }
+ err = http.ListenAndServe(":9091", mux)
+ if err != nil {
+ log.Printf("listen failed!%s\n", err)
+ return
+ }
+
+}
diff --git a/network_rpc/grpc_gateway/proto/buf.gen.yaml b/network_rpc/grpc_gateway/proto/buf.gen.yaml
new file mode 100644
index 0000000..24147a0
--- /dev/null
+++ b/network_rpc/grpc_gateway/proto/buf.gen.yaml
@@ -0,0 +1,19 @@
+version: v1
+managed:
+ enabled: true
+ go_package_prefix:
+ default: .
+plugins:
+ - plugin: go
+ out: service2
+ opt:
+ - paths=source_relative
+ - plugin: go-grpc
+ out: service2
+ opt:
+ - paths=source_relative
+ - plugin: grpc-gateway
+ out: service2
+ opt:
+ - paths=source_relative
+ - generate_unbound_methods=true
\ No newline at end of file
diff --git a/network_rpc/grpc_gateway/proto/nuts/echo/v1/myservice.proto b/network_rpc/grpc_gateway/proto/nuts/echo/v1/myservice.proto
new file mode 100644
index 0000000..a5704be
--- /dev/null
+++ b/network_rpc/grpc_gateway/proto/nuts/echo/v1/myservice.proto
@@ -0,0 +1,13 @@
+syntax="proto3";
+package my.service.v1;
+
+//option go_package="./service1";
+
+message StrMessage{
+ string value=1;
+}
+service EchoService{
+ rpc Echo(StrMessage)returns(StrMessage){ }
+// rpc EchoBody(StrMessage)returns(StrMessage){ }
+// rpc EchoFuck(StrMessage)returns(StrMessage){ }
+}
\ No newline at end of file
diff --git a/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice.pb.go b/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice.pb.go
new file mode 100644
index 0000000..43f81de
--- /dev/null
+++ b/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice.pb.go
@@ -0,0 +1,158 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc (unknown)
+// source: nuts/echo/v1/myservice.proto
+
+package servicev1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type StrMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *StrMessage) Reset() {
+ *x = StrMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_nuts_echo_v1_myservice_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *StrMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StrMessage) ProtoMessage() {}
+
+func (x *StrMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_nuts_echo_v1_myservice_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StrMessage.ProtoReflect.Descriptor instead.
+func (*StrMessage) Descriptor() ([]byte, []int) {
+ return file_nuts_echo_v1_myservice_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *StrMessage) GetValue() string {
+ if x != nil {
+ return x.Value
+ }
+ return ""
+}
+
+var File_nuts_echo_v1_myservice_proto protoreflect.FileDescriptor
+
+var file_nuts_echo_v1_myservice_proto_rawDesc = []byte{
+ 0x0a, 0x1c, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x6d,
+ 0x79, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d,
+ 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x22, 0x0a,
+ 0x0a, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x32, 0x4d, 0x0a, 0x0b, 0x45, 0x63, 0x68, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x12, 0x3e, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x1a, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00,
+ 0x42, 0x91, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x4d, 0x79, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x16, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x65,
+ 0x63, 0x68, 0x6f, 0x2f, 0x76, 0x31, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x76, 0x31,
+ 0xa2, 0x02, 0x03, 0x4d, 0x53, 0x58, 0xaa, 0x02, 0x0d, 0x4d, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, 0x4d, 0x79, 0x5c, 0x53, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, 0x4d, 0x79, 0x5c, 0x53, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+ 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4d, 0x79, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_nuts_echo_v1_myservice_proto_rawDescOnce sync.Once
+ file_nuts_echo_v1_myservice_proto_rawDescData = file_nuts_echo_v1_myservice_proto_rawDesc
+)
+
+func file_nuts_echo_v1_myservice_proto_rawDescGZIP() []byte {
+ file_nuts_echo_v1_myservice_proto_rawDescOnce.Do(func() {
+ file_nuts_echo_v1_myservice_proto_rawDescData = protoimpl.X.CompressGZIP(file_nuts_echo_v1_myservice_proto_rawDescData)
+ })
+ return file_nuts_echo_v1_myservice_proto_rawDescData
+}
+
+var file_nuts_echo_v1_myservice_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_nuts_echo_v1_myservice_proto_goTypes = []interface{}{
+ (*StrMessage)(nil), // 0: my.service.v1.StrMessage
+}
+var file_nuts_echo_v1_myservice_proto_depIdxs = []int32{
+ 0, // 0: my.service.v1.EchoService.Echo:input_type -> my.service.v1.StrMessage
+ 0, // 1: my.service.v1.EchoService.Echo:output_type -> my.service.v1.StrMessage
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_nuts_echo_v1_myservice_proto_init() }
+func file_nuts_echo_v1_myservice_proto_init() {
+ if File_nuts_echo_v1_myservice_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_nuts_echo_v1_myservice_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*StrMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_nuts_echo_v1_myservice_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_nuts_echo_v1_myservice_proto_goTypes,
+ DependencyIndexes: file_nuts_echo_v1_myservice_proto_depIdxs,
+ MessageInfos: file_nuts_echo_v1_myservice_proto_msgTypes,
+ }.Build()
+ File_nuts_echo_v1_myservice_proto = out.File
+ file_nuts_echo_v1_myservice_proto_rawDesc = nil
+ file_nuts_echo_v1_myservice_proto_goTypes = nil
+ file_nuts_echo_v1_myservice_proto_depIdxs = nil
+}
diff --git a/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice.pb.gw.go b/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice.pb.gw.go
new file mode 100644
index 0000000..304c8b8
--- /dev/null
+++ b/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice.pb.gw.go
@@ -0,0 +1,171 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: nuts/echo/v1/myservice.proto
+
+/*
+Package servicev1 is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package servicev1
+
+import (
+ "context"
+ "io"
+ "net/http"
+
+ "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+ "github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/metadata"
+ "google.golang.org/grpc/status"
+ "google.golang.org/protobuf/proto"
+)
+
+// Suppress "imported and not used" errors
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+var _ = metadata.Join
+
+func request_EchoService_Echo_0(ctx context.Context, marshaler runtime.Marshaler, client EchoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.Echo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_EchoService_Echo_0(ctx context.Context, marshaler runtime.Marshaler, server EchoServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.Echo(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+// RegisterEchoServiceHandlerServer registers the http handlers for service EchoService to "mux".
+// UnaryRPC :call EchoServiceServer directly.
+// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
+// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterEchoServiceHandlerFromEndpoint instead.
+func RegisterEchoServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server EchoServiceServer) error {
+
+ mux.Handle("POST", pattern_EchoService_Echo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/my.service.v1.EchoService/Echo", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/Echo"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_EchoService_Echo_0(annotatedContext, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_Echo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ return nil
+}
+
+// RegisterEchoServiceHandlerFromEndpoint is same as RegisterEchoServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterEchoServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+ conn, err := grpc.DialContext(ctx, endpoint, opts...)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err != nil {
+ if cerr := conn.Close(); cerr != nil {
+ grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+ }
+ return
+ }
+ go func() {
+ <-ctx.Done()
+ if cerr := conn.Close(); cerr != nil {
+ grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+ }
+ }()
+ }()
+
+ return RegisterEchoServiceHandler(ctx, mux, conn)
+}
+
+// RegisterEchoServiceHandler registers the http handlers for service EchoService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterEchoServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+ return RegisterEchoServiceHandlerClient(ctx, mux, NewEchoServiceClient(conn))
+}
+
+// RegisterEchoServiceHandlerClient registers the http handlers for service EchoService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "EchoServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "EchoServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "EchoServiceClient" to call the correct interceptors.
+func RegisterEchoServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client EchoServiceClient) error {
+
+ mux.Handle("POST", pattern_EchoService_Echo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/my.service.v1.EchoService/Echo", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/Echo"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_EchoService_Echo_0(annotatedContext, inboundMarshaler, client, req, pathParams)
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_Echo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ return nil
+}
+
+var (
+ pattern_EchoService_Echo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"my.service.v1.EchoService", "Echo"}, ""))
+)
+
+var (
+ forward_EchoService_Echo_0 = runtime.ForwardResponseMessage
+)
diff --git a/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice_grpc.pb.go b/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice_grpc.pb.go
new file mode 100644
index 0000000..4346893
--- /dev/null
+++ b/network_rpc/grpc_gateway/proto/service2/nuts/echo/v1/myservice_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc (unknown)
+// source: nuts/echo/v1/myservice.proto
+
+package servicev1
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ EchoService_Echo_FullMethodName = "/my.service.v1.EchoService/Echo"
+)
+
+// EchoServiceClient is the client API for EchoService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type EchoServiceClient interface {
+ Echo(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error)
+}
+
+type echoServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewEchoServiceClient(cc grpc.ClientConnInterface) EchoServiceClient {
+ return &echoServiceClient{cc}
+}
+
+func (c *echoServiceClient) Echo(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error) {
+ out := new(StrMessage)
+ err := c.cc.Invoke(ctx, EchoService_Echo_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// EchoServiceServer is the server API for EchoService service.
+// All implementations must embed UnimplementedEchoServiceServer
+// for forward compatibility
+type EchoServiceServer interface {
+ Echo(context.Context, *StrMessage) (*StrMessage, error)
+ mustEmbedUnimplementedEchoServiceServer()
+}
+
+// UnimplementedEchoServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedEchoServiceServer struct {
+}
+
+func (UnimplementedEchoServiceServer) Echo(context.Context, *StrMessage) (*StrMessage, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented")
+}
+func (UnimplementedEchoServiceServer) mustEmbedUnimplementedEchoServiceServer() {}
+
+// UnsafeEchoServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to EchoServiceServer will
+// result in compilation errors.
+type UnsafeEchoServiceServer interface {
+ mustEmbedUnimplementedEchoServiceServer()
+}
+
+func RegisterEchoServiceServer(s grpc.ServiceRegistrar, srv EchoServiceServer) {
+ s.RegisterService(&EchoService_ServiceDesc, srv)
+}
+
+func _EchoService_Echo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(StrMessage)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(EchoServiceServer).Echo(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: EchoService_Echo_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(EchoServiceServer).Echo(ctx, req.(*StrMessage))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// EchoService_ServiceDesc is the grpc.ServiceDesc for EchoService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var EchoService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "my.service.v1.EchoService",
+ HandlerType: (*EchoServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Echo",
+ Handler: _EchoService_Echo_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "nuts/echo/v1/myservice.proto",
+}
diff --git a/network_rpc/grpc_gateway/readme.md b/network_rpc/grpc_gateway/readme.md
new file mode 100644
index 0000000..514495c
--- /dev/null
+++ b/network_rpc/grpc_gateway/readme.md
@@ -0,0 +1,5 @@
+### grpc-gateway
+- 编译指令
+- protoc --go_out=./ --go-grpc_out=./ proto/v1/*.proto
+- protoc --proto_path=proto/v1 --grpc-gateway_opt paths=source_relative --grpc-gateway_out=./service/v1 --grpc-gateway_opt generate_unbound_methods=true proto/v1/*.proto
+- 注意:grpc服务器和gateway服务器是两个服务器,跑在不同的端口
\ No newline at end of file
diff --git a/network_rpc/grpc_gateway/server/main.go b/network_rpc/grpc_gateway/server/main.go
new file mode 100644
index 0000000..28c2eb1
--- /dev/null
+++ b/network_rpc/grpc_gateway/server/main.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "log"
+ "net"
+ "strconv"
+
+ v1 "github.com/grpc_gateway/service/v1"
+ "google.golang.org/grpc"
+)
+
+type Serv struct {
+ v1.UnimplementedEchoServiceServer
+}
+
+func (s *Serv) Echo(ctx context.Context, message *v1.StrMessage) (*v1.StrMessage, error) {
+ log.Printf("recv value:%s\n", message.GetValue())
+ return &v1.StrMessage{Value: message.GetValue()}, nil
+
+}
+
+//
+//func (s *Serv) EchoBody(ctx context.Context, message *v1.StrMessage) (*v1.StrMessage, error) {
+// return &v1.StrMessage{Value: "I'am " + message.GetValue()}, nil
+//
+//}
+//
+//func (s *Serv) EchoFuck(ctx context.Context, message *v1.StrMessage) (*v1.StrMessage, error) {
+// return &v1.StrMessage{Value: "fuck," + message.GetValue()}, nil
+//
+//}
+
+var grpcServerEnterPoint = flag.String("grpc-server-endpoint", "127.0.0.1:9090", "")
+var port = flag.Int("port", 9090, "")
+
+func main() {
+ flag.Parse()
+ conn, _ := net.Listen("tcp", ":"+strconv.Itoa(*port))
+ server := grpc.NewServer()
+ v1.RegisterEchoServiceServer(server, &Serv{})
+ _ = server.Serve(conn)
+
+}
diff --git a/network_rpc/grpc_gateway/service/v1/myservice.pb.go b/network_rpc/grpc_gateway/service/v1/myservice.pb.go
new file mode 100644
index 0000000..b7a072e
--- /dev/null
+++ b/network_rpc/grpc_gateway/service/v1/myservice.pb.go
@@ -0,0 +1,163 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.24.0
+// source: proto/v1/myservice.proto
+
+package v1
+
+import (
+ reflect "reflect"
+ sync "sync"
+
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type StrMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *StrMessage) Reset() {
+ *x = StrMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_v1_myservice_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *StrMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StrMessage) ProtoMessage() {}
+
+func (x *StrMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_v1_myservice_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StrMessage.ProtoReflect.Descriptor instead.
+func (*StrMessage) Descriptor() ([]byte, []int) {
+ return file_proto_v1_myservice_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *StrMessage) GetValue() string {
+ if x != nil {
+ return x.Value
+ }
+ return ""
+}
+
+var File_proto_v1_myservice_proto protoreflect.FileDescriptor
+
+var file_proto_v1_myservice_proto_rawDesc = []byte{
+ 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x79, 0x73, 0x65, 0x72,
+ 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x6d, 0x79, 0x2e, 0x73,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x22, 0x0a, 0x0a, 0x53, 0x74, 0x72,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0xd5, 0x01,
+ 0x0a, 0x0b, 0x45, 0x63, 0x68, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a,
+ 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+ 0x1a, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31,
+ 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a,
+ 0x08, 0x45, 0x63, 0x68, 0x6f, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x1a, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
+ 0x00, 0x12, 0x42, 0x0a, 0x08, 0x45, 0x63, 0x68, 0x6f, 0x46, 0x75, 0x63, 0x6b, 0x12, 0x19, 0x2e,
+ 0x6d, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
+ 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x19, 0x2e, 0x6d, 0x79, 0x2e, 0x73, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x00, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_proto_v1_myservice_proto_rawDescOnce sync.Once
+ file_proto_v1_myservice_proto_rawDescData = file_proto_v1_myservice_proto_rawDesc
+)
+
+func file_proto_v1_myservice_proto_rawDescGZIP() []byte {
+ file_proto_v1_myservice_proto_rawDescOnce.Do(func() {
+ file_proto_v1_myservice_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_v1_myservice_proto_rawDescData)
+ })
+ return file_proto_v1_myservice_proto_rawDescData
+}
+
+var file_proto_v1_myservice_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_proto_v1_myservice_proto_goTypes = []interface{}{
+ (*StrMessage)(nil), // 0: my.service.v1.StrMessage
+}
+var file_proto_v1_myservice_proto_depIdxs = []int32{
+ 0, // 0: my.service.v1.EchoService.Echo:input_type -> my.service.v1.StrMessage
+ 0, // 1: my.service.v1.EchoService.EchoBody:input_type -> my.service.v1.StrMessage
+ 0, // 2: my.service.v1.EchoService.EchoFuck:input_type -> my.service.v1.StrMessage
+ 0, // 3: my.service.v1.EchoService.Echo:output_type -> my.service.v1.StrMessage
+ 0, // 4: my.service.v1.EchoService.EchoBody:output_type -> my.service.v1.StrMessage
+ 0, // 5: my.service.v1.EchoService.EchoFuck:output_type -> my.service.v1.StrMessage
+ 3, // [3:6] is the sub-list for method output_type
+ 0, // [0:3] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_proto_v1_myservice_proto_init() }
+func file_proto_v1_myservice_proto_init() {
+ if File_proto_v1_myservice_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_proto_v1_myservice_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*StrMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_proto_v1_myservice_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_proto_v1_myservice_proto_goTypes,
+ DependencyIndexes: file_proto_v1_myservice_proto_depIdxs,
+ MessageInfos: file_proto_v1_myservice_proto_msgTypes,
+ }.Build()
+ File_proto_v1_myservice_proto = out.File
+ file_proto_v1_myservice_proto_rawDesc = nil
+ file_proto_v1_myservice_proto_goTypes = nil
+ file_proto_v1_myservice_proto_depIdxs = nil
+}
diff --git a/network_rpc/grpc_gateway/service/v1/myservice.pb.gw.go b/network_rpc/grpc_gateway/service/v1/myservice.pb.gw.go
new file mode 100644
index 0000000..cb27d46
--- /dev/null
+++ b/network_rpc/grpc_gateway/service/v1/myservice.pb.gw.go
@@ -0,0 +1,341 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: myservice.proto
+
+/*
+Package v1 is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package v1
+
+import (
+ "context"
+ "io"
+ "net/http"
+
+ "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+ "github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/metadata"
+ "google.golang.org/grpc/status"
+ "google.golang.org/protobuf/proto"
+)
+
+// Suppress "imported and not used" errors
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+var _ = metadata.Join
+
+func request_EchoService_Echo_0(ctx context.Context, marshaler runtime.Marshaler, client EchoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.Echo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_EchoService_Echo_0(ctx context.Context, marshaler runtime.Marshaler, server EchoServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.Echo(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_EchoService_EchoBody_0(ctx context.Context, marshaler runtime.Marshaler, client EchoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.EchoBody(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_EchoService_EchoBody_0(ctx context.Context, marshaler runtime.Marshaler, server EchoServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.EchoBody(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_EchoService_EchoFuck_0(ctx context.Context, marshaler runtime.Marshaler, client EchoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.EchoFuck(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_EchoService_EchoFuck_0(ctx context.Context, marshaler runtime.Marshaler, server EchoServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq StrMessage
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.EchoFuck(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+// RegisterEchoServiceHandlerServer registers the http handlers for service EchoService to "mux".
+// UnaryRPC :call EchoServiceServer directly.
+// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
+// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterEchoServiceHandlerFromEndpoint instead.
+func RegisterEchoServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server EchoServiceServer) error {
+
+ mux.Handle("POST", pattern_EchoService_Echo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/my.service.v1.EchoService/Echo", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/Echo"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_EchoService_Echo_0(annotatedContext, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_Echo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_EchoService_EchoBody_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/my.service.v1.EchoService/EchoBody", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/EchoBody"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_EchoService_EchoBody_0(annotatedContext, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_EchoBody_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_EchoService_EchoFuck_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/my.service.v1.EchoService/EchoFuck", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/EchoFuck"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_EchoService_EchoFuck_0(annotatedContext, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_EchoFuck_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ return nil
+}
+
+// RegisterEchoServiceHandlerFromEndpoint is same as RegisterEchoServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterEchoServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+ conn, err := grpc.DialContext(ctx, endpoint, opts...)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err != nil {
+ if cerr := conn.Close(); cerr != nil {
+ grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+ }
+ return
+ }
+ go func() {
+ <-ctx.Done()
+ if cerr := conn.Close(); cerr != nil {
+ grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+ }
+ }()
+ }()
+
+ return RegisterEchoServiceHandler(ctx, mux, conn)
+}
+
+// RegisterEchoServiceHandler registers the http handlers for service EchoService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterEchoServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+ return RegisterEchoServiceHandlerClient(ctx, mux, NewEchoServiceClient(conn))
+}
+
+// RegisterEchoServiceHandlerClient registers the http handlers for service EchoService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "EchoServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "EchoServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "EchoServiceClient" to call the correct interceptors.
+func RegisterEchoServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client EchoServiceClient) error {
+
+ mux.Handle("POST", pattern_EchoService_Echo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/my.service.v1.EchoService/Echo", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/Echo"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_EchoService_Echo_0(annotatedContext, inboundMarshaler, client, req, pathParams)
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_Echo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_EchoService_EchoBody_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/my.service.v1.EchoService/EchoBody", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/EchoBody"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_EchoService_EchoBody_0(annotatedContext, inboundMarshaler, client, req, pathParams)
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_EchoBody_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_EchoService_EchoFuck_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ var err error
+ var annotatedContext context.Context
+ annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/my.service.v1.EchoService/EchoFuck", runtime.WithHTTPPathPattern("/my.service.v1.EchoService/EchoFuck"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_EchoService_EchoFuck_0(annotatedContext, inboundMarshaler, client, req, pathParams)
+ annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
+ if err != nil {
+ runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_EchoService_EchoFuck_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ return nil
+}
+
+var (
+ pattern_EchoService_Echo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"my.service.v1.EchoService", "Echo"}, ""))
+
+ pattern_EchoService_EchoBody_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"my.service.v1.EchoService", "EchoBody"}, ""))
+
+ pattern_EchoService_EchoFuck_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"my.service.v1.EchoService", "EchoFuck"}, ""))
+)
+
+var (
+ forward_EchoService_Echo_0 = runtime.ForwardResponseMessage
+
+ forward_EchoService_EchoBody_0 = runtime.ForwardResponseMessage
+
+ forward_EchoService_EchoFuck_0 = runtime.ForwardResponseMessage
+)
diff --git a/network_rpc/grpc_gateway/service/v1/myservice_grpc.pb.go b/network_rpc/grpc_gateway/service/v1/myservice_grpc.pb.go
new file mode 100644
index 0000000..2ac1646
--- /dev/null
+++ b/network_rpc/grpc_gateway/service/v1/myservice_grpc.pb.go
@@ -0,0 +1,184 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.24.0
+// source: proto/v1/myservice.proto
+
+package v1
+
+import (
+ context "context"
+
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ EchoService_Echo_FullMethodName = "/my.service.v1.EchoService/Echo"
+ EchoService_EchoBody_FullMethodName = "/my.service.v1.EchoService/EchoBody"
+ EchoService_EchoFuck_FullMethodName = "/my.service.v1.EchoService/EchoFuck"
+)
+
+// EchoServiceClient is the client API for EchoService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type EchoServiceClient interface {
+ Echo(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error)
+ EchoBody(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error)
+ EchoFuck(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error)
+}
+
+type echoServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewEchoServiceClient(cc grpc.ClientConnInterface) EchoServiceClient {
+ return &echoServiceClient{cc}
+}
+
+func (c *echoServiceClient) Echo(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error) {
+ out := new(StrMessage)
+ err := c.cc.Invoke(ctx, EchoService_Echo_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *echoServiceClient) EchoBody(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error) {
+ out := new(StrMessage)
+ err := c.cc.Invoke(ctx, EchoService_EchoBody_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *echoServiceClient) EchoFuck(ctx context.Context, in *StrMessage, opts ...grpc.CallOption) (*StrMessage, error) {
+ out := new(StrMessage)
+ err := c.cc.Invoke(ctx, EchoService_EchoFuck_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// EchoServiceServer is the server API for EchoService service.
+// All implementations must embed UnimplementedEchoServiceServer
+// for forward compatibility
+type EchoServiceServer interface {
+ Echo(context.Context, *StrMessage) (*StrMessage, error)
+ EchoBody(context.Context, *StrMessage) (*StrMessage, error)
+ EchoFuck(context.Context, *StrMessage) (*StrMessage, error)
+ mustEmbedUnimplementedEchoServiceServer()
+}
+
+// UnimplementedEchoServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedEchoServiceServer struct {
+}
+
+func (UnimplementedEchoServiceServer) Echo(context.Context, *StrMessage) (*StrMessage, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented")
+}
+func (UnimplementedEchoServiceServer) EchoBody(context.Context, *StrMessage) (*StrMessage, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method EchoBody not implemented")
+}
+func (UnimplementedEchoServiceServer) EchoFuck(context.Context, *StrMessage) (*StrMessage, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method EchoFuck not implemented")
+}
+func (UnimplementedEchoServiceServer) mustEmbedUnimplementedEchoServiceServer() {}
+
+// UnsafeEchoServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to EchoServiceServer will
+// result in compilation errors.
+type UnsafeEchoServiceServer interface {
+ mustEmbedUnimplementedEchoServiceServer()
+}
+
+func RegisterEchoServiceServer(s grpc.ServiceRegistrar, srv EchoServiceServer) {
+ s.RegisterService(&EchoService_ServiceDesc, srv)
+}
+
+func _EchoService_Echo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(StrMessage)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(EchoServiceServer).Echo(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: EchoService_Echo_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(EchoServiceServer).Echo(ctx, req.(*StrMessage))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _EchoService_EchoBody_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(StrMessage)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(EchoServiceServer).EchoBody(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: EchoService_EchoBody_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(EchoServiceServer).EchoBody(ctx, req.(*StrMessage))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _EchoService_EchoFuck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(StrMessage)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(EchoServiceServer).EchoFuck(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: EchoService_EchoFuck_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(EchoServiceServer).EchoFuck(ctx, req.(*StrMessage))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// EchoService_ServiceDesc is the grpc.ServiceDesc for EchoService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var EchoService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "my.service.v1.EchoService",
+ HandlerType: (*EchoServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Echo",
+ Handler: _EchoService_Echo_Handler,
+ },
+ {
+ MethodName: "EchoBody",
+ Handler: _EchoService_EchoBody_Handler,
+ },
+ {
+ MethodName: "EchoFuck",
+ Handler: _EchoService_EchoFuck_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "proto/v1/myservice.proto",
+}
diff --git a/network_rpc/grpc_interceptor/client/main.go b/network_rpc/grpc_interceptor/client/main.go
new file mode 100644
index 0000000..ec3bef3
--- /dev/null
+++ b/network_rpc/grpc_interceptor/client/main.go
@@ -0,0 +1,51 @@
+package main
+
+import (
+ "context"
+ "log"
+ "strconv"
+
+ "google.golang.org/grpc/credentials/insecure"
+
+ pb "github.com/grpc_interceptor/proto"
+ "google.golang.org/grpc"
+)
+
+const PORT = 9090
+
+func main() {
+
+ conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(insecure.NewCredentials()))
+ if err != nil {
+ log.Printf("[client] connect to %d failed! err:%s\n", err)
+ return
+ }
+ client := pb.NewSearchVClient(conn)
+ resp, err := client.SayHello(context.Background(), &pb.Req{Request: "潘丽萍"})
+ if err != nil {
+ log.Printf("[client] rpc invoke failed! err:%s\n", err)
+ return
+ }
+ log.Printf("[client] recv value:%s\n", resp.Response)
+
+ stream, err := client.SayHi(context.Background())
+ if err != nil {
+ log.Printf("[client] stream send failed! err:%s\n", err)
+ return
+ }
+ for i := 0; i < 10; i++ {
+
+ err = stream.Send(&pb.Req{
+ Request: "周小林",
+ })
+ if err != nil {
+ log.Printf("[client] recv an err! err:%s\n", err)
+ return
+ }
+ }
+ err = stream.CloseSend()
+ if err != nil {
+ log.Printf("[client] close send failed! err:%s\n", err)
+ }
+
+}
diff --git a/network_rpc/grpc_interceptor/go.mod b/network_rpc/grpc_interceptor/go.mod
new file mode 100644
index 0000000..f0d4302
--- /dev/null
+++ b/network_rpc/grpc_interceptor/go.mod
@@ -0,0 +1,17 @@
+module github.com/grpc_interceptor
+
+go 1.21.0
+
+require (
+ google.golang.org/grpc v1.59.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
+ golang.org/x/net v0.14.0 // indirect
+ golang.org/x/sys v0.11.0 // indirect
+ golang.org/x/text v0.12.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
+)
diff --git a/network_rpc/grpc_interceptor/go.sum b/network_rpc/grpc_interceptor/go.sum
new file mode 100644
index 0000000..c5d4383
--- /dev/null
+++ b/network_rpc/grpc_interceptor/go.sum
@@ -0,0 +1,130 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
+github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
+google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/network_rpc/grpc_interceptor/proto/search.pb.go b/network_rpc/grpc_interceptor/proto/search.pb.go
new file mode 100644
index 0000000..dd5cc05
--- /dev/null
+++ b/network_rpc/grpc_interceptor/proto/search.pb.go
@@ -0,0 +1,211 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.24.0
+// source: search.proto
+
+package grpc_interceptor
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Req struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Request string `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
+}
+
+func (x *Req) Reset() {
+ *x = Req{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_search_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Req) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Req) ProtoMessage() {}
+
+func (x *Req) ProtoReflect() protoreflect.Message {
+ mi := &file_search_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Req.ProtoReflect.Descriptor instead.
+func (*Req) Descriptor() ([]byte, []int) {
+ return file_search_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Req) GetRequest() string {
+ if x != nil {
+ return x.Request
+ }
+ return ""
+}
+
+type Resp struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Response string `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
+}
+
+func (x *Resp) Reset() {
+ *x = Resp{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_search_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Resp) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Resp) ProtoMessage() {}
+
+func (x *Resp) ProtoReflect() protoreflect.Message {
+ mi := &file_search_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Resp.ProtoReflect.Descriptor instead.
+func (*Resp) Descriptor() ([]byte, []int) {
+ return file_search_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Resp) GetResponse() string {
+ if x != nil {
+ return x.Response
+ }
+ return ""
+}
+
+var File_search_proto protoreflect.FileDescriptor
+
+var file_search_proto_rawDesc = []byte{
+ 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1f,
+ 0x0a, 0x03, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,
+ 0x22, 0x0a, 0x04, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x32, 0x3c, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x12, 0x18,
+ 0x0a, 0x05, 0x53, 0x61, 0x79, 0x48, 0x69, 0x12, 0x04, 0x2e, 0x52, 0x65, 0x71, 0x1a, 0x05, 0x2e,
+ 0x52, 0x65, 0x73, 0x70, 0x28, 0x01, 0x30, 0x01, 0x12, 0x17, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48,
+ 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x04, 0x2e, 0x52, 0x65, 0x71, 0x1a, 0x05, 0x2e, 0x52, 0x65, 0x73,
+ 0x70, 0x42, 0x15, 0x5a, 0x13, 0x2e, 0x2f, 0x3b, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x6f, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_search_proto_rawDescOnce sync.Once
+ file_search_proto_rawDescData = file_search_proto_rawDesc
+)
+
+func file_search_proto_rawDescGZIP() []byte {
+ file_search_proto_rawDescOnce.Do(func() {
+ file_search_proto_rawDescData = protoimpl.X.CompressGZIP(file_search_proto_rawDescData)
+ })
+ return file_search_proto_rawDescData
+}
+
+var file_search_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_search_proto_goTypes = []interface{}{
+ (*Req)(nil), // 0: Req
+ (*Resp)(nil), // 1: Resp
+}
+var file_search_proto_depIdxs = []int32{
+ 0, // 0: SearchV.SayHi:input_type -> Req
+ 0, // 1: SearchV.SayHello:input_type -> Req
+ 1, // 2: SearchV.SayHi:output_type -> Resp
+ 1, // 3: SearchV.SayHello:output_type -> Resp
+ 2, // [2:4] is the sub-list for method output_type
+ 0, // [0:2] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_search_proto_init() }
+func file_search_proto_init() {
+ if File_search_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_search_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Req); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_search_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Resp); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_search_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_search_proto_goTypes,
+ DependencyIndexes: file_search_proto_depIdxs,
+ MessageInfos: file_search_proto_msgTypes,
+ }.Build()
+ File_search_proto = out.File
+ file_search_proto_rawDesc = nil
+ file_search_proto_goTypes = nil
+ file_search_proto_depIdxs = nil
+}
diff --git a/network_rpc/grpc_interceptor/proto/search.proto b/network_rpc/grpc_interceptor/proto/search.proto
new file mode 100644
index 0000000..aeb601c
--- /dev/null
+++ b/network_rpc/grpc_interceptor/proto/search.proto
@@ -0,0 +1,16 @@
+syntax="proto3";
+
+option go_package="./;grpc_interceptor";
+
+message Req{
+ string request=1;
+}
+
+message Resp{
+ string response=1;
+}
+
+service SearchV{
+rpc SayHi(stream Req)returns(stream Resp);
+rpc SayHello(Req)returns(Resp);
+}
\ No newline at end of file
diff --git a/network_rpc/grpc_interceptor/proto/search_grpc.pb.go b/network_rpc/grpc_interceptor/proto/search_grpc.pb.go
new file mode 100644
index 0000000..323003d
--- /dev/null
+++ b/network_rpc/grpc_interceptor/proto/search_grpc.pb.go
@@ -0,0 +1,179 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.24.0
+// source: search.proto
+
+package grpc_interceptor
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ SearchV_SayHi_FullMethodName = "/SearchV/SayHi"
+ SearchV_SayHello_FullMethodName = "/SearchV/SayHello"
+)
+
+// SearchVClient is the client API for SearchV service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SearchVClient interface {
+ SayHi(ctx context.Context, opts ...grpc.CallOption) (SearchV_SayHiClient, error)
+ SayHello(ctx context.Context, in *Req, opts ...grpc.CallOption) (*Resp, error)
+}
+
+type searchVClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewSearchVClient(cc grpc.ClientConnInterface) SearchVClient {
+ return &searchVClient{cc}
+}
+
+func (c *searchVClient) SayHi(ctx context.Context, opts ...grpc.CallOption) (SearchV_SayHiClient, error) {
+ stream, err := c.cc.NewStream(ctx, &SearchV_ServiceDesc.Streams[0], SearchV_SayHi_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &searchVSayHiClient{stream}
+ return x, nil
+}
+
+type SearchV_SayHiClient interface {
+ Send(*Req) error
+ Recv() (*Resp, error)
+ grpc.ClientStream
+}
+
+type searchVSayHiClient struct {
+ grpc.ClientStream
+}
+
+func (x *searchVSayHiClient) Send(m *Req) error {
+ return x.ClientStream.SendMsg(m)
+}
+
+func (x *searchVSayHiClient) Recv() (*Resp, error) {
+ m := new(Resp)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func (c *searchVClient) SayHello(ctx context.Context, in *Req, opts ...grpc.CallOption) (*Resp, error) {
+ out := new(Resp)
+ err := c.cc.Invoke(ctx, SearchV_SayHello_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// SearchVServer is the server API for SearchV service.
+// All implementations must embed UnimplementedSearchVServer
+// for forward compatibility
+type SearchVServer interface {
+ SayHi(SearchV_SayHiServer) error
+ SayHello(context.Context, *Req) (*Resp, error)
+ mustEmbedUnimplementedSearchVServer()
+}
+
+// UnimplementedSearchVServer must be embedded to have forward compatible implementations.
+type UnimplementedSearchVServer struct {
+}
+
+func (UnimplementedSearchVServer) SayHi(SearchV_SayHiServer) error {
+ return status.Errorf(codes.Unimplemented, "method SayHi not implemented")
+}
+func (UnimplementedSearchVServer) SayHello(context.Context, *Req) (*Resp, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
+}
+func (UnimplementedSearchVServer) mustEmbedUnimplementedSearchVServer() {}
+
+// UnsafeSearchVServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SearchVServer will
+// result in compilation errors.
+type UnsafeSearchVServer interface {
+ mustEmbedUnimplementedSearchVServer()
+}
+
+func RegisterSearchVServer(s grpc.ServiceRegistrar, srv SearchVServer) {
+ s.RegisterService(&SearchV_ServiceDesc, srv)
+}
+
+func _SearchV_SayHi_Handler(srv interface{}, stream grpc.ServerStream) error {
+ return srv.(SearchVServer).SayHi(&searchVSayHiServer{stream})
+}
+
+type SearchV_SayHiServer interface {
+ Send(*Resp) error
+ Recv() (*Req, error)
+ grpc.ServerStream
+}
+
+type searchVSayHiServer struct {
+ grpc.ServerStream
+}
+
+func (x *searchVSayHiServer) Send(m *Resp) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func (x *searchVSayHiServer) Recv() (*Req, error) {
+ m := new(Req)
+ if err := x.ServerStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func _SearchV_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(Req)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(SearchVServer).SayHello(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: SearchV_SayHello_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(SearchVServer).SayHello(ctx, req.(*Req))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// SearchV_ServiceDesc is the grpc.ServiceDesc for SearchV service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SearchV_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "SearchV",
+ HandlerType: (*SearchVServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "SayHello",
+ Handler: _SearchV_SayHello_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{
+ {
+ StreamName: "SayHi",
+ Handler: _SearchV_SayHi_Handler,
+ ServerStreams: true,
+ ClientStreams: true,
+ },
+ },
+ Metadata: "search.proto",
+}
diff --git a/network_rpc/grpc_interceptor/readme.md b/network_rpc/grpc_interceptor/readme.md
new file mode 100644
index 0000000..9dd22c6
--- /dev/null
+++ b/network_rpc/grpc_interceptor/readme.md
@@ -0,0 +1,8 @@
+#### grpc 拦截器
+- 普通方法(一元拦截器)grpc.UnaryInterceptor
+- 原型 type UnaryInterceptor func(ctx context.Context,req interface{},info *UnaryServerInfo,handler UnaryHandler)(interface{},error){}
+
+- 流方法(流拦截器)grpc.StreamInterceptor
+- 原型 type func(srv interface{},ss ServerStream,info *StreamServerInfo,handler StreamHandler)(interface{},error){}
+
+- 注意grpc本身只能设置一个拦截器,可以借助github.com/grpc-ecosystem/go-grpc-middleware
\ No newline at end of file
diff --git a/network_rpc/grpc_interceptor/server/main.go b/network_rpc/grpc_interceptor/server/main.go
new file mode 100644
index 0000000..311a8c6
--- /dev/null
+++ b/network_rpc/grpc_interceptor/server/main.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+ "context"
+ "io"
+ "log"
+ "net"
+ "runtime/debug"
+ "strconv"
+
+ grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
+
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+
+ "google.golang.org/grpc"
+
+ pb "github.com/grpc_interceptor/proto"
+)
+
+const PORT = 9090
+
+type Serv struct {
+ pb.UnimplementedSearchVServer
+}
+
+func (s *Serv) SayHello(ctx context.Context, req *pb.Req) (*pb.Resp, error) {
+ return &pb.Resp{Response: "hello!" + req.GetRequest()}, nil
+
+}
+
+func (s *Serv) SayHi(stream pb.SearchV_SayHiServer) error {
+ //
+
+ for {
+ recv, err := stream.Recv()
+ if err != nil {
+ if err == io.EOF {
+ log.Printf("[server] client finished its msg")
+ break
+ } else {
+ log.Printf("[server] recv get an err! err:%s\n", err)
+ return err
+ }
+ }
+ log.Printf("[server] recv value:%s\n", recv.GetRequest())
+ }
+ return nil
+
+}
+
+///拦截器
+/// go-grpc-middleware 插件实现server使用多个拦截器
+
+// LoggingInterceptor 日志拦截器
+func LoggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
+ log.Printf("[server] gRPC Unary method:%s %v", info.FullMethod, req)
+ return handler(ctx, req)
+
+}
+
+// LoggingInterceptorStream 流式
+func LoggingInterceptorStream(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
+ log.Printf("[server] gRPC stream method:%s", info.FullMethod)
+ return handler(srv, stream)
+
+}
+
+// RecoveryInterceptor recovery拦截器
+func RecoveryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
+
+ defer func() {
+ if e := recover(); e != nil {
+ debug.PrintStack()
+ status.Errorf(codes.Internal, "Panic err %s", e)
+ }
+ }()
+
+ return handler(ctx, req)
+}
+
+func main() {
+ //tls := GetTLScredentialsByCA()
+ opt := []grpc.ServerOption{
+ //grpc.Creds(tls),
+ grpc_middleware.WithUnaryServerChain(
+ LoggingInterceptor,
+ RecoveryInterceptor),
+ grpc_middleware.WithStreamServerChain(LoggingInterceptorStream),
+ }
+ //创建服务段
+ server := grpc.NewServer(opt...)
+ conn, err := net.Listen("tcp", ":"+strconv.Itoa(PORT))
+ if err != nil {
+ log.Printf("[server] listen %d failed! err:%s\n", PORT, err)
+ return
+ }
+ //注册
+ pb.RegisterSearchVServer(server, &Serv{})
+ server.Serve(conn)
+
+}
diff --git a/network_rpc/grpc_stream/client/clientStream/main.go b/network_rpc/grpc_stream/client/clientStream/main.go
new file mode 100644
index 0000000..bc01b15
--- /dev/null
+++ b/network_rpc/grpc_stream/client/clientStream/main.go
@@ -0,0 +1,48 @@
+package main
+
+import (
+ "context"
+ "grpc_stream/proto"
+ "log"
+ "strconv"
+
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+const PORT = 9092
+
+func main() {
+ //创建链接 不带认证
+ conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(insecure.NewCredentials()))
+ if err != nil {
+ log.Printf("dial %d failed! err:%s\n", PORT, err)
+ return
+ }
+ defer conn.Close()
+ //创建调用的客户端
+ client := proto.NewStreamCClient(conn)
+ stream, err := client.ClientStream(context.Background())
+ if err != nil {
+ log.Printf("streamClient invoke fun to gain an err!!! err:%s\n", err)
+ return
+ }
+ //循环发送消息
+ for i := 0; i < 10; i++ {
+ //创建发送的消息
+ msg := &proto.StreamReq{Request: &proto.StreamMsg{Name: "小潘",
+ Value: int32(i)}}
+ err := stream.Send(msg)
+ if err != nil {
+ log.Printf("streamClient send msg failed! err:%s\n", err)
+ }
+
+ }
+ recv, err := stream.CloseAndRecv()
+ if err != nil {
+ log.Printf("streamClient client has finished! client gain the closed signal from server failed! err:%s\n", err)
+ return
+ }
+
+ log.Printf("streamClient gain the closed msg name:%s value:%d\n", recv.GetResponse().Name, recv.GetResponse().Value)
+}
diff --git a/network_rpc/grpc_stream/client/doubleStream/mian.go b/network_rpc/grpc_stream/client/doubleStream/mian.go
new file mode 100644
index 0000000..4a51bb7
--- /dev/null
+++ b/network_rpc/grpc_stream/client/doubleStream/mian.go
@@ -0,0 +1,50 @@
+package main
+
+import (
+ "context"
+ "grpc_stream/proto"
+ "io"
+ "log"
+ "strconv"
+
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+const PORT = 9092
+
+func main() {
+ conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(insecure.NewCredentials()))
+ if err != nil {
+ log.Printf("dial %d failed! err:%s\n", PORT, err)
+ return
+ }
+ defer conn.Close()
+ client := proto.NewStreamCClient(conn)
+ stream, err := client.DoubleStream(context.Background())
+ if err != nil {
+ log.Printf("streamDouble client creates stream failed! err:%s\n", err)
+ return
+ }
+ for i := 0; i < 100; i++ {
+ err := stream.Send(&proto.StreamReq{
+ Request: &proto.StreamMsg{Name: "周小林",
+ Value: int32(i)},
+ })
+ if err != nil {
+ log.Printf("")
+ }
+ recv, err := stream.Recv()
+ if err == io.EOF {
+ log.Printf("streamDouble recv finished")
+ break
+ }
+ if err != nil {
+ log.Printf("streamDouble recv an err ! err:%s\n", err)
+ return
+ }
+ log.Printf("streamDouble recv name:%s value:%d \n", recv.Response.Name, recv.Response.Value)
+ }
+ //客户端发起关闭
+ _ = stream.CloseSend()
+}
diff --git a/network_rpc/grpc_stream/client/serverStream/main.go b/network_rpc/grpc_stream/client/serverStream/main.go
new file mode 100644
index 0000000..965d8fb
--- /dev/null
+++ b/network_rpc/grpc_stream/client/serverStream/main.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "context"
+ "grpc_stream/proto"
+ "io"
+ "log"
+ "strconv"
+
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+const PORT = 9092
+
+func main() {
+
+ conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(insecure.NewCredentials()))
+ if err != nil {
+ log.Printf("dial %d failed! err:%s\n", PORT, err)
+ return
+ }
+ defer conn.Close()
+
+ client := proto.NewStreamCClient(conn)
+ stream, err := client.ServerStream(context.Background(), &proto.StreamReq{Request: &proto.StreamMsg{
+ Name: "潘丽萍",
+ }})
+ if err != nil {
+ log.Printf("")
+ }
+ for {
+ msg, err := stream.Recv()
+ if err == io.EOF {
+ break
+ }
+ if err != nil {
+ log.Printf("recv failed ! err:%s\n")
+ return
+ }
+ log.Printf("recv name:%s value:%d \n", msg.GetResponse().Name, msg.GetResponse().Value)
+ log.Printf("recv name:%s value:%d \n", msg.Response.Name, msg.Response.Value)
+
+ }
+}
diff --git a/network_rpc/grpc_stream/go.mod b/network_rpc/grpc_stream/go.mod
new file mode 100644
index 0000000..4eebe13
--- /dev/null
+++ b/network_rpc/grpc_stream/go.mod
@@ -0,0 +1,16 @@
+module grpc_stream
+
+go 1.21.0
+
+require (
+ google.golang.org/grpc v1.59.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ golang.org/x/net v0.14.0 // indirect
+ golang.org/x/sys v0.11.0 // indirect
+ golang.org/x/text v0.12.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
+)
diff --git a/network_rpc/grpc_stream/go.sum b/network_rpc/grpc_stream/go.sum
new file mode 100644
index 0000000..16f3bb4
--- /dev/null
+++ b/network_rpc/grpc_stream/go.sum
@@ -0,0 +1,21 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
+google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
+google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/network_rpc/grpc_stream/proto/testStream.pb.go b/network_rpc/grpc_stream/proto/testStream.pb.go
new file mode 100644
index 0000000..ff37e72
--- /dev/null
+++ b/network_rpc/grpc_stream/proto/testStream.pb.go
@@ -0,0 +1,294 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.24.0
+// source: testStream.proto
+
+package proto
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type StreamMsg struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *StreamMsg) Reset() {
+ *x = StreamMsg{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_testStream_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *StreamMsg) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamMsg) ProtoMessage() {}
+
+func (x *StreamMsg) ProtoReflect() protoreflect.Message {
+ mi := &file_testStream_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamMsg.ProtoReflect.Descriptor instead.
+func (*StreamMsg) Descriptor() ([]byte, []int) {
+ return file_testStream_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *StreamMsg) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *StreamMsg) GetValue() int32 {
+ if x != nil {
+ return x.Value
+ }
+ return 0
+}
+
+type StreamReq struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Request *StreamMsg `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
+}
+
+func (x *StreamReq) Reset() {
+ *x = StreamReq{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_testStream_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *StreamReq) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamReq) ProtoMessage() {}
+
+func (x *StreamReq) ProtoReflect() protoreflect.Message {
+ mi := &file_testStream_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamReq.ProtoReflect.Descriptor instead.
+func (*StreamReq) Descriptor() ([]byte, []int) {
+ return file_testStream_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *StreamReq) GetRequest() *StreamMsg {
+ if x != nil {
+ return x.Request
+ }
+ return nil
+}
+
+type StreamResp struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Response *StreamMsg `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
+}
+
+func (x *StreamResp) Reset() {
+ *x = StreamResp{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_testStream_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *StreamResp) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamResp) ProtoMessage() {}
+
+func (x *StreamResp) ProtoReflect() protoreflect.Message {
+ mi := &file_testStream_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamResp.ProtoReflect.Descriptor instead.
+func (*StreamResp) Descriptor() ([]byte, []int) {
+ return file_testStream_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *StreamResp) GetResponse() *StreamMsg {
+ if x != nil {
+ return x.Response
+ }
+ return nil
+}
+
+var File_testStream_proto protoreflect.FileDescriptor
+
+var file_testStream_proto_rawDesc = []byte{
+ 0x0a, 0x10, 0x74, 0x65, 0x73, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x22, 0x35, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x73, 0x67, 0x12,
+ 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x31, 0x0a, 0x09, 0x73, 0x74, 0x72,
+ 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x24, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
+ 0x4d, 0x73, 0x67, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x34, 0x0a, 0x0a,
+ 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x12, 0x26, 0x0a, 0x08, 0x72, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x73,
+ 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x73, 0x67, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x32, 0x8c, 0x01, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x12, 0x29,
+ 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0a,
+ 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0b, 0x2e, 0x73, 0x74, 0x72,
+ 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x28, 0x01, 0x12, 0x29, 0x0a, 0x0c, 0x53, 0x65, 0x72,
+ 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0a, 0x2e, 0x73, 0x74, 0x72, 0x65,
+ 0x61, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0b, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65,
+ 0x73, 0x70, 0x30, 0x01, 0x12, 0x2b, 0x0a, 0x0c, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x53, 0x74,
+ 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0a, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71,
+ 0x1a, 0x0b, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x28, 0x01, 0x30,
+ 0x01, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_testStream_proto_rawDescOnce sync.Once
+ file_testStream_proto_rawDescData = file_testStream_proto_rawDesc
+)
+
+func file_testStream_proto_rawDescGZIP() []byte {
+ file_testStream_proto_rawDescOnce.Do(func() {
+ file_testStream_proto_rawDescData = protoimpl.X.CompressGZIP(file_testStream_proto_rawDescData)
+ })
+ return file_testStream_proto_rawDescData
+}
+
+var file_testStream_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_testStream_proto_goTypes = []interface{}{
+ (*StreamMsg)(nil), // 0: streamMsg
+ (*StreamReq)(nil), // 1: streamReq
+ (*StreamResp)(nil), // 2: streamResp
+}
+var file_testStream_proto_depIdxs = []int32{
+ 0, // 0: streamReq.request:type_name -> streamMsg
+ 0, // 1: streamResp.response:type_name -> streamMsg
+ 1, // 2: StreamC.ClientStream:input_type -> streamReq
+ 1, // 3: StreamC.ServerStream:input_type -> streamReq
+ 1, // 4: StreamC.DoubleStream:input_type -> streamReq
+ 2, // 5: StreamC.ClientStream:output_type -> streamResp
+ 2, // 6: StreamC.ServerStream:output_type -> streamResp
+ 2, // 7: StreamC.DoubleStream:output_type -> streamResp
+ 5, // [5:8] is the sub-list for method output_type
+ 2, // [2:5] is the sub-list for method input_type
+ 2, // [2:2] is the sub-list for extension type_name
+ 2, // [2:2] is the sub-list for extension extendee
+ 0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_testStream_proto_init() }
+func file_testStream_proto_init() {
+ if File_testStream_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_testStream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*StreamMsg); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_testStream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*StreamReq); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_testStream_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*StreamResp); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_testStream_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_testStream_proto_goTypes,
+ DependencyIndexes: file_testStream_proto_depIdxs,
+ MessageInfos: file_testStream_proto_msgTypes,
+ }.Build()
+ File_testStream_proto = out.File
+ file_testStream_proto_rawDesc = nil
+ file_testStream_proto_goTypes = nil
+ file_testStream_proto_depIdxs = nil
+}
diff --git a/network_rpc/grpc_stream/proto/testStream.proto b/network_rpc/grpc_stream/proto/testStream.proto
new file mode 100644
index 0000000..1cc1003
--- /dev/null
+++ b/network_rpc/grpc_stream/proto/testStream.proto
@@ -0,0 +1,27 @@
+syntax="proto3";
+option go_package="./;proto";
+
+
+///流式rpc 注意关键字stream
+service StreamC{
+ //客户端流式rpc
+ rpc ClientStream(stream streamReq)returns(streamResp);
+
+ //服务端流式rpc
+ rpc ServerStream(streamReq)returns(stream streamResp);
+
+ //客户端和服务端均流式rpc
+ rpc DoubleStream(stream streamReq)returns(stream streamResp);
+}
+message streamMsg{
+ string name=1;
+ int32 value=2;
+}
+
+message streamReq{
+ streamMsg request=1;
+}
+
+message streamResp{
+ streamMsg response=1;
+}
\ No newline at end of file
diff --git a/network_rpc/grpc_stream/proto/testStream_grpc.pb.go b/network_rpc/grpc_stream/proto/testStream_grpc.pb.go
new file mode 100644
index 0000000..2f4b172
--- /dev/null
+++ b/network_rpc/grpc_stream/proto/testStream_grpc.pb.go
@@ -0,0 +1,283 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.24.0
+// source: testStream.proto
+
+package proto
+
+import (
+ context "context"
+
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ StreamC_ClientStream_FullMethodName = "/StreamC/ClientStream"
+ StreamC_ServerStream_FullMethodName = "/StreamC/ServerStream"
+ StreamC_DoubleStream_FullMethodName = "/StreamC/DoubleStream"
+)
+
+// StreamCClient is the client API for StreamC service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type StreamCClient interface {
+ //客户端流式rpc
+ ClientStream(ctx context.Context, opts ...grpc.CallOption) (StreamC_ClientStreamClient, error)
+ //服务端流式rpc
+ ServerStream(ctx context.Context, in *StreamReq, opts ...grpc.CallOption) (StreamC_ServerStreamClient, error)
+ //客户端和服务端均流式rpc
+ DoubleStream(ctx context.Context, opts ...grpc.CallOption) (StreamC_DoubleStreamClient, error)
+}
+
+type streamCClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewStreamCClient(cc grpc.ClientConnInterface) StreamCClient {
+ return &streamCClient{cc}
+}
+
+func (c *streamCClient) ClientStream(ctx context.Context, opts ...grpc.CallOption) (StreamC_ClientStreamClient, error) {
+ stream, err := c.cc.NewStream(ctx, &StreamC_ServiceDesc.Streams[0], StreamC_ClientStream_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &streamCClientStreamClient{stream}
+ return x, nil
+}
+
+type StreamC_ClientStreamClient interface {
+ Send(*StreamReq) error
+ CloseAndRecv() (*StreamResp, error)
+ grpc.ClientStream
+}
+
+type streamCClientStreamClient struct {
+ grpc.ClientStream
+}
+
+func (x *streamCClientStreamClient) Send(m *StreamReq) error {
+ return x.ClientStream.SendMsg(m)
+}
+
+func (x *streamCClientStreamClient) CloseAndRecv() (*StreamResp, error) {
+ if err := x.ClientStream.CloseSend(); err != nil {
+ return nil, err
+ }
+ m := new(StreamResp)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func (c *streamCClient) ServerStream(ctx context.Context, in *StreamReq, opts ...grpc.CallOption) (StreamC_ServerStreamClient, error) {
+ stream, err := c.cc.NewStream(ctx, &StreamC_ServiceDesc.Streams[1], StreamC_ServerStream_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &streamCServerStreamClient{stream}
+ if err := x.ClientStream.SendMsg(in); err != nil {
+ return nil, err
+ }
+ if err := x.ClientStream.CloseSend(); err != nil {
+ return nil, err
+ }
+ return x, nil
+}
+
+type StreamC_ServerStreamClient interface {
+ Recv() (*StreamResp, error)
+ grpc.ClientStream
+}
+
+type streamCServerStreamClient struct {
+ grpc.ClientStream
+}
+
+func (x *streamCServerStreamClient) Recv() (*StreamResp, error) {
+ m := new(StreamResp)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func (c *streamCClient) DoubleStream(ctx context.Context, opts ...grpc.CallOption) (StreamC_DoubleStreamClient, error) {
+ stream, err := c.cc.NewStream(ctx, &StreamC_ServiceDesc.Streams[2], StreamC_DoubleStream_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &streamCDoubleStreamClient{stream}
+ return x, nil
+}
+
+type StreamC_DoubleStreamClient interface {
+ Send(*StreamReq) error
+ Recv() (*StreamResp, error)
+ grpc.ClientStream
+}
+
+type streamCDoubleStreamClient struct {
+ grpc.ClientStream
+}
+
+func (x *streamCDoubleStreamClient) Send(m *StreamReq) error {
+ return x.ClientStream.SendMsg(m)
+}
+
+func (x *streamCDoubleStreamClient) Recv() (*StreamResp, error) {
+ m := new(StreamResp)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+// StreamCServer is the server API for StreamC service.
+// All implementations must embed UnimplementedStreamCServer
+// for forward compatibility
+type StreamCServer interface {
+ //客户端流式rpc
+ ClientStream(StreamC_ClientStreamServer) error
+ //服务端流式rpc
+ ServerStream(*StreamReq, StreamC_ServerStreamServer) error
+ //客户端和服务端均流式rpc
+ DoubleStream(StreamC_DoubleStreamServer) error
+ mustEmbedUnimplementedStreamCServer()
+}
+
+// UnimplementedStreamCServer must be embedded to have forward compatible implementations.
+type UnimplementedStreamCServer struct {
+}
+
+func (UnimplementedStreamCServer) ClientStream(StreamC_ClientStreamServer) error {
+ return status.Errorf(codes.Unimplemented, "method ClientStream not implemented")
+}
+func (UnimplementedStreamCServer) ServerStream(*StreamReq, StreamC_ServerStreamServer) error {
+ return status.Errorf(codes.Unimplemented, "method ServerStream not implemented")
+}
+func (UnimplementedStreamCServer) DoubleStream(StreamC_DoubleStreamServer) error {
+ return status.Errorf(codes.Unimplemented, "method DoubleStream not implemented")
+}
+func (UnimplementedStreamCServer) mustEmbedUnimplementedStreamCServer() {}
+
+// UnsafeStreamCServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to StreamCServer will
+// result in compilation errors.
+type UnsafeStreamCServer interface {
+ mustEmbedUnimplementedStreamCServer()
+}
+
+func RegisterStreamCServer(s grpc.ServiceRegistrar, srv StreamCServer) {
+ s.RegisterService(&StreamC_ServiceDesc, srv)
+}
+
+func _StreamC_ClientStream_Handler(srv interface{}, stream grpc.ServerStream) error {
+ return srv.(StreamCServer).ClientStream(&streamCClientStreamServer{stream})
+}
+
+type StreamC_ClientStreamServer interface {
+ SendAndClose(*StreamResp) error
+ Recv() (*StreamReq, error)
+ grpc.ServerStream
+}
+
+type streamCClientStreamServer struct {
+ grpc.ServerStream
+}
+
+func (x *streamCClientStreamServer) SendAndClose(m *StreamResp) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func (x *streamCClientStreamServer) Recv() (*StreamReq, error) {
+ m := new(StreamReq)
+ if err := x.ServerStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func _StreamC_ServerStream_Handler(srv interface{}, stream grpc.ServerStream) error {
+ m := new(StreamReq)
+ if err := stream.RecvMsg(m); err != nil {
+ return err
+ }
+ return srv.(StreamCServer).ServerStream(m, &streamCServerStreamServer{stream})
+}
+
+type StreamC_ServerStreamServer interface {
+ Send(*StreamResp) error
+ grpc.ServerStream
+}
+
+type streamCServerStreamServer struct {
+ grpc.ServerStream
+}
+
+func (x *streamCServerStreamServer) Send(m *StreamResp) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func _StreamC_DoubleStream_Handler(srv interface{}, stream grpc.ServerStream) error {
+ return srv.(StreamCServer).DoubleStream(&streamCDoubleStreamServer{stream})
+}
+
+type StreamC_DoubleStreamServer interface {
+ Send(*StreamResp) error
+ Recv() (*StreamReq, error)
+ grpc.ServerStream
+}
+
+type streamCDoubleStreamServer struct {
+ grpc.ServerStream
+}
+
+func (x *streamCDoubleStreamServer) Send(m *StreamResp) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func (x *streamCDoubleStreamServer) Recv() (*StreamReq, error) {
+ m := new(StreamReq)
+ if err := x.ServerStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+// StreamC_ServiceDesc is the grpc.ServiceDesc for StreamC service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var StreamC_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "StreamC",
+ HandlerType: (*StreamCServer)(nil),
+ Methods: []grpc.MethodDesc{},
+ Streams: []grpc.StreamDesc{
+ {
+ StreamName: "ClientStream",
+ Handler: _StreamC_ClientStream_Handler,
+ ClientStreams: true,
+ },
+ {
+ StreamName: "ServerStream",
+ Handler: _StreamC_ServerStream_Handler,
+ ServerStreams: true,
+ },
+ {
+ StreamName: "DoubleStream",
+ Handler: _StreamC_DoubleStream_Handler,
+ ServerStreams: true,
+ ClientStreams: true,
+ },
+ },
+ Metadata: "testStream.proto",
+}
diff --git a/network_rpc/grpc_stream/readme.md b/network_rpc/grpc_stream/readme.md
new file mode 100644
index 0000000..57e723e
--- /dev/null
+++ b/network_rpc/grpc_stream/readme.md
@@ -0,0 +1,4 @@
+### 注意本小小节
+- 顾名思义 clientStream和clientServer分别为客户端流式rpc的客户端和服务端,同理serverStream和doubleStream
+- 注意proto文件中的stream关键词以及服务端的具体实现
+-
\ No newline at end of file
diff --git a/network_rpc/grpc_stream/server/clientStream/main.go b/network_rpc/grpc_stream/server/clientStream/main.go
new file mode 100644
index 0000000..0b29770
--- /dev/null
+++ b/network_rpc/grpc_stream/server/clientStream/main.go
@@ -0,0 +1,59 @@
+package main
+
+import (
+ "grpc_stream/proto"
+ "io"
+ "log"
+ "net"
+ "strconv"
+
+ "google.golang.org/grpc"
+)
+
+const PORT = 9092
+
+type ServerV struct {
+ proto.UnimplementedStreamCServer
+}
+
+func (s *ServerV) ClientStream(stream proto.StreamC_ClientStreamServer) error {
+ for {
+ recv, err := stream.Recv()
+ if err == io.EOF {
+ log.Printf("server recv signal to close!\n")
+ return stream.SendAndClose(&proto.StreamResp{Response: &proto.StreamMsg{
+ Name: "streamClient has received the signal of close,closing!!!!",
+ Value: int32(0)}})
+ }
+ if err != nil {
+ log.Printf("streamClient server recv failed! err:%s\n", err)
+ return err
+ }
+ log.Printf("streamClient recv name:%s value:%d \n", recv.GetRequest().Name, recv.GetRequest().Value)
+
+ }
+
+}
+
+func (s *ServerV) ServerStream(req *proto.StreamReq, stream proto.StreamC_ServerStreamServer) error {
+ return nil
+}
+
+func (s *ServerV) DoubleStream(stream proto.StreamC_DoubleStreamServer) error {
+ return nil
+}
+func main() {
+
+ server := grpc.NewServer()
+ proto.RegisterStreamCServer(server, &ServerV{})
+ conn, err := net.Listen("tcp", ":"+strconv.Itoa(PORT))
+ if err != nil {
+ log.Printf("listen %d faild! err:%s\n", PORT, err)
+ return
+ }
+ defer conn.Close()
+ err = server.Serve(conn)
+ if err != nil {
+ panic("server serve failed!!")
+ }
+}
diff --git a/network_rpc/grpc_stream/server/doubleStream/main.go b/network_rpc/grpc_stream/server/doubleStream/main.go
new file mode 100644
index 0000000..ff6c7b9
--- /dev/null
+++ b/network_rpc/grpc_stream/server/doubleStream/main.go
@@ -0,0 +1,66 @@
+package main
+
+import (
+ "grpc_stream/proto"
+ "io"
+ "log"
+ "net"
+ "strconv"
+
+ "google.golang.org/grpc"
+)
+
+const PORT = 9092
+
+type ServeC struct {
+ proto.UnimplementedStreamCServer
+}
+
+func (receiver *ServeC) ClientStream(stream proto.StreamC_ClientStreamServer) error {
+ return nil
+
+}
+func (receiver *ServeC) ServerStream(req *proto.StreamReq, stream proto.StreamC_ServerStreamServer) error {
+ return nil
+
+}
+
+func (receiver *ServeC) DoubleStream(stream proto.StreamC_DoubleStreamServer) error {
+ for i := 0; i < 100; i++ {
+ err := stream.Send(&proto.StreamResp{
+ Response: &proto.StreamMsg{
+ Name: "潘丽萍",
+ Value: int32(i),
+ },
+ })
+ if err != nil {
+ log.Printf("streamDouble get an err when sending! err:%s\n", err)
+ break
+ }
+ recv, err := stream.Recv()
+ if err == io.EOF {
+ log.Printf("streamDouble client recv finished")
+ break
+ }
+ if err != nil {
+ log.Printf("streamDoouble [client] gvet an err ! err:%s\n", err)
+ break
+ }
+ log.Printf("streamDouble client recv name:%s value:%d\n", recv.Request.Name, recv.Request.Value)
+ }
+ return nil
+
+}
+
+func main() {
+ server := grpc.NewServer()
+ proto.RegisterStreamCServer(server, &ServeC{})
+
+ conn, err := net.Listen("tcp", ":"+strconv.Itoa(PORT))
+ if err != nil {
+ log.Printf("'listen %d failed! err:%s\n", PORT, err)
+ return
+ }
+ defer conn.Close()
+ server.Serve(conn)
+}
diff --git a/network_rpc/grpc_stream/server/serverStream/main.go b/network_rpc/grpc_stream/server/serverStream/main.go
new file mode 100644
index 0000000..560e5f9
--- /dev/null
+++ b/network_rpc/grpc_stream/server/serverStream/main.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "grpc_stream/proto"
+ "log"
+ "net"
+ "strconv"
+
+ "google.golang.org/grpc"
+)
+
+const PORT = 9092
+
+type ServerV struct {
+ proto.UnimplementedStreamCServer
+}
+
+func (s *ServerV) ClientStream(stream proto.StreamC_ClientStreamServer) error {
+ return nil
+}
+
+func (s *ServerV) ServerStream(r *proto.StreamReq, stream proto.StreamC_ServerStreamServer) error {
+ log.Printf("recv name:%s value:%d\n", r.GetRequest().Name, r.Request.Value)
+ for i := 0; i < 10; i++ {
+ respMsg := &proto.StreamResp{Response: &proto.StreamMsg{
+ Name: r.Request.GetName(),
+ Value: int32(i) + r.Request.GetValue(),
+ }}
+ err := stream.Send(respMsg)
+
+ if err != nil {
+ log.Printf("")
+ return err
+ }
+ }
+ return nil
+
+}
+func (s *ServerV) DoubleStream(stream proto.StreamC_DoubleStreamServer) error {
+ return nil
+}
+
+func main() {
+ server := grpc.NewServer()
+ proto.RegisterStreamCServer(server, &ServerV{})
+
+ conn, err := net.Listen("tcp", ":"+strconv.Itoa(PORT))
+ if err != nil {
+ log.Printf("listen %d failed! err:%s\n", PORT, err)
+ return
+ }
+ defer conn.Close()
+
+ server.Serve(conn)
+}
diff --git a/network_rpc/grpc_tls/README.md b/network_rpc/grpc_tls/README.md
new file mode 100644
index 0000000..6183f51
--- /dev/null
+++ b/network_rpc/grpc_tls/README.md
@@ -0,0 +1,22 @@
+### 注意
+- 本小节为rpc添加证书,对传输数据进行加密
+- client和server为简单的tls证书认证
+```shell
+# 私钥生成
+openssl ecparam -genkey -name secp384r1 -out server.key
+#自签公钥生成
+openssl req -new -x509 -sha256 -key server.key -out server.pem -days 3650
+```
+- client_ca和server_ca为基于ca的证书认证
+```shell
+ #生成key
+ openssl ecparam -genkey -name secp384r1 -out client.key
+ #生成csr
+ openssl req -new -key client.key -out client.csr
+ #基于ca签发
+
+```
+- 注意生成自签公钥的Common name要设置,与client生成证书的serverNameOverride参数相同
+- conf文件夹为证书存放目录
+
+- 基于token的认证 client_token和server_token
diff --git a/network_rpc/grpc_tls/client/client/main.go b/network_rpc/grpc_tls/client/client/main.go
new file mode 100644
index 0000000..07b4267
--- /dev/null
+++ b/network_rpc/grpc_tls/client/client/main.go
@@ -0,0 +1,39 @@
+package main
+
+import (
+ "context"
+ "log"
+ "strconv"
+
+ grpc_tls "github.com/grpc_tls/proto"
+
+ "google.golang.org/grpc/credentials"
+
+ "google.golang.org/grpc"
+)
+
+const PORT = 9091
+
+func main() {
+ //客户端生成证书
+ cert, err := credentials.NewClientTLSFromFile("./../../conf/tls/server.pem", "*.bytefree.com")
+ if err != nil {
+ log.Printf("[client] generate cert failed! err:%s\n", err)
+ return
+ }
+ //创建连接
+ conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(cert))
+ if err != nil {
+ log.Printf("[client] connect to %d failed! err:%s\n", PORT, err)
+ return
+ }
+ defer conn.Close()
+ client := grpc_tls.NewSearchCClient(conn)
+ resp, err := client.Search(context.Background(), &grpc_tls.Req{Request: "潘丽萍"})
+ if err != nil {
+ log.Printf("[client] rpc invoke failed! err:%s\n", err)
+ return
+ }
+ log.Printf("[client] resp value:%s\n", resp.GetResponse())
+
+}
diff --git a/network_rpc/grpc_tls/client/client_ca/main.go b/network_rpc/grpc_tls/client/client_ca/main.go
new file mode 100644
index 0000000..c3c3ce7
--- /dev/null
+++ b/network_rpc/grpc_tls/client/client_ca/main.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+ "context"
+ "crypto/tls"
+ "crypto/x509"
+ "io/ioutil"
+ "log"
+ "strconv"
+
+ "google.golang.org/grpc/credentials"
+
+ grpc_tls "github.com/grpc_tls/proto"
+
+ "google.golang.org/grpc"
+)
+
+const PORT = 9091
+
+func main() {
+ cert, err := tls.LoadX509KeyPair("./../../conf/tls_ca/client.pem", "./../../conf/tls_ca/client.key")
+ if err != nil {
+ log.Printf("[client] load key pairs failed! err:%s\n")
+ return
+ }
+ certPool := x509.NewCertPool()
+ ca, err := ioutil.ReadFile("./../../conf/tls_ca/ca.crt")
+ if err != nil {
+ log.Printf("[client] read ca file failed! err:%s\n", err)
+ return
+ }
+ ok := certPool.AppendCertsFromPEM(ca)
+ if !ok {
+ log.Printf("[client] append certs failed! err:%s\n")
+ return
+ }
+ newTLS := credentials.NewTLS(&tls.Config{
+ // 设置证书链,允许包含一个或多个
+ Certificates: []tls.Certificate{cert},
+ // 要求必须校验客户端的证书
+ ServerName: "*.bytefree.com",
+ RootCAs: certPool,
+ })
+ if err != nil {
+ log.Printf("[client] generate tls failed! err:%s\n", err)
+ return
+ }
+ conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(newTLS))
+ //conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(insecure.NewCredentials()))
+ if err != nil {
+ log.Printf("connection create failed! %s\n", err)
+ return
+ }
+ client := grpc_tls.NewSearchCClient(conn)
+ resp, err := client.Search(context.Background(), &grpc_tls.Req{
+ Request: "潘丽萍",
+ })
+ if err != nil {
+ log.Printf("[client] rpc invoke failed! err:%s\n", err)
+ return
+ }
+ log.Printf("[client] resp value:%s\n", resp.GetResponse())
+}
diff --git a/network_rpc/grpc_tls/client/client_token/main.go b/network_rpc/grpc_tls/client/client_token/main.go
new file mode 100644
index 0000000..f5a32c5
--- /dev/null
+++ b/network_rpc/grpc_tls/client/client_token/main.go
@@ -0,0 +1,38 @@
+package main
+
+import (
+ "context"
+ "log"
+ "strconv"
+
+ grpc_tls "github.com/grpc_tls/proto"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+const PORT = 9090
+
+type ClientTokenAuth struct {
+}
+
+func (receiver ClientTokenAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
+ return map[string]string{
+ "user": "潘丽萍",
+ "id": "123456",
+ }, nil
+
+}
+
+func (receiver ClientTokenAuth) RequireTransportSecurity() bool {
+ return false
+}
+func main() {
+ conn, err := grpc.Dial(":"+strconv.Itoa(PORT), grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithPerRPCCredentials(new(ClientTokenAuth)))
+ if err != nil {
+ log.Printf("create connection failed! %s", err)
+ return
+ }
+ client := grpc_tls.NewSearchCClient(conn)
+ resp, _ := client.Search(context.Background(), &grpc_tls.Req{Request: "潘丽萍"})
+ log.Printf("recv value:%s\n", resp.GetResponse())
+}
diff --git a/network_rpc/grpc_tls/conf/tls/ca.crt b/network_rpc/grpc_tls/conf/tls/ca.crt
new file mode 100644
index 0000000..97150c6
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/ca.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDETCCAfkCFAEuCBOKWJUYALvzFa0zpbPnbbivMA0GCSqGSIb3DQEBCwUAMEUx
+CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
+cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjMxMjEyMTIwOTQ2WhcNMjQxMjExMTIw
+OTQ2WjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE
+CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAqhyRKXabwPRFbmTmg5Re5i8A2KNl4RU6e0RE/PhVJrnu1uGv
+26MgaH0aaUBRFVjiWVEuwbRU+nlmyiTJCvES8lNdzlunXN9L5Bmam8ALEq5clu5R
+0sXLAm8TSfJpOsMUS40pbRLGMoOPf7pxedlx+Wp3DJw5fHSNK1fEJ2HfKzVmjpAE
+0XXsoSIpJh0OFtQvlP7munuJBZExmcwNWieCCJ+2UbQXUA5gws9uWeuZ16NjDTHt
+NZXpsJistMVkUy9MWTXzy3jeZMNut45+x3K5pmeQRUZl5xzzKbCo/Q04tN+DmHtb
+ljtRmFrFe9GIjbv8WHgIpdmGWTSQuCKmtYqLHQIDAQABMA0GCSqGSIb3DQEBCwUA
+A4IBAQAaycuK6Y6/GvyfXWsrMshvrIKFwgda17dGtgwXF0n0YHi/STFNOqB/3qHA
+Eh+W+Aoau8ZgRt6eq2wcqRJnH443H+UrwhuirGDGdZzqx3xANdpTcR64bLwuPmD1
+ohV0AWq4rKuV8APgmfGjQEsW8i3BpvhWLs409O2YHHkrE4oXG9JTQVknCt3Fkdtn
+j3VfPBguDfAVjPV8hIbSDAz0Up20gZJ5fX02BnNIwVmVQK+9smAT7Ovm1lIhM27k
+ndja47eOwS9Gk60c3hTMNsPLiH4RTGU6WUehp1AyRIhEQrQiVjucLs/4TUzJLlNK
+UUMhei5jjwMUGAYlIL22ub61Ik1L
+-----END CERTIFICATE-----
diff --git a/network_rpc/grpc_tls/conf/tls/ca.csr b/network_rpc/grpc_tls/conf/tls/ca.csr
new file mode 100644
index 0000000..1e73316
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/ca.csr
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
+ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKockSl2m8D0RW5k5oOUXuYvANijZeEVOntERPz4
+VSa57tbhr9ujIGh9GmlAURVY4llRLsG0VPp5ZsokyQrxEvJTXc5bp1zfS+QZmpvA
+CxKuXJbuUdLFywJvE0nyaTrDFEuNKW0SxjKDj3+6cXnZcflqdwycOXx0jStXxCdh
+3ys1Zo6QBNF17KEiKSYdDhbUL5T+5rp7iQWRMZnMDVonggiftlG0F1AOYMLPblnr
+mdejYw0x7TWV6bCYrLTFZFMvTFk188t43mTDbreOfsdyuaZnkEVGZecc8ymwqP0N
+OLTfg5h7W5Y7UZhaxXvRiI27/Fh4CKXZhlk0kLgiprWKix0CAwEAAaAAMA0GCSqG
+SIb3DQEBCwUAA4IBAQBTheM4sDs8gNXz0Y5xPsDFeP0k1bPOyqoZxvATPeZLZ5JZ
+7SkWaWzWlftRp+fEGppsrVTSSTZRGrbXyfHTeweb2UGzA3G4icaOEUPOb/LyW0Oc
+9MPabeU4amGjaC0cuZOugYXrlsSWk+NCgkQ0hBnOoygmstvLUF6c6AUFYjI/UEYI
+5iMzBAgmgO6nMnA6u0vcM5su60Hz93e6lNDg6gk+XtGSVEMInLRZ937CKWVjG558
+hnTmW9BjljsbqlXAY60XxZ+VT7Evj7i+6VAzNTksPbj5jawIBVI9HB7SKH1yTE3D
+Wvz0lw7U+IRFhRWXIBo5xOuLS4/VigbOQ4rcIqST
+-----END CERTIFICATE REQUEST-----
diff --git a/network_rpc/grpc_tls/conf/tls/ca.key b/network_rpc/grpc_tls/conf/tls/ca.key
new file mode 100644
index 0000000..7c505dc
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/ca.key
@@ -0,0 +1,30 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIFAKoopWHtIMCAggA
+MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECJSOfxiRv4UMBIIEyMdGIegnASqv
+L76yHB72NicmMCX//QVycC3ryA861Qh+LFQZ0oQ9AT9Q047XP9sF60KAJGaauods
+p2hBBDLIPRIw9g3RpEEVFmYBIvCVywrrfcuXTAwG7Dn4zvG4lLQuAwFXniiyFlmJ
+wrZF1wWacY3hnKX2MhfjfXGedq1GJxyamLV/AlYDAWd1GCS25RcdpABnmsMx2aXY
+V775HZEFySKni5dxbUtV02pRTOF11HPAXlSwaRv2Mf7gt/WHwGYwMPwAid42I0cU
+9gG0L7SnlRjVPJ9XRB8my3ryDlNTEx5xuPk0bAtBtCXIZWGVpOYPF+Xaj38RhBhK
+X17vSG2y7f52AGKjmSeNk9dPGHD2Yy0N7zdGwhrI4DlBvdMAZorxlY4EM4+32V0T
+5MVTDWfaXGyPvUTP6lX9Q6iVyMFFtNO5oCoe2A2NCbi2EO5+rjEgMkcu6MxYyNmi
+zgX40m531p+f6fiwLOZhhigwmoazEV9TA65z04gne9bfEAxgXjjzoxaNqHYj4Loy
+0eMovbb5IWBhUGLKlU6PCegYsvGRq5zo05h9Mz+Cf8X82tKIF0faRoypHqrwQTbw
+lPekQN+NSZgaW9SXbhGfqiVqxXFJZu848tKYfaFj6EKStD+Ig6yzVK5ZteLww7a5
+LeZQyZXR36Zb5mjqlv4liAz4kZORiAfM+xNcPSeVUmkSb4w44FkWDFJxcMiqDKV1
+htauW9+rzNQFzOMdzbvJbstNYy3iTrGzafNz2qGz00TuUdd6UopUPZtRKDFqzVSz
+n8cd5yt9NxliycUzdxlAH7LV51EUBZeALxQayKmZT51qZMS5kZOmtw6vKH8jdOrO
+dpjx9uriv3LWCcUx/8yvggbTmmsAFXysnh70JLv6yqFOzp35Imzq2nXGGdfBdcEZ
+aMFaGI9OFrSbbYHtpCaqSfcnG8ph8avj7R97e2PmSoW2yqbF0O6NA1z85AwR6IWW
+N0s4Q8wjxygdLfoKOgogXUltiU4PTnU9UIrBT+062DOyUKIvMT9tdg7G8Njkkrp4
+3FrfZs+VhbdS62OPH9rd/AXenSSBPcc74emt9j7Ib6ucli1LXFPYa/gyvYqD7EOh
+BKFz+mz0MCO2Sa3lkHvxoj60+6oaUxwqwuFTsMX8zX2NoS248Y9WDa26WtP3Ct0w
+wggDv/7TdqRjnHw8AomVDoAgtCMaPSpyNSE2uFvNGOHIs5x1CG8Oiu+/oSN3x/xf
+vbe4fogrHy9CzDt2DNl11rgHiYC12FsNuCos9ukhZeirqxqPfLiYx0hqLeui9aV+
+O0kEzyHrcB63wyy89bTn0aLuuQj6HKsfqzohaHLgcxdZYRIbfW1f8Yn3mw8OFIKO
+Hc5nMwEQ1WFxIHYDtMhE2SznyvSOuO0bCTZRlRqxoYoH7kDWHYBdmT5hotZDfv/U
+MKjaPTfxcg5eE5mwTWP3AteYptqoMsVf+SOfAZsRA3MmLK30zWzTccRPUxYVPoon
+THi+2U1ZWWSEieQDAqWxOTXz0hqNxHS2NQWMSABGTaUTfzswO+rW13E+e7zNZzKh
+kFafiLTSOAYO24L7I8kQl0D47rZSwKK8WKPiFrYVw1+DQZkFE7TgCvskHZakDIjy
+E5aV+95RgWqiX6EZWGPWEg==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/network_rpc/grpc_tls/conf/tls/ca.srl b/network_rpc/grpc_tls/conf/tls/ca.srl
new file mode 100644
index 0000000..c7f2a8d
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/ca.srl
@@ -0,0 +1 @@
+7F9FEE97DC2BAC607B1CE09D7BAB5FC40DCAC57A
diff --git a/network_rpc/grpc_tls/conf/tls/openssl.cfg b/network_rpc/grpc_tls/conf/tls/openssl.cfg
new file mode 100644
index 0000000..86ea213
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/openssl.cfg
@@ -0,0 +1,393 @@
+
+#
+# OpenSSL example configuration file.
+# See doc/man5/config.pod for more info.
+#
+# This is mostly being used for generation of certificate requests,
+# but may be used for auto loading of providers
+
+# Note that you can include other files from the main configuration
+# file using the .include directive.
+#.include filename
+
+# This definition stops the following lines choking if HOME isn't
+# defined.
+HOME = .
+
+ # Use this in order to automatically load providers.
+openssl_conf = openssl_init
+
+# Comment out the next line to ignore configuration errors
+config_diagnostics = 1
+
+# Extra OBJECT IDENTIFIER info:
+# oid_file = $ENV::HOME/.oid
+oid_section = new_oids
+
+# To use this configuration file with the "-extfile" option of the
+# "openssl x509" utility, name here the section containing the
+# X.509v3 extensions to use:
+# extensions =
+# (Alternatively, use a configuration file that has only
+# X.509v3 extensions in its main [= default] section.)
+
+[ new_oids ]
+# We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
+# Add a simple OID like this:
+# testoid1=1.2.3.4
+# Or use config file substitution like this:
+# testoid2=${testoid1}.5.6
+
+# Policies used by the TSA examples.
+tsa_policy1 = 1.2.3.4.1
+tsa_policy2 = 1.2.3.4.5.6
+tsa_policy3 = 1.2.3.4.5.7
+
+# For FIPS
+# Optionally include a file that is generated by the OpenSSL fipsinstall
+# application. This file contains configuration data required by the OpenSSL
+# fips provider. It contains a named section e.g. [fips_sect] which is
+# referenced from the [provider_sect] below.
+# Refer to the OpenSSL security policy for more information.
+# .include fipsmodule.cnf
+
+[openssl_init]
+providers = provider_sect
+
+# List of providers to load
+[provider_sect]
+default = default_sect
+# The fips section name should match the section name inside the
+# included fipsmodule.cnf.
+# fips = fips_sect
+
+# If no providers are activated explicitly, the default one is activated implicitly.
+# See man 7 OSSL_PROVIDER-default for more details.
+#
+# If you add a section explicitly activating any other provider(s), you most
+# probably need to explicitly activate the default provider, otherwise it
+# becomes unavailable in openssl. As a consequence applications depending on
+# OpenSSL may not work correctly which could lead to significant system
+# problems including inability to remotely access the system.
+[default_sect]
+# activate = 1
+
+
+####################################################################
+[ ca ]
+default_ca = CA_default # The default ca section
+
+####################################################################
+[ CA_default ]
+
+dir = ./demoCA # Where everything is kept
+certs = $dir/certs # Where the issued certs are kept
+crl_dir = $dir/crl # Where the issued crl are kept
+database = $dir/index.txt # database index file.
+#unique_subject = no # Set to 'no' to allow creation of
+ # several certs with same subject.
+new_certs_dir = $dir/newcerts # default place for new certs.
+
+certificate = $dir/cacert.pem # The CA certificate
+serial = $dir/serial # The current serial number
+crlnumber = $dir/crlnumber # the current crl number
+ # must be commented out to leave a V1 CRL
+crl = $dir/crl.pem # The current CRL
+private_key = $dir/private/cakey.pem# The private key
+
+x509_extensions = usr_cert # The extensions to add to the cert
+
+# Comment out the following two lines for the "traditional"
+# (and highly broken) format.
+name_opt = ca_default # Subject Name options
+cert_opt = ca_default # Certificate field options
+
+# Extension copying option: use with caution.
+copy_extensions = copy
+
+# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
+# so this is commented out by default to leave a V1 CRL.
+# crlnumber must also be commented out to leave a V1 CRL.
+# crl_extensions = crl_ext
+
+default_days = 365 # how long to certify for
+default_crl_days= 30 # how long before next CRL
+default_md = default # use public key default MD
+preserve = no # keep passed DN ordering
+
+# A few difference way of specifying how similar the request should look
+# For type CA, the listed attributes must be the same, and the optional
+# and supplied fields are just that :-)
+policy = policy_match
+
+# For the CA policy
+[ policy_match ]
+countryName = match
+stateOrProvinceName = match
+organizationName = match
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+# For the 'anything' policy
+# At this point in time, you must list all acceptable 'object'
+# types.
+[ policy_anything ]
+countryName = optional
+stateOrProvinceName = optional
+localityName = optional
+organizationName = optional
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+####################################################################
+[ req ]
+default_bits = 2048
+default_keyfile = privkey.pem
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+x509_extensions = v3_ca # The extensions to add to the self signed cert
+
+# Passwords for private keys if not present they will be prompted for
+# input_password = secret
+# output_password = secret
+
+# This sets a mask for permitted string types. There are several options.
+# default: PrintableString, T61String, BMPString.
+# pkix : PrintableString, BMPString (PKIX recommendation before 2004)
+# utf8only: only UTF8Strings (PKIX recommendation after 2004).
+# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
+# MASK:XXXX a literal mask value.
+# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
+string_mask = utf8only
+
+ req_extensions = v3_req # The extensions to add to a certificate request
+
+[ req_distinguished_name ]
+countryName = Country Name (2 letter code)
+countryName_default = AU
+countryName_min = 2
+countryName_max = 2
+
+stateOrProvinceName = State or Province Name (full name)
+stateOrProvinceName_default = Some-State
+
+localityName = Locality Name (eg, city)
+
+0.organizationName = Organization Name (eg, company)
+0.organizationName_default = Internet Widgits Pty Ltd
+
+# we can do this but it is not needed normally :-)
+#1.organizationName = Second Organization Name (eg, company)
+#1.organizationName_default = World Wide Web Pty Ltd
+
+organizationalUnitName = Organizational Unit Name (eg, section)
+#organizationalUnitName_default =
+
+commonName = Common Name (e.g. server FQDN or YOUR name)
+commonName_max = 64
+
+emailAddress = Email Address
+emailAddress_max = 64
+
+# SET-ex3 = SET extension number 3
+
+[ req_attributes ]
+challengePassword = A challenge password
+challengePassword_min = 4
+challengePassword_max = 20
+
+unstructuredName = An optional company name
+
+[ usr_cert ]
+
+# These extensions are added when 'ca' signs a request.
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+# This is required for TSA certificates.
+# extendedKeyUsage = critical,timeStamping
+
+[ v3_req ]
+subjectAltName = @alt_names
+# Extensions to add to a certificate request
+
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+[ alt_names ]
+DNS.1 = *.bytefree.com
+
+[ v3_ca ]
+
+
+# Extensions for a typical CA
+
+
+# PKIX recommendation.
+
+subjectKeyIdentifier=hash
+
+authorityKeyIdentifier=keyid:always,issuer
+
+basicConstraints = critical,CA:true
+
+# Key usage: this is typical for a CA certificate. However since it will
+# prevent it being used as an test self-signed certificate it is best
+# left out by default.
+# keyUsage = cRLSign, keyCertSign
+
+# Include email address in subject alt name: another PKIX recommendation
+# subjectAltName=email:copy
+# Copy issuer details
+# issuerAltName=issuer:copy
+
+# DER hex encoding of an extension: beware experts only!
+# obj=DER:02:03
+# Where 'obj' is a standard or added object
+# You can even override a supported extension:
+# basicConstraints= critical, DER:30:03:01:01:FF
+
+[ crl_ext ]
+
+# CRL extensions.
+# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
+
+# issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+[ proxy_cert_ext ]
+# These extensions should be added when creating a proxy certificate
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+# This really needs to be in place for it to be a proxy certificate.
+proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
+
+####################################################################
+[ tsa ]
+
+default_tsa = tsa_config1 # the default TSA section
+
+[ tsa_config1 ]
+
+# These are used by the TSA reply generation only.
+dir = ./demoCA # TSA root directory
+serial = $dir/tsaserial # The current serial number (mandatory)
+crypto_device = builtin # OpenSSL engine to use for signing
+signer_cert = $dir/tsacert.pem # The TSA signing certificate
+ # (optional)
+certs = $dir/cacert.pem # Certificate chain to include in reply
+ # (optional)
+signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
+signer_digest = sha256 # Signing digest to use. (Optional)
+default_policy = tsa_policy1 # Policy if request did not specify it
+ # (optional)
+other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
+digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory)
+accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
+clock_precision_digits = 0 # number of digits after dot. (optional)
+ordering = yes # Is ordering defined for timestamps?
+ # (optional, default: no)
+tsa_name = yes # Must the TSA name be included in the reply?
+ # (optional, default: no)
+ess_cert_id_chain = no # Must the ESS cert id chain be included?
+ # (optional, default: no)
+ess_cert_id_alg = sha1 # algorithm to compute certificate
+ # identifier (optional, default: sha1)
+
+[insta] # CMP using Insta Demo CA
+# Message transfer
+server = pki.certificate.fi:8700
+# proxy = # set this as far as needed, e.g., http://192.168.1.1:8080
+# tls_use = 0
+path = pkix/
+
+# Server authentication
+recipient = "/C=FI/O=Insta Demo/CN=Insta Demo CA" # or set srvcert or issuer
+ignore_keyusage = 1 # potentially needed quirk
+unprotected_errors = 1 # potentially needed quirk
+extracertsout = insta.extracerts.pem
+
+# Client authentication
+ref = 3078 # user identification
+secret = pass:insta # can be used for both client and server side
+
+# Generic message options
+cmd = ir # default operation, can be overridden on cmd line with, e.g., kur
+
+# Certificate enrollment
+subject = "/CN=openssl-cmp-test"
+newkey = insta.priv.pem
+out_trusted = insta.ca.crt
+certout = insta.cert.pem
+
+[pbm] # Password-based protection for Insta CA
+# Server and client authentication
+ref = $insta::ref # 3078
+secret = $insta::secret # pass:insta
+
+[signature] # Signature-based protection for Insta CA
+# Server authentication
+trusted = insta.ca.crt # does not include keyUsage digitalSignature
+
+# Client authentication
+secret = # disable PBM
+key = $insta::newkey # insta.priv.pem
+cert = $insta::certout # insta.cert.pem
+
+[ir]
+cmd = ir
+
+[cr]
+cmd = cr
+
+[kur]
+# Certificate update
+cmd = kur
+oldcert = $insta::certout # insta.cert.pem
+
+[rr]
+# Certificate revocation
+cmd = rr
+oldcert = $insta::certout # insta.cert.pem
diff --git a/network_rpc/grpc_tls/conf/tls/server.csr b/network_rpc/grpc_tls/conf/tls/server.csr
new file mode 100644
index 0000000..0c41348
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/server.csr
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICzjCCAbYCAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
+ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALIp0Sr9xdjYvVBdUVZkz6sV+JrnTdhMpiZBf98D
+ozF3YT4ua5z2gpjlJREWhdvz0Q8haHVU/G5/7fC5tHqOctjRTv9BK+2J2sC+XDHG
+pH5ZQjEz7lBB0XbwFsRGpZK6zVeXKVUz7u6Ly2A4RCpC9IrvHanaKbh0NAw4nbdl
+lleHytwRlJbs29pPnk25yPrIQUUnwJnKw3u5yqq8HEk7jq2jin6Kq+xUb3gsfW5C
+7O9sJjHM3cz8JcZ0zci09xbJlgLlvclLbFfWOYRNCg1oUd6owC3mqO4oW5Fmwand
+BCu7AS+bzPffYdmeHVsiUdcXJHDCh4yM3R/JiiePP3HhqW8CAwEAAaBEMEIGCSqG
+SIb3DQEJDjE1MDMwGQYDVR0RBBIwEIIOKi5ieXRlZnJlZS5jb20wCQYDVR0TBAIw
+ADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQELBQADggEBADVM44MLwJE0F0Jf0Yjf
+FDelEjFnxOX0kjy413X8RAbUtte8b/eilhf6KujKtRg99uOX0SgHvjl1rKcvgsdR
+68/7t+CRj4szM5xgL9NXtmoPQVl5naMDuvL7J+cefpdUoPWptZtHSimY4hPMS9dB
+DR4DuvLTVqwm8F8+pbfVCltUDu8MOBvjjCpsg3gUBsmdkMaMObR+1Uul7fXYnZas
+OKSaPUCAkoPbZaujHL1CbGKEz352oaPP8iZHMv19dQCxP1j3nj50SkVFpmrcfPoZ
+mYO+/jT93g+9ByUtNsJPQW9S0lPryu7xA+oOXaIDHV7Y1+G9rTxjFCGipzTYQ7st
+IgU=
+-----END CERTIFICATE REQUEST-----
diff --git a/network_rpc/grpc_tls/conf/tls/server.key b/network_rpc/grpc_tls/conf/tls/server.key
new file mode 100644
index 0000000..275df64
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/server.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyKdEq/cXY2L1Q
+XVFWZM+rFfia503YTKYmQX/fA6Mxd2E+Lmuc9oKY5SURFoXb89EPIWh1VPxuf+3w
+ubR6jnLY0U7/QSvtidrAvlwxxqR+WUIxM+5QQdF28BbERqWSus1XlylVM+7ui8tg
+OEQqQvSK7x2p2im4dDQMOJ23ZZZXh8rcEZSW7NvaT55Nucj6yEFFJ8CZysN7ucqq
+vBxJO46to4p+iqvsVG94LH1uQuzvbCYxzN3M/CXGdM3ItPcWyZYC5b3JS2xX1jmE
+TQoNaFHeqMAt5qjuKFuRZsGp3QQruwEvm8z332HZnh1bIlHXFyRwwoeMjN0fyYon
+jz9x4alvAgMBAAECggEAFuLFQisAF6dbxi9+i8T+YiE74pYUy1SpQR/Hz7t1YpzN
+qoGnBC4sP3yr4sKMZmEu+S0W8H9+v6kCRRptwxJ6UTyt058pB+Xd6kVprWExbyOD
+G7PqiHez8v3LRuI2UZ9aUkaSIiY+KnldohoIM4+PPyuRGWjzVATlTK6XH+BWTB7n
+mntDmP0E00nbti9oPTNApx3eTxkc2zCaDVJlQ48cqmJEugcq9hzvFthXIhcf7u/P
+YZ+VoYeM2yHdnHtur1MJjfV/KGTR333/k96AAxlnjDETo3sGR3h2pRBcKyKUQYiR
+vnmBztj96Y/BQYZNT4VvphUh8oxZ5rncAQENYoMoaQKBgQDxVQ5Jb7RT1nRZz4vh
++UeYk5AsU5ZW1Rnig5jdu6cYjWAuOE5pTdO4CoT6k+FnI17OskmHFFih9nXWrYIp
+q2JLz3fJjC3ABqmGVLCmLjxvzGyEkNZYKWNS2REbFENHIcUCZPevPNywGpLp5e4s
+NZOAF8MQwZjqHHZqxivOsFaCxwKBgQC8/ebX5QQz5NF9sPlrGam3Q4KVefax8byX
+MM80s6vW253HZaLYlsBq7OtHXAm7AucnQYJ6xJWD0neymVHBATkSTxHm3Kx7XSzJ
+/zZXJHn/+cw14TDMwypx/vW3wCKwjXDDmUOamF2EzMDTWy/VekN9EtXVOR3PILUQ
+TTXQlrX8GQKBgQDt7gKw6j2qboO1zAbImsE4rzt0SFCveVgU19ONwKXEchYCW6cK
+8R0slMp4VfXjfp7JQEN3ttqPi/Kv3c63kG3P+lLKVbcBXFAkzTiADpOtUaknpbh9
+oQh4tOPFg9u0tJmMe8kqbuHRidGQYw3Hbmbm4gaCbax6G+ev64NjOr2AHwKBgCk9
+iosgCXu9ec1gufyZ/APmsm8lzyRjaNDhMMYCUwQupk5lqlRzCQgMLQdEWUc6yfAy
+BmP909aRLdeGR2XDe424PWLQUr8UxPpLO7NmXUzzWJGFU13LVM7NYRc40RkPtESq
+hCsPBpE9EPLOGjEOXf3EB29g6FVTgM9O2ehrisi5AoGBAIVMtwOAiQOtVgmYXrSz
+DLVTM/kOr//mn19tLNv6VmIREcWzBacbv6r10ZW4Q2xXVInBIk9U2cptCVrdDSc5
+8LXIHfyx/SoxHairBYeFQwALh+1jxIMu8hXmIt5OTrss6cJhVzQ3wvqMkvITGfeg
+wFxNGFhQstGV0VmOiqNe2FnO
+-----END PRIVATE KEY-----
diff --git a/network_rpc/grpc_tls/conf/tls/server.pem b/network_rpc/grpc_tls/conf/tls/server.pem
new file mode 100644
index 0000000..55ff900
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls/server.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID2jCCAsKgAwIBAgIUf5/ul9wrrGB7HOCde6tfxA3KxXowDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMzEyMTIxMjExMzBaFw0yNDEy
+MTExMjExMzBaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
+HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCyKdEq/cXY2L1QXVFWZM+rFfia503YTKYmQX/fA6Mx
+d2E+Lmuc9oKY5SURFoXb89EPIWh1VPxuf+3wubR6jnLY0U7/QSvtidrAvlwxxqR+
+WUIxM+5QQdF28BbERqWSus1XlylVM+7ui8tgOEQqQvSK7x2p2im4dDQMOJ23ZZZX
+h8rcEZSW7NvaT55Nucj6yEFFJ8CZysN7ucqqvBxJO46to4p+iqvsVG94LH1uQuzv
+bCYxzN3M/CXGdM3ItPcWyZYC5b3JS2xX1jmETQoNaFHeqMAt5qjuKFuRZsGp3QQr
+uwEvm8z332HZnh1bIlHXFyRwwoeMjN0fyYonjz9x4alvAgMBAAGjgcEwgb4wGQYD
+VR0RBBIwEIIOKi5ieXRlZnJlZS5jb20wCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAw
+HQYDVR0OBBYEFCBHRrM5wIIp9UBukIXd/JdrgguiMGoGA1UdIwRjMGGhSaRHMEUx
+CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
+cm5ldCBXaWRnaXRzIFB0eSBMdGSCFAEuCBOKWJUYALvzFa0zpbPnbbivMA0GCSqG
+SIb3DQEBCwUAA4IBAQBQVy3sDwhuLPL2tp+rKkEAlz6PEpFTX9t9RvzAQ7z4K7ls
+2slG5V8j18666W9wNiu/HHQYTstHS3o1pqFJC2JwmDuLmr1aTYXBsl1U+uKZJE/N
+0RLj+Hk4ZNLx3SNV0bUOr7Oe6cQgj7zrDih+0n+LApxCY8QLOh7YfR9sf8gpTc+G
+5GVO9MHqoS2GvXde5oLthSWxflB6ye7gwNrZWSGr7DKtH0ZkOu5FUcZbh/hq7p+L
+yt8tiSijx//Yg+Cxmy78OXFLvSuhggziZ/P+pDb8dMFmYgzvyeWDzo5Fd6g6zEKj
+XFpAtgxJXW2BRfy8kUqYO+rYUQPXg4KG8KfAs6YV
+-----END CERTIFICATE-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/ca.crt b/network_rpc/grpc_tls/conf/tls_ca/ca.crt
new file mode 100644
index 0000000..5b58131
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/ca.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDETCCAfkCFFsdyu96w9g2BLhp6GPDCptXhpHhMA0GCSqGSIb3DQEBCwUAMEUx
+CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
+cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjMxMjEyMTIxNjMxWhcNMjQxMjExMTIx
+NjMxWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE
+CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA0/YNfuxXs77v/XdqXwG8+mWunvQV7FJUJoUCReu5A863dwSC
+mg5nZVINlp/qbbS1YD8F+bg9PLIEcNncD9B9AjmuYhL/0yQSbm7wbzYc+RkdFhrf
+264FvRdNJE4DxCjnHv96jDnon/jM2n0nh/XgIALltpOKbtb0HNFbClbTOz7IPT73
+gXFOJiXiRqo9JFcRQeoG9naD0w184zN5+kU3lQ7T8ochgC59onRb94Mm51G2VlTf
+SwMDfM6xW0xsYv19XpFZgwe6XRM3rtyizhVGUX0wIyxLTx1ci6y30UPLN6sDIbmO
+A9SPVrxuP1aL9bukqFPkfEeMXLT1heqHJq2UAwIDAQABMA0GCSqGSIb3DQEBCwUA
+A4IBAQCAWXejKHW6PdG9YRsIj/ZHt4jgtyteUYmDHoMo8F3JqZnQi84vrwvmceRC
+Dh7UeHOe0ode95xsiSbLvtIt5UgsPWwhpagCeHhDwAKUhq2GuDEjW0vKO9lyjrZq
+kVARR/x8ABEPBEALz8aBzz+iNdhWcn92qNoODbfK0L9sOUwI+BO/1WbeuvKx0lsQ
+rby6kr/DpafKnnL98IcjT6segBgOIP0V90tWkaygvgSXEjObjE8Eo6ETodHKlixs
+x1LDclJO7Lib3G5ZqW4qOhy8F4ycCYlmZKQSrSPV44irq5iPyfz57bqRW4mNWQip
+u/czS4nE0AEg5X1o6oe+r1B/kMGv
+-----END CERTIFICATE-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/ca.csr b/network_rpc/grpc_tls/conf/tls_ca/ca.csr
new file mode 100644
index 0000000..7f6d3d3
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/ca.csr
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
+ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBANP2DX7sV7O+7/13al8BvPplrp70FexSVCaFAkXr
+uQPOt3cEgpoOZ2VSDZaf6m20tWA/Bfm4PTyyBHDZ3A/QfQI5rmIS/9MkEm5u8G82
+HPkZHRYa39uuBb0XTSROA8Qo5x7/eow56J/4zNp9J4f14CAC5baTim7W9BzRWwpW
+0zs+yD0+94FxTiYl4kaqPSRXEUHqBvZ2g9MNfOMzefpFN5UO0/KHIYAufaJ0W/eD
+JudRtlZU30sDA3zOsVtMbGL9fV6RWYMHul0TN67cos4VRlF9MCMsS08dXIust9FD
+yzerAyG5jgPUj1a8bj9Wi/W7pKhT5HxHjFy09YXqhyatlAMCAwEAAaAAMA0GCSqG
+SIb3DQEBCwUAA4IBAQAMnmdbCoGcpL5IEXTPACkRv7fp6A8WOAIPO0ZCKURgRdEU
+o/6GSABypm4G6hufaLG3ZNP7PkRs3IKtbu5lZGkapyZCsyThDBhbICQ1+1AGxdbO
+X315ZwqhWntq0SpqPCnkYe+IF07Svftx9iLqbY3/DLH+x2+8wHPSiY8EY6stoFyI
+UiUhpZBtq4LJLe5bM7zBEsMNavbltAQCTut4LKc173P3Ibwp8BaZKvhBR9pvNim9
+R5bhnXlAgh3KF79CorkY2lQIqs4LE27DQ37qObwjvHTWoO+X+Zv7iJjxmqK2PfUg
+Tbs2/JFzovjt4VYHbW8W4PZy+AH6C6Aalui8gTgK
+-----END CERTIFICATE REQUEST-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/ca.key b/network_rpc/grpc_tls/conf/tls_ca/ca.key
new file mode 100644
index 0000000..1e8c63b
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/ca.key
@@ -0,0 +1,30 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIShjUJjjGNjUCAggA
+MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECFZewJqEzMauBIIEyEXQCtEqRUZ/
++8J/nfQamZn+A2U7Ci37fHFZBmFLoD09azE49YIIJA/WeWiMX3Z3TgTDCaJUsrd2
+kCFwpFpXGr6KkyrIqWKg0QNsM2j4FNZTJMmslhQrktEobnRDJx5MRDVTpOCHmkUV
+PxqU3S/wcElW3FBgqpUgvKzRwCqIHKd2vkwAgxLHuUSgiupI1OY9ybU3nUNp8DFR
+LZBibLXjlUMSUEd9FlA/+iNtsnWw9smrqtogzuwtfffFMFyj+H3dRyq7ZfpIRpbp
+bGofmkIZvFu3qIDL5NTmLKFuEP+pxJmYR2Lm/kg/6n3N7lgX7DsYIhL5y8a8o3NR
+Mb4Cw3YfLtnMmvyNUqX6LYgKWcnvTgw4kuXiZHpsfdov8BqHw1kDuX/++HwWtDXU
+r2EFq6QY2qCqe+NnX/9r5GjIFMKi0BheHt+gCkBGYTflF74pq+Q+OszdYNHES358
+mUniQQkq7LFGsn+oZRbYJusa47OOmVgINDiRaIz4gZ6Y5Yl9VcFR/nND4p+GOHlI
+7FuWJjVA95t2f0NHPzX7EEuVsc+GElYEn0Q8ynlwLoQ9eAruatV3nLHcbXNZYRVk
+4opodhS20vJonxsLlwG30OxxCq4rw0G5emM2j8xhkcV//EqQnEFxAhGytM9hlnK4
+YfEPqS2e7Z3/bp0iV5sAOJbvUOHfqvGROt5e9dCRqdLJLp/f7H+vXluMOLpEYkim
+02OAA8Y9Wq7zpJq/JwBT+ajfp35oQrXIvUOqaV0NkyHg3Iz+eoZlUcmGCCXwItCD
+1k4PHWDv1SzpTbvrpmi8SZ0V6qLGv9KmSg+V5UXRkkdsXtbKjLitsumChTNFj86a
+GzzzLtPtKHHkEfkcon34I8E3WeiMl/gWB0K6WWzoZMu5/tuyDC5jOHHuXo2Wnexp
+f+ahbVeyUf+THREJitB6glKmMfhfNm7uPpWmGZAQFk6zbCdy8YjWR+JltUMjESwe
+w34NxmVf+5gWgZncjJJpkl6n0Ea6ylKmEFpunXV5lX0UB5mqGV71lrp4hXjNjuQ+
+IdHywfQbaQ04shlLe/LAzcuXCVNzw4XHYk5b1ylIpFjjNUAqv91HJ/0oLgWZk2zD
+velavHKYggrlrxiIonnxD5k+VUfWVCV23eFolBty1tSD8exJ7Jq6VCTWQxwuopRF
+rYRBQTuVunYvioSSyYNYkga9uUpPpeDIDoZKXF5YeAclNExp7FNNL5LH8Zxue6gz
+c2ZI7dvuKogt69q/tnsxxbrP5IK8gnttSCNASHT8w8P7w9bNnKSQ6Kofd1pwRzKD
+Y6pWTSzXz2jwkW+iObGIYN9OFcO19Lwldv2qMoTu+C78JcUSqG+mkd2SG7ibQuiM
+SeJOzZIu1jOaREyQnTOrJ4ZG2+i9CeoVeCYk3VypIBZKodU+Yt2NyLvHKlwBcRMG
+bw5iLOe6PXtL+BvhwvbvIx4+OCeOAaG0fS5Qg6dEICetM3/yUl/nFpkrOBtA0Ito
+7K29ICKzp+YhFaniEJunhAwEXL/BDe3GeBcy5Ng8du4NroBgU5YC/JLYdeSXa+dt
+rD8eetTyvuIwIJENud854FrUsRWkbnndmPW/PK4+Vs0d6VHYVCTd9xsUwmCCcBGm
+K7Q6ycEFUnyLi8BMDQEkig==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/ca.srl b/network_rpc/grpc_tls/conf/tls_ca/ca.srl
new file mode 100644
index 0000000..0c74da0
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/ca.srl
@@ -0,0 +1 @@
+19122817D935DA49EE99B4C1FE87E68D87952682
diff --git a/network_rpc/grpc_tls/conf/tls_ca/client.csr b/network_rpc/grpc_tls/conf/tls_ca/client.csr
new file mode 100644
index 0000000..0a4edbe
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/client.csr
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICzjCCAbYCAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
+ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAMVj11Ju7N/Nc4yi2DMldIVetZyfFFUsDD4w69mu
+/CBrbrhqtncYZQpZCoV8bT5ABZKfCLJieS/dMWeIumE2GgN458c99IXpJyLV8Ws8
+bD3Ql3PouJZpeVORk1kh3Uj/loQoBzNO/qcodyFdSlUHPobBkX10XBHxW67RmcPs
+pcRgIu0cZHTxvRxJ/uX2zvYVZjQI80o9zNma43VUyRzEYI3V6WcX2ipGAZ6Z+Ynq
+gZ4lkGl7IkDexP6IeJB2GCSbSxoqWbTanwJoVsMavIbLd82UMzJ1M4sX9NMujzpu
+wqTXub9gOoVyDKuZ60uJZJjIy0Rqa/imC8ksdjvY2T5JyccCAwEAAaBEMEIGCSqG
+SIb3DQEJDjE1MDMwGQYDVR0RBBIwEIIOKi5ieXRlZnJlZS5jb20wCQYDVR0TBAIw
+ADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQELBQADggEBAKWiRUHhvElwiH9jPXGh
+SME5AQxCukcRTDa66CnUr9L7q9hxX561J+uZw8GSbIai6FtL8Qj724QFOwZtYyM/
+wAYy+r75IY9G3BL2LZcYNrnQkAk8dOlnK/dO5KIUBW0+2m0qdvWO5xs8DcETEg1+
+82yOz/jzPVk1VSRZqnC5JYMEOOXh4zAAEu4wDM0YH7OjKaou6aak5HMi2DAAwFsy
+Y9cggU0l+jdexzzOM8xpOyT9rGn6GgVbhx4OJs9TYejRc0a2g7x71Clyji4iXt7Q
+sEyRZQX+TaN7Emt2i/GNzfv8BRzd02Y5Ef3Pim63aKv00Rz2iUSpiKhLkiwv62BF
+eoo=
+-----END CERTIFICATE REQUEST-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/client.key b/network_rpc/grpc_tls/conf/tls_ca/client.key
new file mode 100644
index 0000000..bdcf023
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/client.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFY9dSbuzfzXOM
+otgzJXSFXrWcnxRVLAw+MOvZrvwga264arZ3GGUKWQqFfG0+QAWSnwiyYnkv3TFn
+iLphNhoDeOfHPfSF6Sci1fFrPGw90Jdz6LiWaXlTkZNZId1I/5aEKAczTv6nKHch
+XUpVBz6GwZF9dFwR8Vuu0ZnD7KXEYCLtHGR08b0cSf7l9s72FWY0CPNKPczZmuN1
+VMkcxGCN1elnF9oqRgGemfmJ6oGeJZBpeyJA3sT+iHiQdhgkm0saKlm02p8CaFbD
+GryGy3fNlDMydTOLF/TTLo86bsKk17m/YDqFcgyrmetLiWSYyMtEamv4pgvJLHY7
+2Nk+ScnHAgMBAAECggEAKSOs7e5WijKMwaPzAX3t8hoSKelx2GqMxq11inIQ9ETP
+17nN+7Zm4Kg8LCQJtK6tOqjQrDUf4tzr/hMeHUKkW1Loo7sC6qH0WStT3LDEMoH1
+/t9jEV48PjGaDzqinyM94J9jGMt/AaHKanbCFkSjQHy5cPc+dTLjk+T1ckMxLWMp
+9ZxZabWt9iyBw66zIm9mvHEOy03ViT8LMjMgtfBRqP/ozkZv871RBvqsIKaLWCU+
+EZ8vTxxME6pHodxTwdKfCcjrZsT+bIKLNU4GrwrRHfm6UYTwAMoFQzgKCgmVUP8o
+vScDFQuyQwOcENL1h9kGi6ww8OKnuziAm/KKbRRVyQKBgQD1Or3VLi7+qWBRjwoc
+ky8d+R8f5NvyLZiRVp0cu3Cl5XK86oeebJ1OwB60CxKvp55BpgXgLoTuDr56k7cS
+SNdws2q5QZXKwziKadb9a+B+jnuaOkKP2JePwHkCw28YMoCvc/mbhUlzu6/yFd58
+R8boFO+WWdaB5MDGAdN022aZ7QKBgQDODzZp1A58x2TaJg4PuFXVJ+TV/pHDJh9c
+6TPOBW7zSnDSXto5MEgH3AgsaY7bVwVwVVe9ijb+iil6ag00L7kdzzy6Q55lAJaa
+x0IiiAaT8tsK5htVRCWbRWa2zVUa3s+h82ReHSz6MiuNDxOwR+Ni8CegUOgnhETI
+YH78Ev5sAwKBgA3kuxaV3EG/VN6qDPebeyLml1XWQIPTA37QemxDTlmHy11aqD5Y
+hv0MM3Ed43wiMfwkLNcLq6pVGYOWVNvrVpFjCNvgFF19e/mTj4OiFgD1j5koTdca
+fVO+otx+OBAV5GaMWoruHUA6VPiRNp6x7ln9vak2A8ouLKHLPrCzMXftAoGAEngG
+loGtMr3kajES/ZG2D77dodiJVAZstTUpsYOHKEM5zYE26f1L13h/OwvTBBHOqPzd
+Ol3TBAl6IkCzIkRMwUE73i4FWmQtG35UjSfH/ya7P0TUmlXbUQltZWEOCbSCw68/
+BbhzuZEZmjEJwLkQxmNkCdh2lmQijhsoBovlReUCgYEAoq0jIG2ApweT+N4sZYOm
+5oS8nUVSe0dq4psyr2eIlVR3HWxm8Kk0+w0Is2fuuNts3+Hvh65ayKA99e/EnqPq
+SFDvESUcL3u174RQ4QIszhwXPm8e76+bCGSuujTbVcTeXbH2mUjVoQvCWplkniu9
+JBRHh1cs7HF/FM6MkEgWaNg=
+-----END PRIVATE KEY-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/client.pem b/network_rpc/grpc_tls/conf/tls_ca/client.pem
new file mode 100644
index 0000000..afef7de
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/client.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID2jCCAsKgAwIBAgIUGRIoF9k12knumbTB/ofmjYeVJoEwDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMzEyMTIxMjE4NDVaFw0yNDEy
+MTExMjE4NDVaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
+HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDFY9dSbuzfzXOMotgzJXSFXrWcnxRVLAw+MOvZrvwg
+a264arZ3GGUKWQqFfG0+QAWSnwiyYnkv3TFniLphNhoDeOfHPfSF6Sci1fFrPGw9
+0Jdz6LiWaXlTkZNZId1I/5aEKAczTv6nKHchXUpVBz6GwZF9dFwR8Vuu0ZnD7KXE
+YCLtHGR08b0cSf7l9s72FWY0CPNKPczZmuN1VMkcxGCN1elnF9oqRgGemfmJ6oGe
+JZBpeyJA3sT+iHiQdhgkm0saKlm02p8CaFbDGryGy3fNlDMydTOLF/TTLo86bsKk
+17m/YDqFcgyrmetLiWSYyMtEamv4pgvJLHY72Nk+ScnHAgMBAAGjgcEwgb4wGQYD
+VR0RBBIwEIIOKi5ieXRlZnJlZS5jb20wCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAw
+HQYDVR0OBBYEFN4qaeDZAeEDs8EbQluXTQNzpHtSMGoGA1UdIwRjMGGhSaRHMEUx
+CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
+cm5ldCBXaWRnaXRzIFB0eSBMdGSCFFsdyu96w9g2BLhp6GPDCptXhpHhMA0GCSqG
+SIb3DQEBCwUAA4IBAQB6RK1Q0uWfSvWLeA+7SnPem9eegEVXRF/qDuXCjAKlcrRU
+gQU3RzIegBYk3Dup+nMFUoJrlSjHhMMkqjCcF76opN0eF+fAxfU7nyQNekrAFcAx
+1NWWuPzavMI4ymvdH/NeHGx93opxhDNId/gOGP7mYgtgIISVGCrQYOnrJb+gHI6L
+1GS/39Gn/9EEtkMa4UQa3LLNx22QmhK74Hc6IB/glddg56SnhmBH6g8FBU3HIhDc
+Lsanfh6eb7TvGFlbgb5jRnl89P6vRga/FNVzSnUEvsR0TlwmoE+v9AeguzyyeMns
+qjUD2YTUeG6YkHpwhKUD1iydr+WFnntXwWSdCfYr
+-----END CERTIFICATE-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/openssl.cfg b/network_rpc/grpc_tls/conf/tls_ca/openssl.cfg
new file mode 100644
index 0000000..20f3303
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/openssl.cfg
@@ -0,0 +1,392 @@
+#
+# OpenSSL example configuration file.
+# See doc/man5/config.pod for more info.
+#
+# This is mostly being used for generation of certificate requests,
+# but may be used for auto loading of providers
+
+# Note that you can include other files from the main configuration
+# file using the .include directive.
+#.include filename
+
+# This definition stops the following lines choking if HOME isn't
+# defined.
+HOME = .
+
+ # Use this in order to automatically load providers.
+openssl_conf = openssl_init
+
+# Comment out the next line to ignore configuration errors
+config_diagnostics = 1
+
+# Extra OBJECT IDENTIFIER info:
+# oid_file = $ENV::HOME/.oid
+oid_section = new_oids
+
+# To use this configuration file with the "-extfile" option of the
+# "openssl x509" utility, name here the section containing the
+# X.509v3 extensions to use:
+# extensions =
+# (Alternatively, use a configuration file that has only
+# X.509v3 extensions in its main [= default] section.)
+
+[ new_oids ]
+# We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
+# Add a simple OID like this:
+# testoid1=1.2.3.4
+# Or use config file substitution like this:
+# testoid2=${testoid1}.5.6
+
+# Policies used by the TSA examples.
+tsa_policy1 = 1.2.3.4.1
+tsa_policy2 = 1.2.3.4.5.6
+tsa_policy3 = 1.2.3.4.5.7
+
+# For FIPS
+# Optionally include a file that is generated by the OpenSSL fipsinstall
+# application. This file contains configuration data required by the OpenSSL
+# fips provider. It contains a named section e.g. [fips_sect] which is
+# referenced from the [provider_sect] below.
+# Refer to the OpenSSL security policy for more information.
+# .include fipsmodule.cnf
+
+[openssl_init]
+providers = provider_sect
+
+# List of providers to load
+[provider_sect]
+default = default_sect
+# The fips section name should match the section name inside the
+# included fipsmodule.cnf.
+# fips = fips_sect
+
+# If no providers are activated explicitly, the default one is activated implicitly.
+# See man 7 OSSL_PROVIDER-default for more details.
+#
+# If you add a section explicitly activating any other provider(s), you most
+# probably need to explicitly activate the default provider, otherwise it
+# becomes unavailable in openssl. As a consequence applications depending on
+# OpenSSL may not work correctly which could lead to significant system
+# problems including inability to remotely access the system.
+[default_sect]
+# activate = 1
+
+
+####################################################################
+[ ca ]
+default_ca = CA_default # The default ca section
+
+####################################################################
+[ CA_default ]
+
+dir = ./demoCA # Where everything is kept
+certs = $dir/certs # Where the issued certs are kept
+crl_dir = $dir/crl # Where the issued crl are kept
+database = $dir/index.txt # database index file.
+#unique_subject = no # Set to 'no' to allow creation of
+ # several certs with same subject.
+new_certs_dir = $dir/newcerts # default place for new certs.
+
+certificate = $dir/cacert.pem # The CA certificate
+serial = $dir/serial # The current serial number
+crlnumber = $dir/crlnumber # the current crl number
+ # must be commented out to leave a V1 CRL
+crl = $dir/crl.pem # The current CRL
+private_key = $dir/private/cakey.pem# The private key
+
+x509_extensions = usr_cert # The extensions to add to the cert
+
+# Comment out the following two lines for the "traditional"
+# (and highly broken) format.
+name_opt = ca_default # Subject Name options
+cert_opt = ca_default # Certificate field options
+
+# Extension copying option: use with caution.
+copy_extensions = copy
+
+# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
+# so this is commented out by default to leave a V1 CRL.
+# crlnumber must also be commented out to leave a V1 CRL.
+# crl_extensions = crl_ext
+
+default_days = 365 # how long to certify for
+default_crl_days= 30 # how long before next CRL
+default_md = default # use public key default MD
+preserve = no # keep passed DN ordering
+
+# A few difference way of specifying how similar the request should look
+# For type CA, the listed attributes must be the same, and the optional
+# and supplied fields are just that :-)
+policy = policy_match
+
+# For the CA policy
+[ policy_match ]
+countryName = match
+stateOrProvinceName = match
+organizationName = match
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+# For the 'anything' policy
+# At this point in time, you must list all acceptable 'object'
+# types.
+[ policy_anything ]
+countryName = optional
+stateOrProvinceName = optional
+localityName = optional
+organizationName = optional
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+####################################################################
+[ req ]
+default_bits = 2048
+default_keyfile = privkey.pem
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+x509_extensions = v3_ca # The extensions to add to the self signed cert
+
+# Passwords for private keys if not present they will be prompted for
+# input_password = secret
+# output_password = secret
+
+# This sets a mask for permitted string types. There are several options.
+# default: PrintableString, T61String, BMPString.
+# pkix : PrintableString, BMPString (PKIX recommendation before 2004)
+# utf8only: only UTF8Strings (PKIX recommendation after 2004).
+# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
+# MASK:XXXX a literal mask value.
+# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
+string_mask = utf8only
+
+ req_extensions = v3_req # The extensions to add to a certificate request
+
+[ req_distinguished_name ]
+countryName = Country Name (2 letter code)
+countryName_default = AU
+countryName_min = 2
+countryName_max = 2
+
+stateOrProvinceName = State or Province Name (full name)
+stateOrProvinceName_default = Some-State
+
+localityName = Locality Name (eg, city)
+
+0.organizationName = Organization Name (eg, company)
+0.organizationName_default = Internet Widgits Pty Ltd
+
+# we can do this but it is not needed normally :-)
+#1.organizationName = Second Organization Name (eg, company)
+#1.organizationName_default = World Wide Web Pty Ltd
+
+organizationalUnitName = Organizational Unit Name (eg, section)
+#organizationalUnitName_default =
+
+commonName = Common Name (e.g. server FQDN or YOUR name)
+commonName_max = 64
+
+emailAddress = Email Address
+emailAddress_max = 64
+
+# SET-ex3 = SET extension number 3
+
+[ req_attributes ]
+challengePassword = A challenge password
+challengePassword_min = 4
+challengePassword_max = 20
+
+unstructuredName = An optional company name
+
+[ usr_cert ]
+
+# These extensions are added when 'ca' signs a request.
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+# This is required for TSA certificates.
+# extendedKeyUsage = critical,timeStamping
+
+[ v3_req ]
+subjectAltName = @alt_names
+# Extensions to add to a certificate request
+
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+[ alt_names ]
+DNS.1 = *.bytefree.com
+
+[ v3_ca ]
+
+
+# Extensions for a typical CA
+
+
+# PKIX recommendation.
+
+subjectKeyIdentifier=hash
+
+authorityKeyIdentifier=keyid:always,issuer
+
+basicConstraints = critical,CA:true
+
+# Key usage: this is typical for a CA certificate. However since it will
+# prevent it being used as an test self-signed certificate it is best
+# left out by default.
+# keyUsage = cRLSign, keyCertSign
+
+# Include email address in subject alt name: another PKIX recommendation
+# subjectAltName=email:copy
+# Copy issuer details
+# issuerAltName=issuer:copy
+
+# DER hex encoding of an extension: beware experts only!
+# obj=DER:02:03
+# Where 'obj' is a standard or added object
+# You can even override a supported extension:
+# basicConstraints= critical, DER:30:03:01:01:FF
+
+[ crl_ext ]
+
+# CRL extensions.
+# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
+
+# issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+[ proxy_cert_ext ]
+# These extensions should be added when creating a proxy certificate
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+# This really needs to be in place for it to be a proxy certificate.
+proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
+
+####################################################################
+[ tsa ]
+
+default_tsa = tsa_config1 # the default TSA section
+
+[ tsa_config1 ]
+
+# These are used by the TSA reply generation only.
+dir = ./demoCA # TSA root directory
+serial = $dir/tsaserial # The current serial number (mandatory)
+crypto_device = builtin # OpenSSL engine to use for signing
+signer_cert = $dir/tsacert.pem # The TSA signing certificate
+ # (optional)
+certs = $dir/cacert.pem # Certificate chain to include in reply
+ # (optional)
+signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
+signer_digest = sha256 # Signing digest to use. (Optional)
+default_policy = tsa_policy1 # Policy if request did not specify it
+ # (optional)
+other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
+digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory)
+accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
+clock_precision_digits = 0 # number of digits after dot. (optional)
+ordering = yes # Is ordering defined for timestamps?
+ # (optional, default: no)
+tsa_name = yes # Must the TSA name be included in the reply?
+ # (optional, default: no)
+ess_cert_id_chain = no # Must the ESS cert id chain be included?
+ # (optional, default: no)
+ess_cert_id_alg = sha1 # algorithm to compute certificate
+ # identifier (optional, default: sha1)
+
+[insta] # CMP using Insta Demo CA
+# Message transfer
+server = pki.certificate.fi:8700
+# proxy = # set this as far as needed, e.g., http://192.168.1.1:8080
+# tls_use = 0
+path = pkix/
+
+# Server authentication
+recipient = "/C=FI/O=Insta Demo/CN=Insta Demo CA" # or set srvcert or issuer
+ignore_keyusage = 1 # potentially needed quirk
+unprotected_errors = 1 # potentially needed quirk
+extracertsout = insta.extracerts.pem
+
+# Client authentication
+ref = 3078 # user identification
+secret = pass:insta # can be used for both client and server side
+
+# Generic message options
+cmd = ir # default operation, can be overridden on cmd line with, e.g., kur
+
+# Certificate enrollment
+subject = "/CN=openssl-cmp-test"
+newkey = insta.priv.pem
+out_trusted = insta.ca.crt
+certout = insta.cert.pem
+
+[pbm] # Password-based protection for Insta CA
+# Server and client authentication
+ref = $insta::ref # 3078
+secret = $insta::secret # pass:insta
+
+[signature] # Signature-based protection for Insta CA
+# Server authentication
+trusted = insta.ca.crt # does not include keyUsage digitalSignature
+
+# Client authentication
+secret = # disable PBM
+key = $insta::newkey # insta.priv.pem
+cert = $insta::certout # insta.cert.pem
+
+[ir]
+cmd = ir
+
+[cr]
+cmd = cr
+
+[kur]
+# Certificate update
+cmd = kur
+oldcert = $insta::certout # insta.cert.pem
+
+[rr]
+# Certificate revocation
+cmd = rr
+oldcert = $insta::certout # insta.cert.pem
diff --git a/network_rpc/grpc_tls/conf/tls_ca/server.csr b/network_rpc/grpc_tls/conf/tls_ca/server.csr
new file mode 100644
index 0000000..bfe053b
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/server.csr
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICzjCCAbYCAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
+ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKs65dAn8colRbuDXJarvYy7I4L7Dd1bQWqwLSN8
+0mCASe59MzjdlLr6eQH3sriRFfyzn9hPCwHqu6416K6QQro7RG2K19znjAHgmtvn
+F/0E4+1O155Eqmm8VrC/RtPmdQnAB6kLgBb2mj77GxQXuhcNQpEKH70Xgvn7ztbW
+kw1hIUXyAZmidaCG58gHYab8DnkwiLfZs5OsFI+FUY+4nLdnG8xtYHYkFEjxSAz6
+TBPwYz9c/WHnBJ2AfgmKBcGuAvX/XhkTlCYI5cGYDTgoo1I+wp5ElsS8zTYDycLu
+aQh8gLbTC4nS8jTBRqe5Z1d3vzjUWoV7sezWs4QkJu3IDC0CAwEAAaBEMEIGCSqG
+SIb3DQEJDjE1MDMwGQYDVR0RBBIwEIIOKi5ieXRlZnJlZS5jb20wCQYDVR0TBAIw
+ADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQELBQADggEBAItVGr490Fcm8lxZsqjF
+RGCn2XNwO03IxFvw189mA2RJBxVXjnNTmSP6V7oGsTHh9vF6T7KpHxC2I9oeeD0D
+2ObFUyLusDcyXP3A7WvID2HUAEX428Vk78g9t3UR3ZGinmxLpESgiVDOsrRnVA+j
+IuSMLz9O6j+YGFKHjfCXbxcmfBUEMZfQmQBHDGTi/fxwH08DCkHSzTUmSsAkHYMP
+JU4vQ4+5UlKjS9kialj/gtOW3hBWWfaVdcsvRBNQpyN9J8ZZwtqui52Hqtf3UHOp
+N7BJFQm76f3zBmsiJlYW/cOt1OoxZ7xz9QlmaX+EJq7LIdrfsxvZ9Pi39uLZsJBA
+ims=
+-----END CERTIFICATE REQUEST-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/server.key b/network_rpc/grpc_tls/conf/tls_ca/server.key
new file mode 100644
index 0000000..3fa07e7
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/server.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCrOuXQJ/HKJUW7
+g1yWq72MuyOC+w3dW0FqsC0jfNJggEnufTM43ZS6+nkB97K4kRX8s5/YTwsB6ruu
+NeiukEK6O0Rtitfc54wB4Jrb5xf9BOPtTteeRKppvFawv0bT5nUJwAepC4AW9po+
++xsUF7oXDUKRCh+9F4L5+87W1pMNYSFF8gGZonWghufIB2Gm/A55MIi32bOTrBSP
+hVGPuJy3ZxvMbWB2JBRI8UgM+kwT8GM/XP1h5wSdgH4JigXBrgL1/14ZE5QmCOXB
+mA04KKNSPsKeRJbEvM02A8nC7mkIfIC20wuJ0vI0wUanuWdXd7841FqFe7Hs1rOE
+JCbtyAwtAgMBAAECggEAPPLEfYDSXElDFnkuGkV8PV0ZSVSSfVGvqcmW75RND+Nq
+LXUsJ9gbSijArNYdq/ucr2vCgEy2VtLWRi7TKVuZHM/ezf0HVA6pM7vec1rBG6ND
+fCM9tYyseeF7nAMhs2hLDZLoRyAcUlAp3DQmUdMWPoFOSfEoFfcJ/HBIkgkjo7Vy
+QSvmekpkZoRStnLiCsVfjG6DRPL4zfctUirukn7/aSkDWeclJHWQSwwBxyBr8kwt
+P3/0vQzzxn7Pi5BluKFkTX97Xq1L80UteEc3sL5ET6qRsryvTizAS+wOVuCQmEmS
+IZ9hJZR6aTIgXAGELlsyHWcWfJqplAAE/l7r6tvUkwKBgQC3yjrefH27MmHFPfJf
++e96Dn4yyWTtg1D319WDasgumEg/FMlNiBuTPQ0nQI6tUW+97ZoacCqc5YFNCexk
+h13lM2PCyhYd9CrdMX/RE2GqgmjSBEf1nYtqqsnUv2Xt7XVJI0h/SduOxYrNgTcg
+WjrIyUq5O9nM3bFfWnLqMKgbHwKBgQDugWHAQDwcsxDeW/62bgwe7e+im8Hzxwmk
+a5xqr6hNriA2PXXDL1JhI0jmfyvG8HYETITUlwmug4GlfDeVVNu1XTV3TPELA8p1
+WEcpLNw00ymFSB7sXyIU7r9OjuwxSLCdhM7p+xBLXbxq+zeXLGPYLcc1Ex8+yD8A
+vm/r2yW7MwKBgGs/XDjmRmxNSxZRPrVY4LDF8khqkzWyEjZ+QT7NugDOpiIBXDKd
+ARJbZuiH2Ho08lLPasSQvZ0Oo/QznTlQcK9F3KoXSO6zw6uNrftwJubb8JTVILSn
++WoGPX6jLbS4g19pcm2syK04gvXGuEdtv63ZIHyU+1R77XwqCLK2L/KbAoGAJxXk
+4xCjyUA/H3GMCHF4YwkzID7ORhj0J5HLDGDFABXtCXaA+f+jTG/v3nYwwmVdsc6o
+Zf5qg8LhWDFHGp3Rc6NWw7pENj3ky94vqzvCypVgVItBJhNhDnUhvMoHQvxalTXS
+gt22CePOoOmSbp/DrQWzg6sij7NZP9H1nX1IbakCgYAaXOdAP2RgPuxT4Mn0QCIj
+KCcuMBV2/j/L+o2AttB1e6lRGmNwv+HZ5phZLN9yeyrnBnNj+gkU4/ppkwm2tKgN
+Zdk5Svr35HnKu0QtwgyQV3Ya6PLIyhzGFPFj5g/MxLyByRmD8vGzTNIcSxnmGMIy
+sZQfirI5Z41vqFbA5LZAag==
+-----END PRIVATE KEY-----
diff --git a/network_rpc/grpc_tls/conf/tls_ca/server.pem b/network_rpc/grpc_tls/conf/tls_ca/server.pem
new file mode 100644
index 0000000..ee76137
--- /dev/null
+++ b/network_rpc/grpc_tls/conf/tls_ca/server.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID2jCCAsKgAwIBAgIUGRIoF9k12knumbTB/ofmjYeVJoIwDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMzEyMTIxMjE5MjNaFw0yNDEy
+MTExMjE5MjNaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
+HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCrOuXQJ/HKJUW7g1yWq72MuyOC+w3dW0FqsC0jfNJg
+gEnufTM43ZS6+nkB97K4kRX8s5/YTwsB6ruuNeiukEK6O0Rtitfc54wB4Jrb5xf9
+BOPtTteeRKppvFawv0bT5nUJwAepC4AW9po++xsUF7oXDUKRCh+9F4L5+87W1pMN
+YSFF8gGZonWghufIB2Gm/A55MIi32bOTrBSPhVGPuJy3ZxvMbWB2JBRI8UgM+kwT
+8GM/XP1h5wSdgH4JigXBrgL1/14ZE5QmCOXBmA04KKNSPsKeRJbEvM02A8nC7mkI
+fIC20wuJ0vI0wUanuWdXd7841FqFe7Hs1rOEJCbtyAwtAgMBAAGjgcEwgb4wGQYD
+VR0RBBIwEIIOKi5ieXRlZnJlZS5jb20wCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAw
+HQYDVR0OBBYEFFxB75vCDsSW1n0zTenqOFkoRlU+MGoGA1UdIwRjMGGhSaRHMEUx
+CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
+cm5ldCBXaWRnaXRzIFB0eSBMdGSCFFsdyu96w9g2BLhp6GPDCptXhpHhMA0GCSqG
+SIb3DQEBCwUAA4IBAQBjuYdwZRko83lQvumVqn3L5lmuP2gagoshPN0tZllBHJjv
+STA2Q+PYvLNvdwAOY7PsxHazUsoYbYn6lBrcVsqLajwGUdNM7RWkT3ZmtqjEfJI/
+jKWx5WuRTAAQVt+8e2lw9gDBOACn2EyJQmDKU84rvfQOp5uksnTE13+RfWv2t9wf
++0OT7yUUtEr+MQRR5WDCgHwRHxhnv+UgAUMF0swzHQcYfmckfKD/FG9/7FunwcKB
+jfIowZRNOy435Eu1WtElXE8SS56PelqVzG/QMag2/TqAOVfWnj28wCfCunMWhIr4
+vDw3jyxs0eZqmkKhdSqQZVm8zPY60c+Xw2uY7eEx
+-----END CERTIFICATE-----
diff --git a/network_rpc/grpc_tls/go.mod b/network_rpc/grpc_tls/go.mod
new file mode 100644
index 0000000..0687b92
--- /dev/null
+++ b/network_rpc/grpc_tls/go.mod
@@ -0,0 +1,16 @@
+module github.com/grpc_tls
+
+go 1.21.0
+
+require (
+ google.golang.org/grpc v1.59.0
+ google.golang.org/protobuf v1.31.0
+)
+
+require (
+ github.com/golang/protobuf v1.5.3 // indirect
+ golang.org/x/net v0.14.0 // indirect
+ golang.org/x/sys v0.11.0 // indirect
+ golang.org/x/text v0.12.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
+)
diff --git a/network_rpc/grpc_tls/go.sum b/network_rpc/grpc_tls/go.sum
new file mode 100644
index 0000000..16f3bb4
--- /dev/null
+++ b/network_rpc/grpc_tls/go.sum
@@ -0,0 +1,21 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
+google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
+google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/network_rpc/grpc_tls/proto/search.pb.go b/network_rpc/grpc_tls/proto/search.pb.go
new file mode 100644
index 0000000..daa9550
--- /dev/null
+++ b/network_rpc/grpc_tls/proto/search.pb.go
@@ -0,0 +1,207 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.24.0
+// source: search.proto
+
+package grpc_tls
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Req struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Request string `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
+}
+
+func (x *Req) Reset() {
+ *x = Req{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_search_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Req) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Req) ProtoMessage() {}
+
+func (x *Req) ProtoReflect() protoreflect.Message {
+ mi := &file_search_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Req.ProtoReflect.Descriptor instead.
+func (*Req) Descriptor() ([]byte, []int) {
+ return file_search_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Req) GetRequest() string {
+ if x != nil {
+ return x.Request
+ }
+ return ""
+}
+
+type Resp struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Response string `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
+}
+
+func (x *Resp) Reset() {
+ *x = Resp{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_search_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Resp) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Resp) ProtoMessage() {}
+
+func (x *Resp) ProtoReflect() protoreflect.Message {
+ mi := &file_search_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Resp.ProtoReflect.Descriptor instead.
+func (*Resp) Descriptor() ([]byte, []int) {
+ return file_search_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Resp) GetResponse() string {
+ if x != nil {
+ return x.Response
+ }
+ return ""
+}
+
+var File_search_proto protoreflect.FileDescriptor
+
+var file_search_proto_rawDesc = []byte{
+ 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1f,
+ 0x0a, 0x03, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,
+ 0x22, 0x0a, 0x04, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x32, 0x20, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x12, 0x15,
+ 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x04, 0x2e, 0x52, 0x65, 0x71, 0x1a, 0x05,
+ 0x2e, 0x52, 0x65, 0x73, 0x70, 0x42, 0x0d, 0x5a, 0x0b, 0x2e, 0x2f, 0x3b, 0x67, 0x72, 0x70, 0x63,
+ 0x5f, 0x74, 0x6c, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_search_proto_rawDescOnce sync.Once
+ file_search_proto_rawDescData = file_search_proto_rawDesc
+)
+
+func file_search_proto_rawDescGZIP() []byte {
+ file_search_proto_rawDescOnce.Do(func() {
+ file_search_proto_rawDescData = protoimpl.X.CompressGZIP(file_search_proto_rawDescData)
+ })
+ return file_search_proto_rawDescData
+}
+
+var file_search_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_search_proto_goTypes = []interface{}{
+ (*Req)(nil), // 0: Req
+ (*Resp)(nil), // 1: Resp
+}
+var file_search_proto_depIdxs = []int32{
+ 0, // 0: SearchC.Search:input_type -> Req
+ 1, // 1: SearchC.Search:output_type -> Resp
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_search_proto_init() }
+func file_search_proto_init() {
+ if File_search_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_search_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Req); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_search_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Resp); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_search_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_search_proto_goTypes,
+ DependencyIndexes: file_search_proto_depIdxs,
+ MessageInfos: file_search_proto_msgTypes,
+ }.Build()
+ File_search_proto = out.File
+ file_search_proto_rawDesc = nil
+ file_search_proto_goTypes = nil
+ file_search_proto_depIdxs = nil
+}
diff --git a/network_rpc/grpc_tls/proto/search.proto b/network_rpc/grpc_tls/proto/search.proto
new file mode 100644
index 0000000..029f119
--- /dev/null
+++ b/network_rpc/grpc_tls/proto/search.proto
@@ -0,0 +1,14 @@
+syntax="proto3";
+option go_package="./;grpc_tls";
+
+message Req{
+ string request=1;
+}
+
+message Resp{
+ string response=1;
+}
+
+service SearchC{
+ rpc Search(Req)returns(Resp);
+}
\ No newline at end of file
diff --git a/network_rpc/grpc_tls/proto/search_grpc.pb.go b/network_rpc/grpc_tls/proto/search_grpc.pb.go
new file mode 100644
index 0000000..13882bb
--- /dev/null
+++ b/network_rpc/grpc_tls/proto/search_grpc.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.24.0
+// source: search.proto
+
+package grpc_tls
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+ SearchC_Search_FullMethodName = "/SearchC/Search"
+)
+
+// SearchCClient is the client API for SearchC service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SearchCClient interface {
+ Search(ctx context.Context, in *Req, opts ...grpc.CallOption) (*Resp, error)
+}
+
+type searchCClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewSearchCClient(cc grpc.ClientConnInterface) SearchCClient {
+ return &searchCClient{cc}
+}
+
+func (c *searchCClient) Search(ctx context.Context, in *Req, opts ...grpc.CallOption) (*Resp, error) {
+ out := new(Resp)
+ err := c.cc.Invoke(ctx, SearchC_Search_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// SearchCServer is the server API for SearchC service.
+// All implementations must embed UnimplementedSearchCServer
+// for forward compatibility
+type SearchCServer interface {
+ Search(context.Context, *Req) (*Resp, error)
+ mustEmbedUnimplementedSearchCServer()
+}
+
+// UnimplementedSearchCServer must be embedded to have forward compatible implementations.
+type UnimplementedSearchCServer struct {
+}
+
+func (UnimplementedSearchCServer) Search(context.Context, *Req) (*Resp, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Search not implemented")
+}
+func (UnimplementedSearchCServer) mustEmbedUnimplementedSearchCServer() {}
+
+// UnsafeSearchCServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SearchCServer will
+// result in compilation errors.
+type UnsafeSearchCServer interface {
+ mustEmbedUnimplementedSearchCServer()
+}
+
+func RegisterSearchCServer(s grpc.ServiceRegistrar, srv SearchCServer) {
+ s.RegisterService(&SearchC_ServiceDesc, srv)
+}
+
+func _SearchC_Search_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(Req)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(SearchCServer).Search(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: SearchC_Search_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(SearchCServer).Search(ctx, req.(*Req))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// SearchC_ServiceDesc is the grpc.ServiceDesc for SearchC service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SearchC_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "SearchC",
+ HandlerType: (*SearchCServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Search",
+ Handler: _SearchC_Search_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "search.proto",
+}
diff --git a/network_rpc/grpc_tls/server/server/main.go b/network_rpc/grpc_tls/server/server/main.go
new file mode 100644
index 0000000..2138006
--- /dev/null
+++ b/network_rpc/grpc_tls/server/server/main.go
@@ -0,0 +1,43 @@
+package main
+
+import (
+ "context"
+ "log"
+ "net"
+ "strconv"
+
+ "google.golang.org/grpc/credentials"
+
+ grpc_tls "github.com/grpc_tls/proto"
+ "google.golang.org/grpc"
+)
+
+const PORT = 9091
+
+type Serv struct {
+ grpc_tls.UnimplementedSearchCServer
+}
+
+func (s *Serv) Search(ctx context.Context, req *grpc_tls.Req) (*grpc_tls.Resp, error) {
+ return &grpc_tls.Resp{Response: "hello!" + req.Request + ",没想到吧,不是search而是hello!"}, nil
+}
+func main() {
+ // 加载证书文件,生成tls凭证
+ cert, err := credentials.NewServerTLSFromFile("./../../conf/tls/server.pem", "./../../conf/tls/server.key")
+ if err != nil {
+ log.Printf("[server] generate cert faield! err:%s\n", err)
+ return
+ }
+ //将证书添加到服务端中
+ server := grpc.NewServer(grpc.Creds(cert))
+ conn, err := net.Listen("tcp", ":"+strconv.Itoa(PORT))
+ if err != nil {
+ log.Printf("[server] listen %d failed! err:%s\n", err)
+ return
+ }
+ defer conn.Close()
+ grpc_tls.RegisterSearchCServer(server, &Serv{})
+
+ server.Serve(conn)
+
+}
diff --git a/network_rpc/grpc_tls/server/server_ca/main.go b/network_rpc/grpc_tls/server/server_ca/main.go
new file mode 100644
index 0000000..a95f48c
--- /dev/null
+++ b/network_rpc/grpc_tls/server/server_ca/main.go
@@ -0,0 +1,71 @@
+package main
+
+import (
+ "context"
+ "crypto/tls"
+ "crypto/x509"
+ "io/ioutil"
+ "log"
+ "net"
+ "strconv"
+
+ "google.golang.org/grpc/credentials"
+
+ "google.golang.org/grpc"
+
+ grpc_tls "github.com/grpc_tls/proto"
+)
+
+const PORT = 9091
+
+type Serv struct {
+ grpc_tls.UnimplementedSearchCServer
+}
+
+func (s *Serv) Search(ctx context.Context, req *grpc_tls.Req) (*grpc_tls.Resp, error) {
+ return &grpc_tls.Resp{
+ Response: "hello!" + req.GetRequest() + ",你上当了!",
+ }, nil
+
+}
+func main() {
+
+ cert, err := tls.LoadX509KeyPair("./../../conf/tls_ca/server.pem", "./../../conf/tls_ca/server.key")
+ if err != nil {
+ log.Printf("[server] load ca file failed! err:%s\n", err)
+ return
+ }
+ //创建一个新的、空的CertPool
+ certPool := x509.NewCertPool()
+ ca, err := ioutil.ReadFile("./../../conf/tls_ca/ca.crt")
+ if err != nil {
+ log.Printf("[server] read ca failed! err:%s\n", err)
+ return
+ }
+ //尝试解析传入的pem编码的证书。如果解析成功将其添加到CertPool中以便后面的使用
+ ok := certPool.AppendCertsFromPEM(ca)
+ if !ok {
+ log.Printf("[server] certPoll append certs failed! err:%s\n", err)
+ return
+ }
+ //构建基于TLS的 TransportCredentials 选项
+ c := credentials.NewTLS(&tls.Config{
+ //设置证书链,允许包含一个或多个
+ Certificates: []tls.Certificate{cert},
+ //要求必须校验客户端证书
+ ClientAuth: tls.RequireAndVerifyClientCert,
+ //设置根证书集合,校验方式选择ClientAuth 中设定的模式
+ ClientCAs: certPool,
+ })
+ //监听
+ conn, err := net.Listen("tcp", ":"+strconv.Itoa(PORT))
+ if err != nil {
+ log.Printf("[server] listen %d failed!", err)
+ return
+ }
+ //server := grpc.NewServer()
+ server := grpc.NewServer(grpc.Creds(c))
+ grpc_tls.RegisterSearchCServer(server, &Serv{})
+ _ = server.Serve(conn)
+
+}
diff --git a/network_rpc/grpc_tls/server/server_token/main.go b/network_rpc/grpc_tls/server/server_token/main.go
new file mode 100644
index 0000000..70cbcc3
--- /dev/null
+++ b/network_rpc/grpc_tls/server/server_token/main.go
@@ -0,0 +1,62 @@
+package main
+
+import (
+ "context"
+ "errors"
+ "log"
+ "net"
+ "strconv"
+
+ "google.golang.org/grpc/metadata"
+
+ grpc_tls "github.com/grpc_tls/proto"
+
+ "google.golang.org/grpc"
+)
+
+const PORT = 9090
+
+type Serv struct {
+ grpc_tls.UnimplementedSearchCServer
+}
+
+func (s *Serv) Search(ctx context.Context, req *grpc_tls.Req) (*grpc_tls.Resp, error) {
+
+ return &grpc_tls.Resp{Response: "我喜欢你!" + req.GetRequest()}, nil
+}
+
+func TokenAuth(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
+
+ mt, ok := metadata.FromIncomingContext(ctx)
+ if !ok {
+ log.Printf("get metadata failed! \n")
+ return nil, nil
+
+ }
+ var user string
+ var id string
+ if i, ok := mt["user"]; ok {
+ user = i[0]
+ }
+ if i, ok := mt["id"]; ok {
+ id = i[0]
+ }
+ if user == "潘丽萍" || id == "123456" {
+ log.Printf("pass!\n")
+ return handler(ctx, req)
+ }
+ return nil, errors.New("auth failed!")
+}
+
+func main() {
+ // 使用拦截器实现token认证
+ server := grpc.NewServer(grpc.UnaryInterceptor(TokenAuth))
+ conn, err := net.Listen("tcp", ":"+strconv.Itoa(PORT))
+ if err != nil {
+ log.Printf("listen to %d failed! %s\n", err)
+ return
+ }
+
+ grpc_tls.RegisterSearchCServer(server, &Serv{})
+ server.Serve(conn)
+}
diff --git a/network_rpc/network_rpc_json/client.go b/network_rpc/network_rpc_json/client.go
deleted file mode 100644
index 06ab7d0..0000000
--- a/network_rpc/network_rpc_json/client.go
+++ /dev/null
@@ -1 +0,0 @@
-package main
diff --git a/network_rpc/network_rpc_json/server.go b/network_rpc/network_rpc_json/server.go
deleted file mode 100644
index 06ab7d0..0000000
--- a/network_rpc/network_rpc_json/server.go
+++ /dev/null
@@ -1 +0,0 @@
-package main
diff --git a/network_rpc/readme.md b/network_rpc/readme.md
new file mode 100644
index 0000000..b790b97
--- /dev/null
+++ b/network_rpc/readme.md
@@ -0,0 +1,7 @@
+### 注意
+- 1、grpc_01
+- 2、grpc_stream
+- 3、grpc_tls
+- 4、grpc_interceptor (github.com/grpc-ecosystem/grpc-middleware)
+- 5、grpc_change 变动 旧方式
+- 6、grpc_gateway (github.com/grpc-ecosystem/grpc-gateway/proto-gen-grpc-gateway)
\ No newline at end of file
diff --git a/tcpboxV0.1/Client.go b/tcpboxV0.1/Client.go
deleted file mode 100644
index ebf0da4..0000000
--- a/tcpboxV0.1/Client.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package main
-
-import (
- "fmt"
- "net"
- "time"
-)
-
-func main() {
-
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- buf := make([]byte, 512)
- //var in string
- //n, err := fmt.Scan(&in)
- //if nil != err {
- // fmt.Println("Scan message err:", err)
- // continue
- //}
-
- n, err := conn.Write([]byte("你好!"))
- if nil != err {
- fmt.Println("write err:", err)
- return
- }
- fmt.Println("Server sent ", "你好啊!")
- n, err = conn.Read(buf[:n])
- if nil != err {
- fmt.Println("read err:", err)
- return
- }
- fmt.Println("Server read ", string(buf))
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.1/README.md b/tcpboxV0.1/README.md
deleted file mode 100644
index a827ba9..0000000
--- a/tcpboxV0.1/README.md
+++ /dev/null
@@ -1 +0,0 @@
-## 构建基本的服务器,请求,连接,路由的基本框架
\ No newline at end of file
diff --git a/tcpboxV0.1/main.go b/tcpboxV0.1/main.go
deleted file mode 100644
index e659c60..0000000
--- a/tcpboxV0.1/main.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package main
-
-import "zinx/tcpnet"
-
-func main() {
- //创建服务器对象
- s := tcpnet.NewServer("[Zinx V0.1]")
- //
- s.Server()
-}
diff --git a/tcpboxV0.1/tcpiface/iconnection.go b/tcpboxV0.1/tcpiface/iconnection.go
deleted file mode 100644
index 8fa8632..0000000
--- a/tcpboxV0.1/tcpiface/iconnection.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- Send(data []byte) error
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.1/tcpiface/irequest.go b/tcpboxV0.1/tcpiface/irequest.go
deleted file mode 100644
index 069c712..0000000
--- a/tcpboxV0.1/tcpiface/irequest.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-}
diff --git a/tcpboxV0.1/tcpiface/irouter.go b/tcpboxV0.1/tcpiface/irouter.go
deleted file mode 100644
index 8ccd272..0000000
--- a/tcpboxV0.1/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.1/tcpiface/iserver.go b/tcpboxV0.1/tcpiface/iserver.go
deleted file mode 100644
index eb81b28..0000000
--- a/tcpboxV0.1/tcpiface/iserver.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
-}
diff --git a/tcpboxV0.1/tcpnet/connection.go b/tcpboxV0.1/tcpnet/connection.go
deleted file mode 100644
index 4057fa0..0000000
--- a/tcpboxV0.1/tcpnet/connection.go
+++ /dev/null
@@ -1,113 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
-
- //当球按连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //当前链接所i绑定的处理业务方法的API
- handleAPI tcpiface.HandleFunc
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-}
-
-//初始化链接模块的方法
-func NewConnection(conn *net.TCPConn, connID uint32, callbackApi tcpiface.HandleFunc) *Connection {
- c := &Connection{
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- handleAPI: callbackApi,
- ExitChan: make(chan bool, 1),
- }
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "Reader is exit,RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取刻划断的数据到buf中,最大512字节
- for {
- buf := make([]byte, 512)
- n, err := c.Conn.Read(buf)
- if nil != err {
- fmt.Println("receive buf err", err)
- continue
- }
-
- //调用当前链接所绑定的HandleApi
- if err := c.handleAPI(c.Conn, buf, n); nil != err {
- fmt.Println("ConnID:", c.ConnID, "handle failed... err:", err)
- break
- }
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- c.Conn.Close()
-
- //关闭信道
- close(c.ExitChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) Send(data []byte) error {
- return nil
-}
diff --git a/tcpboxV0.1/tcpnet/request.go b/tcpboxV0.1/tcpnet/request.go
deleted file mode 100644
index a0f4e95..0000000
--- a/tcpboxV0.1/tcpnet/request.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package tcpnet
-
-import "zinx/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- data []byte
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.data
-}
diff --git a/tcpboxV0.1/tcpnet/router.go b/tcpboxV0.1/tcpnet/router.go
deleted file mode 100644
index 7c1347f..0000000
--- a/tcpboxV0.1/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "zinx/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.1/tcpnet/server.go b/tcpboxV0.1/tcpnet/server.go
deleted file mode 100644
index 71fe5da..0000000
--- a/tcpboxV0.1/tcpnet/server.go
+++ /dev/null
@@ -1,103 +0,0 @@
-package tcpnet
-
-import (
- "errors"
- "fmt"
- "net"
- "zinx/tcpiface"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
-}
-
-func (s *Server) Start() {
-
- //用一个goroution来处理
-
- go func() {
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
- defer conn.Close()
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(conn, cid, CallBackToClient)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: name,
- IPVersion: "tcp4",
- IP: "0.0.0.0",
- Port: 8999,
- }
- return s
-}
-
-//
-func CallBackToClient(conn *net.TCPConn, data []byte, n int) error {
- //处理业务逻辑
- //在此做一个回显功能
- fmt.Println("[Conn Handle] CallBackToClient... ")
-
- n, err := conn.Write(data[:n])
- if nil != err {
- fmt.Println("write message failed,err:", err)
- return errors.New("Write back failed ... ")
- }
- fmt.Println("Server sent [", string(data), "]")
- return nil
-}
diff --git a/tcpboxV0.2/Client.go b/tcpboxV0.2/Client.go
deleted file mode 100644
index ebf0da4..0000000
--- a/tcpboxV0.2/Client.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package main
-
-import (
- "fmt"
- "net"
- "time"
-)
-
-func main() {
-
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- buf := make([]byte, 512)
- //var in string
- //n, err := fmt.Scan(&in)
- //if nil != err {
- // fmt.Println("Scan message err:", err)
- // continue
- //}
-
- n, err := conn.Write([]byte("你好!"))
- if nil != err {
- fmt.Println("write err:", err)
- return
- }
- fmt.Println("Server sent ", "你好啊!")
- n, err = conn.Read(buf[:n])
- if nil != err {
- fmt.Println("read err:", err)
- return
- }
- fmt.Println("Server read ", string(buf))
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.2/Server.go b/tcpboxV0.2/Server.go
deleted file mode 100644
index 90abd3a..0000000
--- a/tcpboxV0.2/Server.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package main
-
-import (
- "fmt"
- "zinx/tcpiface"
- "zinx/tcpnet"
-)
-
-type PingRouter struct{}
-
-func (p *PingRouter) PreHandle(request tcpiface.IRequest) {
- fmt.Println("Call Router PreHandle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back before ping err:", err)
- }
-}
-func (p *PingRouter) Handle(request tcpiface.IRequest) {
- fmt.Println("Call Router Handle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-func (p *PingRouter) PostHandle(request tcpiface.IRequest) {
- fmt.Println("Call Router PostHandle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back after ping err:", err)
- }
-}
-
-func main() {
- //创建服务器对象
- s := tcpnet.NewServer("[Zinx V0.2]")
- //
- s.AddRouter(&PingRouter{})
- s.Server()
-}
diff --git a/tcpboxV0.2/go.mod b/tcpboxV0.2/go.mod
deleted file mode 100644
index 00af073..0000000
--- a/tcpboxV0.2/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module tcpbox
-
-go 1.18
diff --git a/tcpboxV0.2/tcpiface/iconnection.go b/tcpboxV0.2/tcpiface/iconnection.go
deleted file mode 100644
index 8fa8632..0000000
--- a/tcpboxV0.2/tcpiface/iconnection.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- Send(data []byte) error
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.2/tcpiface/irequest.go b/tcpboxV0.2/tcpiface/irequest.go
deleted file mode 100644
index 069c712..0000000
--- a/tcpboxV0.2/tcpiface/irequest.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-}
diff --git a/tcpboxV0.2/tcpiface/irouter.go b/tcpboxV0.2/tcpiface/irouter.go
deleted file mode 100644
index 8ccd272..0000000
--- a/tcpboxV0.2/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.2/tcpiface/iserver.go b/tcpboxV0.2/tcpiface/iserver.go
deleted file mode 100644
index 0b108f3..0000000
--- a/tcpboxV0.2/tcpiface/iserver.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
- //路由功能:给当前的服务注册一个路由方法,共客户端的链接处理使用
- AddRouter(router IRouter)
-}
diff --git a/tcpboxV0.2/tcpnet/connection.go b/tcpboxV0.2/tcpnet/connection.go
deleted file mode 100644
index c372852..0000000
--- a/tcpboxV0.2/tcpnet/connection.go
+++ /dev/null
@@ -1,118 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
-
- //当球按连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-
- //该连接处理的router方法
- Router tcpiface.IRouter
-}
-
-//初始化链接模块的方法
-func NewConnection(conn *net.TCPConn, connID uint32, router tcpiface.IRouter) *Connection {
- c := &Connection{
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- Router: router,
- ExitChan: make(chan bool, 1),
- }
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "Reader is exit,RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取刻划断的数据到buf中,最大512字节
- for {
- buf := make([]byte, 512)
- _, err := c.Conn.Read(buf)
- if nil != err {
- fmt.Println("receive buf err", err)
- continue
- }
-
- req := Request{
- conn: c,
- data: buf,
- }
-
- go func(request tcpiface.IRequest) {
- c.Router.PreHandle(request)
- c.Router.Handle(request)
- c.Router.PostHandle(request)
- }(&req)
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- c.Conn.Close()
-
- //关闭信道
- close(c.ExitChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) Send(data []byte) error {
- return nil
-}
diff --git a/tcpboxV0.2/tcpnet/request.go b/tcpboxV0.2/tcpnet/request.go
deleted file mode 100644
index 38df779..0000000
--- a/tcpboxV0.2/tcpnet/request.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- data []byte
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.data
-}
diff --git a/tcpboxV0.2/tcpnet/server.go b/tcpboxV0.2/tcpnet/server.go
deleted file mode 100644
index 47faf54..0000000
--- a/tcpboxV0.2/tcpnet/server.go
+++ /dev/null
@@ -1,95 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
- //当前的server添加一个router,server注册的链接对应的处理业务
- Router tcpiface.IRouter
-}
-
-func (s *Server) Start() {
-
- //用一个goroution来处理
-
- go func() {
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
- defer conn.Close()
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(conn, cid, s.Router)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-}
-
-func (s *Server) AddRouter(router tcpiface.IRouter) {
- s.Router = router
- fmt.Println("Add Router successfully!!!")
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: name,
- IPVersion: "tcp4",
- IP: "0.0.0.0",
- Port: 8999,
- Router: nil,
- }
- return s
-}
diff --git a/tcpboxV0.3/Client.go b/tcpboxV0.3/Client.go
deleted file mode 100644
index ebf0da4..0000000
--- a/tcpboxV0.3/Client.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package main
-
-import (
- "fmt"
- "net"
- "time"
-)
-
-func main() {
-
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- buf := make([]byte, 512)
- //var in string
- //n, err := fmt.Scan(&in)
- //if nil != err {
- // fmt.Println("Scan message err:", err)
- // continue
- //}
-
- n, err := conn.Write([]byte("你好!"))
- if nil != err {
- fmt.Println("write err:", err)
- return
- }
- fmt.Println("Server sent ", "你好啊!")
- n, err = conn.Read(buf[:n])
- if nil != err {
- fmt.Println("read err:", err)
- return
- }
- fmt.Println("Server read ", string(buf))
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.3/Server.go b/tcpboxV0.3/Server.go
deleted file mode 100644
index 48542d9..0000000
--- a/tcpboxV0.3/Server.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package main
-
-import (
- "fmt"
- "zinx/ziface"
- "zinx/znet"
-)
-
-type PingRouter struct{}
-
-func (p *PingRouter) PreHandle(request ziface.IRequest) {
- fmt.Println("Call Router PreHandle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back before ping err:", err)
- }
-}
-func (p *PingRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call Router Handle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-func (p *PingRouter) PostHandle(request ziface.IRequest) {
- fmt.Println("Call Router PostHandle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back after ping err:", err)
- }
-}
-
-func main() {
- //创建服务器对象
- s := znet.NewServer("[Zinx V0.3]")
- //
- s.AddRouter(&PingRouter{})
- s.Server()
-}
diff --git a/tcpboxV0.3/conf/zinx.json b/tcpboxV0.3/conf/zinx.json
deleted file mode 100644
index 2ba2427..0000000
--- a/tcpboxV0.3/conf/zinx.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Name": "ZinxApp",
- "Host": "0.0.0.0",
- "Version": 0.3,
- "MaxConn": 1000,
- "MaxPackageSize": 4096
-}
\ No newline at end of file
diff --git a/tcpboxV0.3/go.mod b/tcpboxV0.3/go.mod
deleted file mode 100644
index 00af073..0000000
--- a/tcpboxV0.3/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module tcpbox
-
-go 1.18
diff --git a/tcpboxV0.3/tcpiface/iconnection.go b/tcpboxV0.3/tcpiface/iconnection.go
deleted file mode 100644
index 8fa8632..0000000
--- a/tcpboxV0.3/tcpiface/iconnection.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- Send(data []byte) error
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.3/tcpiface/irequest.go b/tcpboxV0.3/tcpiface/irequest.go
deleted file mode 100644
index 069c712..0000000
--- a/tcpboxV0.3/tcpiface/irequest.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-}
diff --git a/tcpboxV0.3/tcpiface/irouter.go b/tcpboxV0.3/tcpiface/irouter.go
deleted file mode 100644
index 8ccd272..0000000
--- a/tcpboxV0.3/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.3/tcpiface/iserver.go b/tcpboxV0.3/tcpiface/iserver.go
deleted file mode 100644
index 0b108f3..0000000
--- a/tcpboxV0.3/tcpiface/iserver.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
- //路由功能:给当前的服务注册一个路由方法,共客户端的链接处理使用
- AddRouter(router IRouter)
-}
diff --git a/tcpboxV0.3/tcpnet/connection.go b/tcpboxV0.3/tcpnet/connection.go
deleted file mode 100644
index c38ee2e..0000000
--- a/tcpboxV0.3/tcpnet/connection.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
-
- //当球按连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-
- //该连接处理的router方法
- Router tcpiface.IRouter
-}
-
-//初始化链接模块的方法
-func NewConnection(conn *net.TCPConn, connID uint32, router tcpiface.IRouter) *Connection {
- c := &Connection{
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- Router: router,
- ExitChan: make(chan bool, 1),
- }
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "Reader is exit,RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取刻划断的数据到buf中,最大512字节
- for {
- buf := make([]byte, utils.GlobalObject.MaxPackageSize)
- _, err := c.Conn.Read(buf)
- if nil != err {
- fmt.Println("receive buf err", err)
- continue
- }
-
- req := Request{
- conn: c,
- data: buf,
- }
-
- go func(request tcpiface.IRequest) {
- c.Router.PreHandle(request)
- c.Router.Handle(request)
- c.Router.PostHandle(request)
- }(&req)
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- c.Conn.Close()
-
- //关闭信道
- close(c.ExitChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) Send(data []byte) error {
- return nil
-}
diff --git a/tcpboxV0.3/tcpnet/request.go b/tcpboxV0.3/tcpnet/request.go
deleted file mode 100644
index 38df779..0000000
--- a/tcpboxV0.3/tcpnet/request.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- data []byte
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.data
-}
diff --git a/tcpboxV0.3/tcpnet/router.go b/tcpboxV0.3/tcpnet/router.go
deleted file mode 100644
index a2c6c5c..0000000
--- a/tcpboxV0.3/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.3/tcpnet/server.go b/tcpboxV0.3/tcpnet/server.go
deleted file mode 100644
index 1645224..0000000
--- a/tcpboxV0.3/tcpnet/server.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
- //当前的server添加一个router,server注册的链接对应的处理业务
- Router tcpiface.IRouter
-}
-
-func (s *Server) Start() {
-
- //在启动之初打印一下zinx的配置信息
- fmt.Printf("[Zinx] Name:%s\n", utils.GlobalObject.Name)
- fmt.Printf("[Zinx] Host:%s,Port:%d\n", utils.GlobalObject.Host, utils.GlobalObject.Port)
- fmt.Printf("[Zinx] Version:%s,MaxConn:%d,MaxPackageSize:%d\n", utils.GlobalObject.Version,
- +utils.GlobalObject.MaxConn, utils.GlobalObject.MaxPackageSize)
-
- //用一个goroution来处理
-
- go func() {
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
- defer conn.Close()
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(conn, cid, s.Router)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-}
-
-func (s *Server) AddRouter(router tcpiface.IRouter) {
- s.Router = router
- fmt.Println("Add Router successfully!!!")
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: utils.GlobalObject.Name,
- IPVersion: "tcp4",
- IP: utils.GlobalObject.Host,
- Port: utils.GlobalObject.Port,
- Router: nil,
- }
- return s
-}
diff --git a/tcpboxV0.3/utils/globalobj.go b/tcpboxV0.3/utils/globalobj.go
deleted file mode 100644
index da39a08..0000000
--- a/tcpboxV0.3/utils/globalobj.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package utils
-
-import (
- "encoding/json"
- "io/ioutil"
- "zinx/ziface"
-)
-
-/*
- 存储一切有关zinx框架的全局参数,供其他模块使用
- 一些参数是可以由用户通过zinx.json配置
-*/
-
-type GlobalObj struct {
- /*
- server
-
- */
- //服务器名称
- TcpServer ziface.IServer
- //主机地址
- Host string
- //服务端口
- Port int
- //服务器名称
- Name string
- /*
-
- zinx
-
- */
- Version string
- MaxConn int
- MaxPackageSize uint32
-}
-
-//定义一个全局的对外对象
-
-var GlobalObject *GlobalObj
-
-//提供一个init方法,初始化GlobalObject对象
-func init() {
- //如果配置文件没有加载,此为默认的配置
- GlobalObject = &GlobalObj{
- Name: "ZinxAPP",
- Host: "0.0.0.0",
- Port: 8999,
- MaxConn: 1000,
- MaxPackageSize: 4096,
- }
-
- //应该加载用户自定义的参数
- GlobalObject.Reload()
-}
-
-//从zinx.json去加载用户自定义的参数
-func (g *GlobalObj) Reload() {
- data, err := ioutil.ReadFile("./conf/zinx.json")
- if nil != err {
- panic("[Reload] Reload failed")
- }
- json.Unmarshal(data, &GlobalObject)
-}
diff --git a/tcpboxV0.4/Client.go b/tcpboxV0.4/Client.go
deleted file mode 100644
index ebf0da4..0000000
--- a/tcpboxV0.4/Client.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package main
-
-import (
- "fmt"
- "net"
- "time"
-)
-
-func main() {
-
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- buf := make([]byte, 512)
- //var in string
- //n, err := fmt.Scan(&in)
- //if nil != err {
- // fmt.Println("Scan message err:", err)
- // continue
- //}
-
- n, err := conn.Write([]byte("你好!"))
- if nil != err {
- fmt.Println("write err:", err)
- return
- }
- fmt.Println("Server sent ", "你好啊!")
- n, err = conn.Read(buf[:n])
- if nil != err {
- fmt.Println("read err:", err)
- return
- }
- fmt.Println("Server read ", string(buf))
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.4/Server.go b/tcpboxV0.4/Server.go
deleted file mode 100644
index 48542d9..0000000
--- a/tcpboxV0.4/Server.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package main
-
-import (
- "fmt"
- "zinx/ziface"
- "zinx/znet"
-)
-
-type PingRouter struct{}
-
-func (p *PingRouter) PreHandle(request ziface.IRequest) {
- fmt.Println("Call Router PreHandle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back before ping err:", err)
- }
-}
-func (p *PingRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call Router Handle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-func (p *PingRouter) PostHandle(request ziface.IRequest) {
- fmt.Println("Call Router PostHandle...")
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back after ping err:", err)
- }
-}
-
-func main() {
- //创建服务器对象
- s := znet.NewServer("[Zinx V0.3]")
- //
- s.AddRouter(&PingRouter{})
- s.Server()
-}
diff --git a/tcpboxV0.4/conf/zinx.json b/tcpboxV0.4/conf/zinx.json
deleted file mode 100644
index 2ba2427..0000000
--- a/tcpboxV0.4/conf/zinx.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Name": "ZinxApp",
- "Host": "0.0.0.0",
- "Version": 0.3,
- "MaxConn": 1000,
- "MaxPackageSize": 4096
-}
\ No newline at end of file
diff --git a/tcpboxV0.4/go.mod b/tcpboxV0.4/go.mod
deleted file mode 100644
index 00af073..0000000
--- a/tcpboxV0.4/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module tcpbox
-
-go 1.18
diff --git a/tcpboxV0.4/tcpiface/iconnection.go b/tcpboxV0.4/tcpiface/iconnection.go
deleted file mode 100644
index 8fa8632..0000000
--- a/tcpboxV0.4/tcpiface/iconnection.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- Send(data []byte) error
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.4/tcpiface/imsgpack.go b/tcpboxV0.4/tcpiface/imsgpack.go
deleted file mode 100644
index 6711134..0000000
--- a/tcpboxV0.4/tcpiface/imsgpack.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
-
- 封包、拆包模块
- 直接面向tcp中的数据流,解决粘包问题
-*/
-
-type IMsgPack interface {
-
- //获取消息的长度
- GetMsgLen() uint32
- //将消息封装
- Pack(message IMessage) ([]byte, error)
-
- //拆包,获取消息内容
- Unpack([]byte) (IMessage, error)
-}
diff --git a/tcpboxV0.4/tcpiface/irequest.go b/tcpboxV0.4/tcpiface/irequest.go
deleted file mode 100644
index 069c712..0000000
--- a/tcpboxV0.4/tcpiface/irequest.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-}
diff --git a/tcpboxV0.4/tcpiface/irouter.go b/tcpboxV0.4/tcpiface/irouter.go
deleted file mode 100644
index 8ccd272..0000000
--- a/tcpboxV0.4/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.4/tcpiface/iserver.go b/tcpboxV0.4/tcpiface/iserver.go
deleted file mode 100644
index 0b108f3..0000000
--- a/tcpboxV0.4/tcpiface/iserver.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
- //路由功能:给当前的服务注册一个路由方法,共客户端的链接处理使用
- AddRouter(router IRouter)
-}
diff --git a/tcpboxV0.4/tcpnet/connection.go b/tcpboxV0.4/tcpnet/connection.go
deleted file mode 100644
index 61c18b2..0000000
--- a/tcpboxV0.4/tcpnet/connection.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
-
- //当前连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-
- //该连接处理的router方法
- Router tcpiface.IRouter
-}
-
-//初始化链接模块的方法
-func NewConnection(conn *net.TCPConn, connID uint32, router tcpiface.IRouter) *Connection {
- c := &Connection{
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- Router: router,
- ExitChan: make(chan bool, 1),
- }
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "Reader is exit,RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取此刻链接的数据到buf中,最大512字节
- for {
- buf := make([]byte, utils.GlobalObject.MaxPackageSize)
- _, err := c.Conn.Read(buf)
- if nil != err {
- fmt.Println("receive buf err", err)
- continue
- }
-
- req := Request{
- conn: c,
- data: buf,
- }
-
- go func(request tcpiface.IRequest) {
- c.Router.PreHandle(request)
- c.Router.Handle(request)
- c.Router.PostHandle(request)
- }(&req)
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- c.Conn.Close()
-
- //关闭信道
- close(c.ExitChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) Send(data []byte) error {
- return nil
-}
diff --git a/tcpboxV0.4/tcpnet/message.go b/tcpboxV0.4/tcpnet/message.go
deleted file mode 100644
index 79f48c3..0000000
--- a/tcpboxV0.4/tcpnet/message.go
+++ /dev/null
@@ -1,42 +0,0 @@
-package tcpnet
-
-type Message struct {
- //消息的ID
- MsgID uint32
-
- //消息的长度
- MsgLen uint32
-
- //消息的内容
- MsgData []byte
-}
-
-//获取消息的ID
-func (m *Message) GetMsgID() uint32 {
- return m.MsgID
-}
-
-//获取消息的长度
-func (m *Message) GetMsgLen() uint32 {
- return m.MsgLen
-}
-
-//获取消息的内容
-func (m *Message) GetMsgData() []byte {
- return m.MsgData
-}
-
-//设置消息的ID
-func (m *Message) SetMsgID(id uint32) {
- m.MsgID = id
-}
-
-//设置消息的长度
-func (m *Message) SetMsgLen(len uint32) {
- m.MsgLen = len
-}
-
-//设置消息的内容
-func (m *Message) SetMsgData(data []byte) {
- m.MsgData = data
-}
diff --git a/tcpboxV0.4/tcpnet/msgpack.go b/tcpboxV0.4/tcpnet/msgpack.go
deleted file mode 100644
index 8a6e162..0000000
--- a/tcpboxV0.4/tcpnet/msgpack.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package tcpnet
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type DataPack struct {
-}
-
-func NewDataPack() *DataPack {
- return &DataPack{}
-}
-
-//获取包的头部长度的方法
-func (dp *DataPack) GetHeadLen() uint32 {
- //datalen uint32 (4个字节) + dataID uint32(4个字节)
- return 8
-}
-
-//将消息打包
-func (dp *DataPack) Pack(msg tcpiface.IMessage) (data []byte, err error) {
- //创建一个存放bytes字节的缓冲
- dataBuf := bytes.NewBuffer([]byte{})
- //将dataLen写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgLen())
- if nil != err {
- return nil, err
- }
-
- //将dataID写入到dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgID())
- if nil != err {
- return nil, err
- }
-
- //将消息内容写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgData())
- if nil != err {
- return nil, err
- }
- return dataBuf.Bytes(), nil
-}
-
-//拆包方法 ,先将head中信息读出来,再根据head中的data长度再进行一次读
-func (dp *DataPack) Unpack(binaryData []byte) (tcpiface.IMessage, error) {
-
- //创建一个从输入二进制的ioReader
- dataBuf := bytes.NewBuffer(binaryData)
-
- //只解压head信息,获取dataLen和dataID信息
- msg := &Message{}
-
- //读取dataLen
- err := binary.Read(dataBuf, binary.LittleEndian, &msg.MsgLen)
- if nil != err {
- return nil, err
- }
-
- //读取dataID
- err = binary.Read(dataBuf, binary.LittleEndian, &msg.MsgID)
- if nil != err {
- return nil, err
- }
-
- //判断dataLen是否已经超出了我们允许的最大长度
- if utils.GlobalObject.MaxPackageSize > 0 && msg.MsgLen > utils.GlobalObject.MaxPackageSize {
- return nil, errors.New("too large msg data ,recv")
- }
- return msg, nil
-
-}
diff --git a/tcpboxV0.4/tcpnet/msgpack_test.go b/tcpboxV0.4/tcpnet/msgpack_test.go
deleted file mode 100644
index f050532..0000000
--- a/tcpboxV0.4/tcpnet/msgpack_test.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "io"
- "net"
- "testing"
-)
-
-func TestDataPack(t *testing.T) {
-
- /*
- 模拟服务器
- */
- //1、创建socketTCP
- listen, err := net.Listen("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Println("Server listen failed!!! err:", err)
- return
- }
-
- //创建一个goroutine承载,负责从客户端处理业务
- go func() {
-
- //2、从客户端读取数据,拆包处理
- for {
- conn, err := listen.Accept()
- if nil != err {
- fmt.Println("Server accept failed!!! err:", err)
- return
- }
-
- go func(conn net.Conn) {
- //处理客户端请求
- //----------》拆包过程《---------------
- //定义一个拆包的对象dp
- dp := NewDataPack()
- for {
- //1、第一次从conn读,把包的head读出来
- headData := make([]byte, dp.GetHeadLen())
- _, err := io.ReadFull(conn, headData)
- if nil != err {
- fmt.Println("Read head failed!!! err:", err)
- break
- }
-
- msgHead, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("Server unpack1 failed!!! err:", err)
- return
- }
-
- if msgHead.GetMsgLen() > 0 {
- //msg是有数据的,需要进行第二次读取
- //2、第二次从conn中读取,再根据head中的len读取data的内容
- msg := msgHead.(*Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- //根据dataLen的长度再次从io流中读取
- _, err := io.ReadFull(conn, msg.MsgData)
- if nil != err {
- fmt.Println("Server unpack2 failed!!! err:", err)
- return
- }
-
- //完整的一个消息已经读取完毕
- fmt.Println("---->Receive MsgID:", msg.MsgID, "dataLen:", msg.MsgLen, "data:", string(msg.MsgData))
- }
- }
-
- }(conn)
- }
- }()
-
- /*
-
- 模拟客户端
-
- */
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Println("Client dial failed!!! err:", err)
- return
-
- }
-
- //创建一个封包对象
- dp := NewDataPack()
-
- //模拟粘包过程
- //封装第一个包msg1
- msg1 := &Message{
- MsgLen: 5,
- MsgID: 1,
- MsgData: []byte{'a', 'b', 'c', 'd', 'e'},
- }
- sendData1, err := dp.Pack(msg1)
- if nil != err {
- fmt.Println("Client pack msg1 failed!!! err:", err)
- return
- }
-
- //封装第二个包msg1
- msg2 := &Message{
- MsgLen: 7,
- MsgID: 2,
- MsgData: []byte{'1', '2', '3', '4', '5', '6', '7'},
- }
-
- sendData2, err := dp.Pack(msg2)
- if nil != err {
- fmt.Println("Client pack msg2 failed!!! err:", err)
- return
- }
- //将两个包粘在一起
- sendData := append(sendData1, sendData2...)
-
- //一次性发送给服务端
- conn.Write(sendData)
-
- //阻塞客户端
- select {}
-}
diff --git a/tcpboxV0.4/tcpnet/request.go b/tcpboxV0.4/tcpnet/request.go
deleted file mode 100644
index 38df779..0000000
--- a/tcpboxV0.4/tcpnet/request.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- data []byte
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.data
-}
diff --git a/tcpboxV0.4/tcpnet/router.go b/tcpboxV0.4/tcpnet/router.go
deleted file mode 100644
index a2c6c5c..0000000
--- a/tcpboxV0.4/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.4/tcpnet/server.go b/tcpboxV0.4/tcpnet/server.go
deleted file mode 100644
index 1645224..0000000
--- a/tcpboxV0.4/tcpnet/server.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
- //当前的server添加一个router,server注册的链接对应的处理业务
- Router tcpiface.IRouter
-}
-
-func (s *Server) Start() {
-
- //在启动之初打印一下zinx的配置信息
- fmt.Printf("[Zinx] Name:%s\n", utils.GlobalObject.Name)
- fmt.Printf("[Zinx] Host:%s,Port:%d\n", utils.GlobalObject.Host, utils.GlobalObject.Port)
- fmt.Printf("[Zinx] Version:%s,MaxConn:%d,MaxPackageSize:%d\n", utils.GlobalObject.Version,
- +utils.GlobalObject.MaxConn, utils.GlobalObject.MaxPackageSize)
-
- //用一个goroution来处理
-
- go func() {
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
- defer conn.Close()
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(conn, cid, s.Router)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-}
-
-func (s *Server) AddRouter(router tcpiface.IRouter) {
- s.Router = router
- fmt.Println("Add Router successfully!!!")
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: utils.GlobalObject.Name,
- IPVersion: "tcp4",
- IP: utils.GlobalObject.Host,
- Port: utils.GlobalObject.Port,
- Router: nil,
- }
- return s
-}
diff --git a/tcpboxV0.4/utils/globalobj.go b/tcpboxV0.4/utils/globalobj.go
deleted file mode 100644
index 821ad1c..0000000
--- a/tcpboxV0.4/utils/globalobj.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package utils
-
-import (
- "encoding/json"
- "io/ioutil"
- "zinx/ziface"
-)
-
-/*
- 存储一切有关zinx框架的全局参数,供其他模块使用
- 一些参数是可以由用户通过zinx.json配置
-*/
-
-type GlobalObj struct {
- /*
- server
-
- */
- //服务器名称
- TcpServer ziface.IServer
- //主机地址
- Host string
- //服务端口
- Port int
- //服务器名称
- Name string
- /*
-
- zinx
-
- */
- Version string
- MaxConn int
- MaxPackageSize uint32
-}
-
-//定义一个全局的对外对象
-
-var GlobalObject *GlobalObj
-
-//提供一个init方法,初始化GlobalObject对象
-func init() {
- //如果配置文件没有加载,此为默认的配置
- GlobalObject = &GlobalObj{
- Name: "ZinxAPP",
- Host: "0.0.0.0",
- Port: 8999,
- MaxConn: 1000,
- MaxPackageSize: 4096,
- }
-
- //应该加载用户自定义的参数
- //GlobalObject.Reload()
-}
-
-//从zinx.json去加载用户自定义的参数
-func (g *GlobalObj) Reload() {
- data, err := ioutil.ReadFile("./conf/zinx.json")
- if nil != err {
- panic("[Reload] Reload failed")
- }
- json.Unmarshal(data, &GlobalObject)
-}
diff --git a/tcpboxV0.5/Client.go b/tcpboxV0.5/Client.go
deleted file mode 100644
index a2e68f9..0000000
--- a/tcpboxV0.5/Client.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client0 start ......")
- conn, err := net.Dial("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- fmt.Println(ms)
- binaryMsg, err := dp.Pack(ms)
- fmt.Println(binaryMsg)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println(binaryHead)
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.5/Client1.go b/tcpboxV0.5/Client1.go
deleted file mode 100644
index c07dd59..0000000
--- a/tcpboxV0.5/Client1.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client1 start .......")
- conn, err := net.Dial("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- fmt.Println(ms)
- binaryMsg, err := dp.Pack(ms)
- fmt.Println(binaryMsg)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println(binaryHead)
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.5/Server.go b/tcpboxV0.5/Server.go
deleted file mode 100644
index e3e063a..0000000
--- a/tcpboxV0.5/Server.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package main
-
-import (
- "fmt"
- "zinx/ziface"
- "zinx/znet"
-)
-
-type PingRouter struct{}
-
-func (p *PingRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call PingRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-type HelloRouter struct{}
-
-func (p *HelloRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call HelloRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("Hello...Hello...Hello..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-func main() {
- //创建服务器对象
- s := znet.NewServer("[Zinx V0.6]")
- //
- s.AddRouter(0, &PingRouter{})
- s.AddRouter(1, &HelloRouter{})
- s.Server()
-}
diff --git a/tcpboxV0.5/conf/zinx.json b/tcpboxV0.5/conf/zinx.json
deleted file mode 100644
index 0a19757..0000000
--- a/tcpboxV0.5/conf/zinx.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Name": "ZinxApp",
- "Host": "0.0.0.0",
- "Version": 0.6,
- "IPVersion": "tcp4",
- "Port": 8990,
- "MaxConn": 1000,
- "MaxPackageSize": 4096
-}
\ No newline at end of file
diff --git a/tcpboxV0.5/go.mod b/tcpboxV0.5/go.mod
deleted file mode 100644
index 00af073..0000000
--- a/tcpboxV0.5/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module tcpbox
-
-go 1.18
diff --git a/tcpboxV0.5/tcpiface/IMessage.go b/tcpboxV0.5/tcpiface/IMessage.go
deleted file mode 100644
index a3bd69f..0000000
--- a/tcpboxV0.5/tcpiface/IMessage.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-/*
-
- 设置消息的格式
-*/
-
-type IMessage interface {
-
- //获取消息的ID
- GetMsgID() uint32
-
- //获取消息的长度
- GetMsgLen() uint32
-
- //获取消息的内容
- GetMsgData() []byte
-
- //设置消息的ID
- SetMsgID(uint32)
-
- //设置消息的长度
- SetMsgLen(uint32)
-
- //设置消息的内容
- SetMsgData([]byte)
-}
diff --git a/tcpboxV0.5/tcpiface/iMsgHandle.go b/tcpboxV0.5/tcpiface/iMsgHandle.go
deleted file mode 100644
index 0728700..0000000
--- a/tcpboxV0.5/tcpiface/iMsgHandle.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package tcpiface
-
-/*
- ·根据消息调度路由处理和添加接口
-*/
-type IMsgHandle interface {
- //调度/执行对应的router处理方法
- DoMsgHandle(request IRequest)
-
- //为消息添加具体的处理逻辑
- AddRouter(msgID uint32, router IRouter)
-}
diff --git a/tcpboxV0.5/tcpiface/iconnection.go b/tcpboxV0.5/tcpiface/iconnection.go
deleted file mode 100644
index 1632c5d..0000000
--- a/tcpboxV0.5/tcpiface/iconnection.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- SendMsg(msgID uint32, data []byte) error
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.5/tcpiface/iserver.go b/tcpboxV0.5/tcpiface/iserver.go
deleted file mode 100644
index 573476e..0000000
--- a/tcpboxV0.5/tcpiface/iserver.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
- //路由功能:给当前的服务注册一个路由方法,共客户端的链接处理使用
- AddRouter(msgID uint32, router IRouter)
-}
diff --git a/tcpboxV0.5/tcpnet/connection.go b/tcpboxV0.5/tcpnet/connection.go
deleted file mode 100644
index de90711..0000000
--- a/tcpboxV0.5/tcpnet/connection.go
+++ /dev/null
@@ -1,161 +0,0 @@
-package tcpnet
-
-import (
- "errors"
- "fmt"
- "io"
- "net"
- "tcpbox/tcpiface"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
-
- //当球按连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-
- //消息的管理MsgID和对应的处理业务API关系
- MsgHandle tcpiface.IMsgHandle
-}
-
-//初始化链接模块的方法
-func NewConnection(conn *net.TCPConn, connID uint32, msgHandler tcpiface.IMsgHandle) *Connection {
- c := &Connection{
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- MsgHandle: msgHandler,
- ExitChan: make(chan bool, 1),
- }
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "Reader is exit,RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取刻划断的数据到buf中,最大512字节
- for {
- //buf := make([]byte, utils.GlobalObject.MaxPackageSize)
- //_, err := c.Conn.Read(buf)
- //if nil != err {
- // fmt.Println("receive buf err", err)
- // continue
- //}
-
- //创建一个装包拆包对象
- dp := NewDataPack()
-
- //读取客户端的msg head 二进制流8个字节
- headData := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), headData); nil != err {
- fmt.Println("Read msg error:", err)
- break
- }
- //拆包, 得到msg的id和len 放入到msg中
- msg, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("unpack error:", err)
- break
- }
-
- //拆包,得到dataLen 再次读取Data,放在msg.Data中
- var data []byte
- if msg.GetMsgLen() > 0 {
- data = make([]byte, msg.GetMsgLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), data); nil != err {
- fmt.Println("read msg data error:", err)
- break
- }
-
- }
- req := Request{
- conn: c,
- msg: msg,
- }
-
- //从路由中找到之前注册绑定的Conn对应的router调用
- //根据绑定好的MsgID找到对应处理api业务执行
- go c.MsgHandle.DoMsgHandle(&req)
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- c.Conn.Close()
-
- //关闭信道
- close(c.ExitChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) SendMsg(msgID uint32, data []byte) error {
- if c.isClosed == true {
- return errors.New("Connection closed when send msg")
- }
- dp := NewDataPack()
- //将data进行封包
- binaryMsg, err := dp.Pack(NewMsgPackage(msgID, data))
-
- if nil != err {
- fmt.Println("Pack error msg id :", msgID)
- return errors.New("Pack error msg")
- }
-
- //将数据发送到客户端
- if c.Conn.Write(binaryMsg); nil != err {
- fmt.Println("Write msg ID", msgID, "error:", err)
- return errors.New("conn Write error")
- }
- return nil
-}
diff --git a/tcpboxV0.5/tcpnet/msgHandle.go b/tcpboxV0.5/tcpnet/msgHandle.go
deleted file mode 100644
index a6d468b..0000000
--- a/tcpboxV0.5/tcpnet/msgHandle.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "strconv"
- "tcpbox/tcpiface"
-)
-
-type MsgHandler struct {
- //属性 根据消息ID调度路由
- Apis map[uint32]tcpiface.IRouter
-}
-
-//初始化创建MsgHandler的处理逻辑
-func NewMsgHandler() *MsgHandler {
- return &MsgHandler{
- Apis: make(map[uint32]tcpiface.IRouter),
- }
-}
-
-func (mh *MsgHandler) DoMsgHandle(request tcpiface.IRequest) {
-
- //从request中找到msgID
- handler, ok := mh.Apis[request.GetMsgID()]
- if !ok {
- fmt.Println("api msgID=", request.GetMsgID(), "is not dound! need register")
- }
-
- //根据msgID调度对应的业务处理
- //handler.PreHandle(request)
- handler.Handle(request)
- //handler.PostHandle(request)
-}
-
-//为消息添加具体的处理逻辑
-func (mh *MsgHandler) AddRouter(msgID uint32, router tcpiface.IRouter) {
- //判断当前msg绑定的api处理方法事都已经存在
- if _, ok := mh.Apis[msgID]; ok {
- //id 已经注册了
- panic("repeat api,msgID=" + strconv.Itoa(int(msgID)))
- }
- //添加msg与api的绑定关系
- mh.Apis[msgID] = router
- fmt.Println("Add api MsgID=", msgID, "successed!")
-}
diff --git a/tcpboxV0.5/tcpnet/msgpack.go b/tcpboxV0.5/tcpnet/msgpack.go
deleted file mode 100644
index 7eeefbc..0000000
--- a/tcpboxV0.5/tcpnet/msgpack.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package tcpnet
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type DataPack struct {
-}
-
-func NewDataPack() *DataPack {
- return &DataPack{}
-}
-
-//获取包的头部长度的方法
-func (dp *DataPack) GetHeadLen() uint32 {
- //datalen uint32 (4个字节) + dataID uint32(4个字节)
- return 8
-}
-
-//将消息打包
-func (dp *DataPack) Pack(msg tcpiface.IMessage) (data []byte, err error) {
- //创建一个存放bytes字节的缓冲
- dataBuf := bytes.NewBuffer([]byte{})
-
- //将dataLen写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgLen())
- if nil != err {
- return nil, err
- }
-
- //将dataID写入到dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgID())
- if nil != err {
- return nil, err
- }
-
- //将消息内容写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgData())
- if nil != err {
- return nil, err
- }
-
- return dataBuf.Bytes(), nil
-}
-
-//拆包方法 ,先将head中信息读出来,再根据head中的data长度再进行一次读
-func (dp *DataPack) Unpack(binaryData []byte) (tcpiface.IMessage, error) {
-
- //创建一个从输入二进制的ioReader
- dataBuf := bytes.NewBuffer(binaryData)
-
- //只解压head信息,获取dataLen和dataID信息
- msg := &Message{}
-
- //读取dataLen
- err := binary.Read(dataBuf, binary.LittleEndian, &msg.MsgLen)
- if nil != err {
- return nil, err
- }
-
- //读取dataID
- err = binary.Read(dataBuf, binary.LittleEndian, &msg.MsgID)
- if nil != err {
- return nil, err
- }
-
- //判断dataLen是否已经超出了我们允许的最大长度
- if utils.GlobalObject.MaxPackageSize > 0 && msg.MsgLen > utils.GlobalObject.MaxPackageSize {
- return nil, errors.New("too large msg data recv!")
- }
- return msg, nil
-
-}
diff --git a/tcpboxV0.5/tcpnet/msgpack_test.go b/tcpboxV0.5/tcpnet/msgpack_test.go
deleted file mode 100644
index 230199c..0000000
--- a/tcpboxV0.5/tcpnet/msgpack_test.go
+++ /dev/null
@@ -1,121 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "io"
- "net"
- "testing"
-)
-
-func TestDataPack(t *testing.T) {
-
- /*
- 模拟服务器
- */
- //1、创建socketTCP
- listen, err := net.Listen("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Server listen failed!!! err:", err)
- return
- }
-
- //创建一个goroutine承载,负责从客户端处理业务
- go func() {
-
- //2、从客户端读取数据,拆包处理
- for {
- conn, err := listen.Accept()
- if nil != err {
- fmt.Println("Server accept failed!!! err:", err)
- return
- }
-
- go func(conn net.Conn) {
- //处理客户端请求
- //----------》拆包过程《---------------
- //定义一个拆包的对象dp
- dp := NewDataPack()
- for {
- //1、第一次从conn读,把包的head读出来
- headData := make([]byte, dp.GetHeadLen())
- _, err := io.ReadFull(conn, headData)
- if nil != err {
- fmt.Println("Read head failed!!! err:", err)
- break
- }
- msgHead, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("Server unpack1 failed!!! err:", err)
- return
- }
-
- if msgHead.GetMsgLen() > 0 {
- //msg是有数据的,需要进行第二次读取
- //2、第二次从conn中读取,再根据head中的len读取data的内容
- msg := msgHead.(*Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- //根据dataLen的长度再次从io流中读取
- _, err := io.ReadFull(conn, msg.MsgData)
- if nil != err {
- fmt.Println("Server unpack2 failed!!! err:", err)
- return
- }
-
- //完整的一个消息已经读取完毕
- fmt.Println("---->Receive MsgID:", msg.MsgID, "dataLen:", msg.MsgLen, "data:", string(msg.MsgData))
- }
- }
-
- }(conn)
- }
- }()
-
- /*
-
- 模拟客户端
-
- */
- conn, err := net.Dial("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Client dial failed!!! err:", err)
- return
-
- }
-
- //创建一个封包对象
- dp := NewDataPack()
-
- //模拟粘包过程
- //封装第一个包msg1
- msg1 := &Message{
- MsgID: 1,
- MsgLen: 5,
- MsgData: []byte{'a', 'b', 'c', 'd', 'e'},
- }
- sendData1, err := dp.Pack(msg1)
- if nil != err {
- fmt.Println("Client pack msg1 failed!!! err:", err)
- return
- }
-
- //封装第二个包msg1
- msg2 := &Message{
- MsgID: 2,
- MsgLen: 7,
- MsgData: []byte{'1', '2', '3', '4', '5', '6', '7'},
- }
- sendData2, err := dp.Pack(msg2)
- if nil != err {
- fmt.Println("Client pack msg2 failed!!! err:", err)
- return
- }
- //将两个包粘在一起
- sendData := append(sendData1, sendData2...)
-
- //一次性发送给服务端
- conn.Write(sendData)
-
- //阻塞客户端
- select {}
-}
diff --git a/tcpboxV0.5/tcpnet/router.go b/tcpboxV0.5/tcpnet/router.go
deleted file mode 100644
index a2c6c5c..0000000
--- a/tcpboxV0.5/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.5/tcpnet/server.go b/tcpboxV0.5/tcpnet/server.go
deleted file mode 100644
index 7fd9e96..0000000
--- a/tcpboxV0.5/tcpnet/server.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
- //当前的server添加一个router,server注册的链接对应的处理业务
- MsgHandler tcpiface.IMsgHandle
-}
-
-func (s *Server) Start() {
-
- //在启动之初打印一下zinx的配置信息
- fmt.Printf("[Zinx] Name:%s\n", utils.GlobalObject.Name)
- fmt.Printf("[Zinx] Host:%s,Port:%d\n", utils.GlobalObject.Host, utils.GlobalObject.Port)
- fmt.Printf("[Zinx] Version:%s,MaxConn:%d,MaxPackageSize:%d\n", utils.GlobalObject.Version,
- +utils.GlobalObject.MaxConn, utils.GlobalObject.MaxPackageSize)
-
- //用一个goroution来处理
-
- go func() {
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
- defer conn.Close()
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(conn, cid, s.MsgHandler)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-}
-
-func (s *Server) AddRouter(msgID uint32, router tcpiface.IRouter) {
- s.MsgHandler.AddRouter(msgID, router)
- fmt.Println("Add Router successfully!!!")
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: utils.GlobalObject.Name,
- IPVersion: "tcp4",
- IP: utils.GlobalObject.Host,
- Port: utils.GlobalObject.Port,
- MsgHandler: NewMsgHandler(),
- }
- return s
-}
diff --git a/tcpboxV0.5/utils/globalobj.go b/tcpboxV0.5/utils/globalobj.go
deleted file mode 100644
index 470c871..0000000
--- a/tcpboxV0.5/utils/globalobj.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package utils
-
-import (
- "encoding/json"
- "io/ioutil"
- "zinx/ziface"
-)
-
-/*
- 存储一切有关zinx框架的全局参数,供其他模块使用
- 一些参数是可以由用户通过zinx.json配置
-*/
-
-type GlobalObj struct {
- /*
- server
-
- */
- //服务器名称
- TcpServer ziface.IServer
- //主机地址
- Host string
- //服务端口
- Port int
- //服务器名称
- Name string
- /*
-
- zinx
-
- */
- Version string
- IPVersion string
- MaxConn int
- MaxPackageSize uint32
-}
-
-//定义一个全局的对外对象
-
-var GlobalObject *GlobalObj
-
-//提供一个init方法,初始化GlobalObject对象
-func init() {
- //如果配置文件没有加载,此为默认的配置
- GlobalObject = &GlobalObj{
- Name: "ZinxAPP",
- Host: "0.0.0.0",
- IPVersion: "tcp4",
- Port: 8999,
- MaxConn: 1000,
- MaxPackageSize: 4096,
- }
-
- //应该加载用户自定义的参数
- //GlobalObject.Reload()
-}
-
-//从zinx.json去加载用户自定义的参数
-func (g *GlobalObj) Reload() {
- data, err := ioutil.ReadFile("./conf/zinx.json")
- if nil != err {
- panic("[Reload] Reload failed")
- }
- json.Unmarshal(data, &GlobalObject)
-}
diff --git a/tcpboxV0.6/Client.go b/tcpboxV0.6/Client.go
deleted file mode 100644
index 5c11e30..0000000
--- a/tcpboxV0.6/Client.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client0 start ......")
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- binaryMsg, err := dp.Pack(ms)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- fmt.Println(binaryHead)
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.6/Server.go b/tcpboxV0.6/Server.go
deleted file mode 100644
index dd40c22..0000000
--- a/tcpboxV0.6/Server.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package main
-
-import (
- "fmt"
- "zinx/ziface"
- "zinx/znet"
-)
-
-type PingRouter struct{}
-
-func (p *PingRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call PingRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-type HelloRouter struct{}
-
-func (p *HelloRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call HelloRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("Hello...Hello...Hello..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-func main() {
- //创建服务器对象
- s := znet.NewServer("[Zinx V0.6]")
- s.AddRouter(0, &PingRouter{})
- s.AddRouter(1, &HelloRouter{})
- s.Server()
-}
diff --git a/tcpboxV0.6/conf/zinx.json b/tcpboxV0.6/conf/zinx.json
deleted file mode 100644
index 4546f29..0000000
--- a/tcpboxV0.6/conf/zinx.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "Name": "ZinxApp",
- "Host": "0.0.0.0",
- "Version": 0.6,
- "IPVersion": "tcp4",
- "Port": 8990,
- "MaxConn": 1000,
- "MaxPackageSize": 4096,
- "WorkerPoolSize": 10,
- "MaxWorkTaskLen": 1024,
-}
\ No newline at end of file
diff --git a/tcpboxV0.6/go.mod b/tcpboxV0.6/go.mod
deleted file mode 100644
index 00af073..0000000
--- a/tcpboxV0.6/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module tcpbox
-
-go 1.18
diff --git a/tcpboxV0.6/tcpiface/IMessage.go b/tcpboxV0.6/tcpiface/IMessage.go
deleted file mode 100644
index a3bd69f..0000000
--- a/tcpboxV0.6/tcpiface/IMessage.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-/*
-
- 设置消息的格式
-*/
-
-type IMessage interface {
-
- //获取消息的ID
- GetMsgID() uint32
-
- //获取消息的长度
- GetMsgLen() uint32
-
- //获取消息的内容
- GetMsgData() []byte
-
- //设置消息的ID
- SetMsgID(uint32)
-
- //设置消息的长度
- SetMsgLen(uint32)
-
- //设置消息的内容
- SetMsgData([]byte)
-}
diff --git a/tcpboxV0.6/tcpiface/iconnection.go b/tcpboxV0.6/tcpiface/iconnection.go
deleted file mode 100644
index 1632c5d..0000000
--- a/tcpboxV0.6/tcpiface/iconnection.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- SendMsg(msgID uint32, data []byte) error
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.6/tcpiface/imsgpack.go b/tcpboxV0.6/tcpiface/imsgpack.go
deleted file mode 100644
index 80264b5..0000000
--- a/tcpboxV0.6/tcpiface/imsgpack.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
-
- 封包、拆包模块
- 直接面向tcp中的数据流,解决粘包问题
-*/
-
-type IMsgPack interface {
-
- //获取消息的长度
- GetHeadLen() uint32
- //将消息封装
- Pack(message IMessage) ([]byte, error)
-
- //拆包,获取消息内容
- Unpack([]byte) (IMessage, error)
-}
diff --git a/tcpboxV0.6/tcpiface/irequest.go b/tcpboxV0.6/tcpiface/irequest.go
deleted file mode 100644
index d190b13..0000000
--- a/tcpboxV0.6/tcpiface/irequest.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-
- //获取请求消息的ID
- GetMsgID() uint32
-}
diff --git a/tcpboxV0.6/tcpiface/irouter.go b/tcpboxV0.6/tcpiface/irouter.go
deleted file mode 100644
index 1542a2c..0000000
--- a/tcpboxV0.6/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- //PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- //PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.6/tcpiface/iserver.go b/tcpboxV0.6/tcpiface/iserver.go
deleted file mode 100644
index 573476e..0000000
--- a/tcpboxV0.6/tcpiface/iserver.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
- //路由功能:给当前的服务注册一个路由方法,共客户端的链接处理使用
- AddRouter(msgID uint32, router IRouter)
-}
diff --git a/tcpboxV0.6/tcpnet/connection.go b/tcpboxV0.6/tcpnet/connection.go
deleted file mode 100644
index fbe9c25..0000000
--- a/tcpboxV0.6/tcpnet/connection.go
+++ /dev/null
@@ -1,199 +0,0 @@
-package tcpnet
-
-import (
- "errors"
- "fmt"
- "io"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
-
- //当球按连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-
- //开一个无缓冲的通道,用于读写之间的消息通信
- MsgChan chan []byte
-
- //消息的管理MsgID和对应的处理业务API关系
- MsgHandle tcpiface.IMsgHandle
-}
-
-//初始化链接模块的方法
-func NewConnection(conn *net.TCPConn, connID uint32, msgHandler tcpiface.IMsgHandle) *Connection {
- c := &Connection{
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- MsgHandle: msgHandler,
- MsgChan: make(chan []byte),
- ExitChan: make(chan bool, 1),
- }
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "[Reader is exit],RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取刻划断的数据到buf中,最大512字节
- for {
- //buf := make([]byte, utils.GlobalObject.MaxPackageSize)
- //_, err := c.Conn.Read(buf)
- //if nil != err {
- // fmt.Println("receive buf err", err)
- // continue
- //}
-
- //创建一个装包拆包对象
- dp := NewDataPack()
-
- //读取客户端的msg head 二进制流8个字节
- headData := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), headData); nil != err {
- fmt.Println("Read msg error:", err)
- break
- }
- //拆包, 得到msg的id和len 放入到msg中
- msg, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("unpack error:", err)
- break
- }
-
- //拆包,得到dataLen 再次读取Data,放在msg.Data中
- var data []byte
- if msg.GetMsgLen() > 0 {
- data = make([]byte, msg.GetMsgLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), data); nil != err {
- fmt.Println("read msg data error:", err)
- break
- }
-
- }
- req := Request{
- conn: c,
- msg: msg,
- }
-
- if utils.GlobalObject.WorkerPoolSize > 0 {
- //已经开启了工作池模式,将消息发送给worker工作池处理即可
- c.MsgHandle.SendMsgToTaskQueue(&req)
- } else {
- //从路由中找到之前注册绑定的Conn对应的router调用
- //根据绑定好的MsgID找到对应处理api业务执行
- go c.MsgHandle.DoMsgHandle(&req)
- }
-
- }
-}
-
-//写消息的goroutine,专门将消息发送给客户端的模块
-func (c *Connection) StartWriter() {
- fmt.Println("Writer Goroutine is running!!!")
- defer fmt.Println(c.RemoteAddr().String(), "[conn writer exit!]")
-
- //不断阻塞的等待channel的消息,进行写给客户端
- for {
- select {
- case data := <-c.MsgChan:
- //有数据要写给客户端
- if _, err := c.Conn.Write(data); nil != err {
- fmt.Println("Send data error:", err)
- return
- }
- case <-c.ExitChan:
- //代表Reader已经退出,此时Writer也要退出
- return
-
- }
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
- //启动写数据业务
- go c.StartWriter()
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- //关闭socket链接
- c.Conn.Close()
-
- //告知Writer关闭
- c.ExitChan <- true
-
- //关闭信道
- close(c.ExitChan)
- close(c.MsgChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) SendMsg(msgID uint32, data []byte) error {
- if c.isClosed == true {
- return errors.New("Connection closed when send msg")
- }
- dp := NewDataPack()
- //将data进行封包
- binaryMsg, err := dp.Pack(NewMsgPackage(msgID, data))
-
- if nil != err {
- fmt.Println("Pack error msg id :", msgID)
- return errors.New("Pack error msg")
- }
-
- //将数据发送到客户端
- c.MsgChan <- binaryMsg
- return nil
-}
diff --git a/tcpboxV0.6/tcpnet/message.go b/tcpboxV0.6/tcpnet/message.go
deleted file mode 100644
index 79ebca2..0000000
--- a/tcpboxV0.6/tcpnet/message.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package tcpnet
-
-type Message struct {
- //消息的ID
- MsgID uint32
-
- //消息的长度
- MsgLen uint32
-
- //消息的内容
- MsgData []byte
-}
-
-//创建一个Message消息包
-func NewMsgPackage(msgID uint32, data []byte) *Message {
- return &Message{
- MsgID: msgID,
- MsgLen: uint32(len(data)),
- MsgData: data,
- }
-}
-
-//获取消息的ID
-func (m *Message) GetMsgID() uint32 {
- return m.MsgID
-}
-
-//获取消息的长度
-func (m *Message) GetMsgLen() uint32 {
- return m.MsgLen
-}
-
-//获取消息的内容
-func (m *Message) GetMsgData() []byte {
- return m.MsgData
-}
-
-//设置消息的ID
-func (m *Message) SetMsgID(id uint32) {}
-
-//设置消息的长度
-func (m *Message) SetMsgLen(len uint32) {}
-
-//设置消息的内容
-func (m *Message) SetMsgData(data []byte) {}
diff --git a/tcpboxV0.6/tcpnet/request.go b/tcpboxV0.6/tcpnet/request.go
deleted file mode 100644
index 8556791..0000000
--- a/tcpboxV0.6/tcpnet/request.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- msg tcpiface.IMessage
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.msg.GetMsgData()
-}
-
-//获取消息的id
-func (r *Request) GetMsgID() uint32 {
- return r.msg.GetMsgID()
-}
diff --git a/tcpboxV0.6/tcpnet/router.go b/tcpboxV0.6/tcpnet/router.go
deleted file mode 100644
index a2c6c5c..0000000
--- a/tcpboxV0.6/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.6/tcpnet/server.go b/tcpboxV0.6/tcpnet/server.go
deleted file mode 100644
index 0419324..0000000
--- a/tcpboxV0.6/tcpnet/server.go
+++ /dev/null
@@ -1,105 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
- //当前的server添加一个router,server注册的链接对应的处理业务
- MsgHandler tcpiface.IMsgHandle
-}
-
-func (s *Server) Start() {
-
- //在启动之初打印一下zinx的配置信息
- fmt.Printf("[Zinx] Name:%s\n", utils.GlobalObject.Name)
- fmt.Printf("[Zinx] Host:%s,Port:%d\n", utils.GlobalObject.Host, utils.GlobalObject.Port)
- fmt.Printf("[Zinx] Version:%s,MaxConn:%d,MaxPackageSize:%d\n", utils.GlobalObject.Version,
- +utils.GlobalObject.MaxConn, utils.GlobalObject.MaxPackageSize)
-
- //用一个goroution来处理
-
- go func() {
- //开启消息队列及worker工作池
- s.MsgHandler.StartWorkerPool()
-
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
- defer conn.Close()
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(conn, cid, s.MsgHandler)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-}
-
-func (s *Server) AddRouter(msgID uint32, router tcpiface.IRouter) {
- s.MsgHandler.AddRouter(msgID, router)
- fmt.Println("Add Router successfully!!!")
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: utils.GlobalObject.Name,
- IPVersion: utils.GlobalObject.IPVersion,
- IP: utils.GlobalObject.Host,
- Port: utils.GlobalObject.Port,
- MsgHandler: NewMsgHandler(),
- }
- return s
-}
diff --git a/tcpboxV0.6/utils/globalobj.go b/tcpboxV0.6/utils/globalobj.go
deleted file mode 100644
index 1ecc6e8..0000000
--- a/tcpboxV0.6/utils/globalobj.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package utils
-
-import (
- "encoding/json"
- "io/ioutil"
- "zinx/ziface"
-)
-
-/*
- 存储一切有关zinx框架的全局参数,供其他模块使用
- 一些参数是可以由用户通过zinx.json配置
-*/
-
-type GlobalObj struct {
- /*
- server
-
- */
- //服务器名称
- TcpServer ziface.IServer
- //主机地址
- Host string
- //服务端口
- Port int
- //服务器名称
- Name string
- /*
-
- zinx
-
- */
- Version string
- IPVersion string
- MaxConn int
- MaxPackageSize uint32
- WorkerPoolSize uint32
- MaxWorkerTaskLen uint32
-}
-
-//定义一个全局的对外对象
-
-var GlobalObject *GlobalObj
-
-//提供一个init方法,初始化GlobalObject对象
-func init() {
- //如果配置文件没有加载,此为默认的配置
- GlobalObject = &GlobalObj{
- Name: "ZinxAPP",
- Host: "0.0.0.0",
- IPVersion: "tcp4",
- Port: 8999,
- MaxConn: 1000,
- MaxPackageSize: 4096,
- WorkerPoolSize: 10,
- MaxWorkerTaskLen: 1024,
- }
-
- //应该加载用户自定义的参数
- GlobalObject.Reload()
-}
-
-//从zinx.json去加载用户自定义的参数
-func (g *GlobalObj) Reload() {
- data, err := ioutil.ReadFile("./conf/zinx.json")
- if nil != err {
- panic("[Reload] Reload failed")
- }
- json.Unmarshal(data, &GlobalObject)
-}
diff --git a/tcpboxV0.7/Client.go b/tcpboxV0.7/Client.go
deleted file mode 100644
index 5c11e30..0000000
--- a/tcpboxV0.7/Client.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client0 start ......")
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- binaryMsg, err := dp.Pack(ms)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- fmt.Println(binaryHead)
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.7/Client1.go b/tcpboxV0.7/Client1.go
deleted file mode 100644
index 3eb68ac..0000000
--- a/tcpboxV0.7/Client1.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client1 start .......")
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- fmt.Println(ms)
- binaryMsg, err := dp.Pack(ms)
- fmt.Println(binaryMsg)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println(binaryHead)
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.7/Server.go b/tcpboxV0.7/Server.go
deleted file mode 100644
index dd40c22..0000000
--- a/tcpboxV0.7/Server.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package main
-
-import (
- "fmt"
- "zinx/ziface"
- "zinx/znet"
-)
-
-type PingRouter struct{}
-
-func (p *PingRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call PingRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-type HelloRouter struct{}
-
-func (p *HelloRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call HelloRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("Hello...Hello...Hello..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-func main() {
- //创建服务器对象
- s := znet.NewServer("[Zinx V0.6]")
- s.AddRouter(0, &PingRouter{})
- s.AddRouter(1, &HelloRouter{})
- s.Server()
-}
diff --git a/tcpboxV0.7/conf/zinx.json b/tcpboxV0.7/conf/zinx.json
deleted file mode 100644
index 4546f29..0000000
--- a/tcpboxV0.7/conf/zinx.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "Name": "ZinxApp",
- "Host": "0.0.0.0",
- "Version": 0.6,
- "IPVersion": "tcp4",
- "Port": 8990,
- "MaxConn": 1000,
- "MaxPackageSize": 4096,
- "WorkerPoolSize": 10,
- "MaxWorkTaskLen": 1024,
-}
\ No newline at end of file
diff --git a/tcpboxV0.7/go.mod b/tcpboxV0.7/go.mod
deleted file mode 100644
index 00af073..0000000
--- a/tcpboxV0.7/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module tcpbox
-
-go 1.18
diff --git a/tcpboxV0.7/tcpiface/IMessage.go b/tcpboxV0.7/tcpiface/IMessage.go
deleted file mode 100644
index a3bd69f..0000000
--- a/tcpboxV0.7/tcpiface/IMessage.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-/*
-
- 设置消息的格式
-*/
-
-type IMessage interface {
-
- //获取消息的ID
- GetMsgID() uint32
-
- //获取消息的长度
- GetMsgLen() uint32
-
- //获取消息的内容
- GetMsgData() []byte
-
- //设置消息的ID
- SetMsgID(uint32)
-
- //设置消息的长度
- SetMsgLen(uint32)
-
- //设置消息的内容
- SetMsgData([]byte)
-}
diff --git a/tcpboxV0.7/tcpiface/iMsgHandle.go b/tcpboxV0.7/tcpiface/iMsgHandle.go
deleted file mode 100644
index e341d8f..0000000
--- a/tcpboxV0.7/tcpiface/iMsgHandle.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
- ·根据消息调度路由处理和添加接口
-*/
-type IMsgHandle interface {
- //调度/执行对应的router处理方法
- DoMsgHandle(request IRequest)
-
- //为消息添加具体的处理逻辑
- AddRouter(msgID uint32, router IRouter)
-
- //启动worker工作池
- StartWorkerPool()
-
- //将消息发送给消息任务队列处理
- SendMsgToTaskQueue(request IRequest)
-}
diff --git a/tcpboxV0.7/tcpiface/iconnection.go b/tcpboxV0.7/tcpiface/iconnection.go
deleted file mode 100644
index 1632c5d..0000000
--- a/tcpboxV0.7/tcpiface/iconnection.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- SendMsg(msgID uint32, data []byte) error
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.7/tcpiface/imsgpack.go b/tcpboxV0.7/tcpiface/imsgpack.go
deleted file mode 100644
index 80264b5..0000000
--- a/tcpboxV0.7/tcpiface/imsgpack.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
-
- 封包、拆包模块
- 直接面向tcp中的数据流,解决粘包问题
-*/
-
-type IMsgPack interface {
-
- //获取消息的长度
- GetHeadLen() uint32
- //将消息封装
- Pack(message IMessage) ([]byte, error)
-
- //拆包,获取消息内容
- Unpack([]byte) (IMessage, error)
-}
diff --git a/tcpboxV0.7/tcpiface/irequest.go b/tcpboxV0.7/tcpiface/irequest.go
deleted file mode 100644
index d190b13..0000000
--- a/tcpboxV0.7/tcpiface/irequest.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-
- //获取请求消息的ID
- GetMsgID() uint32
-}
diff --git a/tcpboxV0.7/tcpiface/irouter.go b/tcpboxV0.7/tcpiface/irouter.go
deleted file mode 100644
index 1542a2c..0000000
--- a/tcpboxV0.7/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- //PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- //PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.7/tcpiface/iserver.go b/tcpboxV0.7/tcpiface/iserver.go
deleted file mode 100644
index 627ba19..0000000
--- a/tcpboxV0.7/tcpiface/iserver.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
- //路由功能:给当前的服务注册一个路由方法,共客户端的链接处理使用
- AddRouter(msgID uint32, router IRouter)
- //获取当前server的连接管理器
- GetConnMgr() IConnManager
-}
diff --git a/tcpboxV0.7/tcpnet/connection.go b/tcpboxV0.7/tcpnet/connection.go
deleted file mode 100644
index 5e38920..0000000
--- a/tcpboxV0.7/tcpnet/connection.go
+++ /dev/null
@@ -1,206 +0,0 @@
-package tcpnet
-
-import (
- "errors"
- "fmt"
- "io"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
- //当前conn隶属于哪个server
- TcpServer tcpiface.IServer
-
- //当球按连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-
- //开一个无缓冲的通道,用于读写之间的消息通信
- MsgChan chan []byte
-
- //消息的管理MsgID和对应的处理业务API关系
- MsgHandle tcpiface.IMsgHandle
-}
-
-//初始化链接模块的方法
-func NewConnection(server tcpiface.IServer, conn *net.TCPConn, connID uint32, msgHandler tcpiface.IMsgHandle) *Connection {
- c := &Connection{
- TcpServer: server,
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- MsgHandle: msgHandler,
- MsgChan: make(chan []byte),
- ExitChan: make(chan bool, 1),
- }
- c.TcpServer.GetConnMgr().Add(c)
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "[Reader is exit],RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取刻划断的数据到buf中,最大512字节
- for {
- //buf := make([]byte, utils.GlobalObject.MaxPackageSize)
- //_, err := c.Conn.Read(buf)
- //if nil != err {
- // fmt.Println("receive buf err", err)
- // continue
- //}
-
- //创建一个装包拆包对象
- dp := NewDataPack()
-
- //读取客户端的msg head 二进制流8个字节
- headData := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), headData); nil != err {
- fmt.Println("Read msg error:", err)
- break
- }
- //拆包, 得到msg的id和len 放入到msg中
- msg, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("unpack error:", err)
- break
- }
-
- //拆包,得到dataLen 再次读取Data,放在msg.Data中
- var data []byte
-
- if msg.GetMsgLen() > 0 {
- data = make([]byte, msg.GetMsgLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), data); nil != err {
- fmt.Println("read msg data error:", err)
- break
- }
-
- }
- req := Request{
- conn: c,
- msg: msg,
- }
-
- if utils.GlobalObject.WorkerPoolSize > 0 {
- //已经开启了工作池模式,将消息发送给worker工作池处理即可
- c.MsgHandle.SendMsgToTaskQueue(&req)
- } else {
- //从路由中找到之前注册绑定的Conn对应的router调用
- //根据绑定好的MsgID找到对应处理api业务执行
- go c.MsgHandle.DoMsgHandle(&req)
- }
-
- }
-}
-
-//写消息的goroutine,专门将消息发送给客户端的模块
-func (c *Connection) StartWriter() {
- fmt.Println("Writer Goroutine is running!!!")
- defer fmt.Println(c.RemoteAddr().String(), "[conn writer exit!]")
-
- //不断阻塞的等待channel的消息,进行写给客户端
- for {
- select {
- case data := <-c.MsgChan:
- //有数据要写给客户端
- if _, err := c.Conn.Write(data); nil != err {
- fmt.Println("Send data error:", err)
- return
- }
- case <-c.ExitChan:
- //代表Reader已经退出,此时Writer也要退出
- return
-
- }
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
- //启动写数据业务
- go c.StartWriter()
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- //关闭socket链接
- c.Conn.Close()
-
- //告知Writer关闭
- c.ExitChan <- true
-
- //将当前连接从connmgr中删除掉
- c.TcpServer.GetConnMgr().Remove(c)
- //关闭信道
- close(c.ExitChan)
- close(c.MsgChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) SendMsg(msgID uint32, data []byte) error {
- if c.isClosed == true {
- return errors.New("Connection closed when send msg")
- }
- dp := NewDataPack()
- //将data进行封包
- binaryMsg, err := dp.Pack(NewMsgPackage(msgID, data))
-
- if nil != err {
- fmt.Println("Pack error msg id :", msgID)
- return errors.New("pack error msg")
- }
-
- //将数据发送到客户端
- c.MsgChan <- binaryMsg
- return nil
-}
diff --git a/tcpboxV0.7/tcpnet/message.go b/tcpboxV0.7/tcpnet/message.go
deleted file mode 100644
index 79ebca2..0000000
--- a/tcpboxV0.7/tcpnet/message.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package tcpnet
-
-type Message struct {
- //消息的ID
- MsgID uint32
-
- //消息的长度
- MsgLen uint32
-
- //消息的内容
- MsgData []byte
-}
-
-//创建一个Message消息包
-func NewMsgPackage(msgID uint32, data []byte) *Message {
- return &Message{
- MsgID: msgID,
- MsgLen: uint32(len(data)),
- MsgData: data,
- }
-}
-
-//获取消息的ID
-func (m *Message) GetMsgID() uint32 {
- return m.MsgID
-}
-
-//获取消息的长度
-func (m *Message) GetMsgLen() uint32 {
- return m.MsgLen
-}
-
-//获取消息的内容
-func (m *Message) GetMsgData() []byte {
- return m.MsgData
-}
-
-//设置消息的ID
-func (m *Message) SetMsgID(id uint32) {}
-
-//设置消息的长度
-func (m *Message) SetMsgLen(len uint32) {}
-
-//设置消息的内容
-func (m *Message) SetMsgData(data []byte) {}
diff --git a/tcpboxV0.7/tcpnet/msgHandle.go b/tcpboxV0.7/tcpnet/msgHandle.go
deleted file mode 100644
index 008ceec..0000000
--- a/tcpboxV0.7/tcpnet/msgHandle.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "strconv"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type MsgHandler struct {
- //属性 根据消息ID调度路由
- Apis map[uint32]tcpiface.IRouter
-
- //负责Worker去任务的消息队列
- TaskQueue []chan tcpiface.IRequest
-
- //业务工作池Worker的数量
- WorkerPoolSize uint32
-}
-
-//初始化创建MsgHandler的处理逻辑
-func NewMsgHandler() *MsgHandler {
- return &MsgHandler{
- Apis: make(map[uint32]tcpiface.IRouter),
- WorkerPoolSize: utils.GlobalObject.WorkerPoolSize,
- TaskQueue: make([]chan tcpiface.IRequest, utils.GlobalObject.WorkerPoolSize),
- }
-}
-
-func (mh *MsgHandler) DoMsgHandle(request tcpiface.IRequest) {
-
- //从request中找到msgID
- handler, ok := mh.Apis[request.GetMsgID()]
- if !ok {
- fmt.Println("api msgID=", request.GetMsgID(), "is not found! need register")
- }
-
- //根据msgID调度对应的业务处理
- //handler.PreHandle(request)
- handler.Handle(request)
- //handler.PostHandle(request)
-}
-
-//为消息添加具体的处理逻辑
-func (mh *MsgHandler) AddRouter(msgID uint32, router tcpiface.IRouter) {
- //判断当前msg绑定的api处理方法事都已经存在
- if _, ok := mh.Apis[msgID]; ok {
- //id 已经注册了
- panic("repeat api,msgID=" + strconv.Itoa(int(msgID)))
- }
- //添加msg与api的绑定关系
- mh.Apis[msgID] = router
- fmt.Println("Add api MsgID=", msgID, "successed!")
-}
-
-//启动一个佛南工作池 (开启工作池的动作只能有一次)
-func (mh *MsgHandler) StartWorkerPool() {
- //根据workerpoolsize 分别开启Worker,每个Worker用一个go来承载
- for i := 0; i < int(mh.WorkerPoolSize); i++ {
- //一个worker被启动
- //1、当前的worker对应的channel消息队列 开辟空间 第0个worker就用第0个channel
- mh.TaskQueue[i] = make(chan tcpiface.IRequest, utils.GlobalObject.MaxWorkerTaskLen)
-
- //2、启动当前的worker,阻塞等待消息从channel传递过来
- go mh.StartOneWorker(i, mh.TaskQueue[i])
- }
-}
-
-//启动一个Worker工作流程
-func (mh *MsgHandler) StartOneWorker(workerID int, taskQueue chan tcpiface.IRequest) {
- fmt.Println("worker ID=", workerID, "is running......")
- //不断阻塞等待对应消息队列的消息
- select {
- //如果有消息过来,出列的就是一个客户端的request,执行当前的request所绑定的业务
- case request := <-taskQueue:
- mh.DoMsgHandle(request)
-
- }
-}
-
-//将消息均衡发送给对应的worker
-func (mh *MsgHandler) SendMsgToTaskQueue(request tcpiface.IRequest) {
- //将消息平均分配给不同的worker
- workerID := request.GetConnection().GetConnID() % mh.WorkerPoolSize
-
- fmt.Println("Add ConnID =", request.GetConnection().GetConnID(),
- "request MsgID =", request.GetMsgID(), "to WorkerID = ", workerID)
- //将消息发送给对应的worker的taskQueue即可
- mh.TaskQueue[workerID] <- request
-}
diff --git a/tcpboxV0.7/tcpnet/msgpack.go b/tcpboxV0.7/tcpnet/msgpack.go
deleted file mode 100644
index a709db8..0000000
--- a/tcpboxV0.7/tcpnet/msgpack.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package tcpnet
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "fmt"
- ziface "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type DataPack struct {
-}
-
-func NewDataPack() *DataPack {
- return &DataPack{}
-}
-
-//获取包的头部长度的方法
-func (dp *DataPack) GetHeadLen() uint32 {
- //datalen uint32 (4个字节) + dataID uint32(4个字节)
- return 8
-}
-
-//将消息打包
-func (dp *DataPack) Pack(msg ziface.IMessage) (data []byte, err error) {
- //创建一个存放bytes字节的缓冲
- dataBuf := bytes.NewBuffer([]byte{})
-
- //将dataLen写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgLen())
- if nil != err {
- return nil, err
- }
-
- //将dataID写入到dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgID())
- if nil != err {
- return nil, err
- }
-
- //将消息内容写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgData())
- if nil != err {
- return nil, err
- }
-
- return dataBuf.Bytes(), nil
-}
-
-//拆包方法 ,先将head中信息读出来,再根据head中的data长度再进行一次读
-func (dp *DataPack) Unpack(binaryData []byte) (ziface.IMessage, error) {
-
- //创建一个从输入二进制的ioReader
- dataBuf := bytes.NewBuffer(binaryData)
-
- //只解压head信息,获取dataLen和dataID信息
- msg := &Message{}
-
- //读取dataLen
- err := binary.Read(dataBuf, binary.LittleEndian, &msg.MsgLen)
- if nil != err {
- return nil, err
- }
-
- //读取dataID
- err = binary.Read(dataBuf, binary.LittleEndian, &msg.MsgID)
- if nil != err {
- return nil, err
- }
-
- //判断dataLen是否已经超出了我们允许的最大长度
- if utils.GlobalObject.MaxPackageSize > 0 && msg.MsgLen > utils.GlobalObject.MaxPackageSize {
- fmt.Println(utils.GlobalObject.MaxPackageSize, "||||", msg.MsgLen)
- return nil, errors.New("too large msg data recv!")
- }
- return msg, nil
-
-}
diff --git a/tcpboxV0.7/tcpnet/msgpack_test.go b/tcpboxV0.7/tcpnet/msgpack_test.go
deleted file mode 100644
index 942c22a..0000000
--- a/tcpboxV0.7/tcpnet/msgpack_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "io"
- "net"
- "testing"
-)
-
-func TestDataPack(t *testing.T) {
-
- /*
- 模拟服务器
- */
- //1、创建socketTCP
- listen, err := net.Listen("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Server listen failed!!! err:", err)
- return
- }
-
- //创建一个goroutine承载,负责从客户端处理业务
- go func() {
-
- //2、从客户端读取数据,拆包处理
- for {
- conn, err := listen.Accept()
- if nil != err {
- fmt.Println("Server accept failed!!! err:", err)
- return
- }
-
- go func(conn net.Conn) {
- //处理客户端请求
- //----------》拆包过程《---------------
- //定义一个拆包的对象dp
- dp := NewDataPack()
- for {
- //1、第一次从conn读,把包的head读出来
- headData := make([]byte, dp.GetHeadLen())
- _, err := io.ReadFull(conn, headData)
- if nil != err {
- fmt.Println("Read head failed!!! err:", err)
- break
- }
- fmt.Println(headData)
- msgHead, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("Server unpack1 failed!!! err:", err)
- return
- }
-
- if msgHead.GetMsgLen() > 0 {
- //msg是有数据的,需要进行第二次读取
- //2、第二次从conn中读取,再根据head中的len读取data的内容
- msg := msgHead.(*Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- //根据dataLen的长度再次从io流中读取
- _, err := io.ReadFull(conn, msg.MsgData)
- if nil != err {
- fmt.Println("Server unpack2 failed!!! err:", err)
- return
- }
-
- //完整的一个消息已经读取完毕
- fmt.Println("---->Receive MsgID:", msg.MsgID, "dataLen:", msg.MsgLen, "data:", string(msg.MsgData))
- }
- }
-
- }(conn)
- }
- }()
-
- /*
-
- 模拟客户端
-
- */
- conn, err := net.Dial("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Client dial failed!!! err:", err)
- return
-
- }
-
- //创建一个封包对象
- dp := NewDataPack()
-
- //模拟粘包过程
- //封装第一个包msg1
- msg1 := &Message{
- MsgID: 1,
- MsgLen: 5,
- MsgData: []byte{'a', 'b', 'c', 'd', 'e'},
- }
- sendData1, err := dp.Pack(msg1)
- if nil != err {
- fmt.Println("Client pack msg1 failed!!! err:", err)
- return
- }
-
- //封装第二个包msg1
- msg2 := &Message{
- MsgID: 2,
- MsgLen: 7,
- MsgData: []byte{'1', '2', '3', '4', '5', '6', '7'},
- }
- sendData2, err := dp.Pack(msg2)
- if nil != err {
- fmt.Println("Client pack msg2 failed!!! err:", err)
- return
- }
- //将两个包粘在一起
- sendData := append(sendData1, sendData2...)
-
- //一次性发送给服务端
- conn.Write(sendData)
-
- //阻塞客户端
- select {}
-}
diff --git a/tcpboxV0.7/tcpnet/request.go b/tcpboxV0.7/tcpnet/request.go
deleted file mode 100644
index 8556791..0000000
--- a/tcpboxV0.7/tcpnet/request.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- msg tcpiface.IMessage
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.msg.GetMsgData()
-}
-
-//获取消息的id
-func (r *Request) GetMsgID() uint32 {
- return r.msg.GetMsgID()
-}
diff --git a/tcpboxV0.7/tcpnet/router.go b/tcpboxV0.7/tcpnet/router.go
deleted file mode 100644
index a2c6c5c..0000000
--- a/tcpboxV0.7/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.7/tcpnet/server.go b/tcpboxV0.7/tcpnet/server.go
deleted file mode 100644
index 51334fa..0000000
--- a/tcpboxV0.7/tcpnet/server.go
+++ /dev/null
@@ -1,121 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
- //当前的server添加一个router,server注册的链接对应的处理业务
- MsgHandler tcpiface.IMsgHandle
- //当前server的connManager
- ConnManager tcpiface.IConnManager
-}
-
-func (s *Server) Start() {
-
- //在启动之初打印一下zinx的配置信息
- fmt.Printf("[Zinx] Name:%s\n", utils.GlobalObject.Name)
- fmt.Printf("[Zinx] Host:%s,Port:%d\n", utils.GlobalObject.Host, utils.GlobalObject.Port)
- fmt.Printf("[Zinx] Version:%s,MaxConn:%d,MaxPackageSize:%d\n", utils.GlobalObject.Version,
- +utils.GlobalObject.MaxConn, utils.GlobalObject.MaxPackageSize)
-
- //用一个goroution来处理
-
- go func() {
- //开启消息队列及worker工作池
- s.MsgHandler.StartWorkerPool()
-
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
-
- //设置最大连接个数的判断,如果超过最大连接,那么关闭此新的连接
- if s.ConnManager.Len() >= utils.GlobalObject.MaxConn {
- //TODO 给客户端响应一个最大连接错误包
- fmt.Println("Too many Connections MaxConn = ", utils.GlobalObject.MaxConn)
- conn.Close()
- continue
- }
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(s, conn, cid, s.MsgHandler)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-
- fmt.Println("[Server] server name:", s.Name)
- s.ConnManager.CleanConn()
-}
-
-func (s *Server) AddRouter(msgID uint32, router tcpiface.IRouter) {
- s.MsgHandler.AddRouter(msgID, router)
- fmt.Println("Add Router successfully!!!")
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: utils.GlobalObject.Name,
- IPVersion: utils.GlobalObject.IPVersion,
- IP: utils.GlobalObject.Host,
- Port: utils.GlobalObject.Port,
- MsgHandler: NewMsgHandler(),
- ConnManager: NewConnManager(),
- }
- return s
-}
-func (s *Server) GetConnMgr() tcpiface.IConnManager {
- return s.ConnManager
-}
diff --git a/tcpboxV0.7/utils/globalobj.go b/tcpboxV0.7/utils/globalobj.go
deleted file mode 100644
index ddec591..0000000
--- a/tcpboxV0.7/utils/globalobj.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package utils
-
-import (
- "encoding/json"
- "io/ioutil"
- "tcpbox/tcpiface"
-)
-
-/*
- 存储一切有关zinx框架的全局参数,供其他模块使用
- 一些参数是可以由用户通过zinx.json配置
-*/
-
-type GlobalObj struct {
- /*
- server
-
- */
- //服务器名称
- TcpServer tcpiface.IServer
- //主机地址
- Host string
- //服务端口
- Port int
- //服务器名称
- Name string
- /*
-
- zinx
-
- */
- Version string
- IPVersion string
- MaxConn int
- MaxPackageSize uint32
- WorkerPoolSize uint32
- MaxWorkerTaskLen uint32
-}
-
-//定义一个全局的对外对象
-
-var GlobalObject *GlobalObj
-
-//提供一个init方法,初始化GlobalObject对象
-func init() {
- //如果配置文件没有加载,此为默认的配置
- GlobalObject = &GlobalObj{
- Name: "ZinxAPP",
- Host: "0.0.0.0",
- IPVersion: "tcp4",
- Port: 8999,
- MaxConn: 1000,
- MaxPackageSize: 4096,
- WorkerPoolSize: 10,
- MaxWorkerTaskLen: 1024,
- }
-
- //应该加载用户自定义的参数
- GlobalObject.Reload()
-}
-
-//从zinx.json去加载用户自定义的参数
-func (g *GlobalObj) Reload() {
- data, err := ioutil.ReadFile("./conf/zinx.json")
- if nil != err {
- panic("[Reload] Reload failed")
- }
- json.Unmarshal(data, &GlobalObject)
-}
diff --git a/tcpboxV0.8/Client1.go b/tcpboxV0.8/Client1.go
deleted file mode 100644
index 3eb68ac..0000000
--- a/tcpboxV0.8/Client1.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client1 start .......")
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- fmt.Println(ms)
- binaryMsg, err := dp.Pack(ms)
- fmt.Println(binaryMsg)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println(binaryHead)
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.8/Server.go b/tcpboxV0.8/Server.go
deleted file mode 100644
index b13e99f..0000000
--- a/tcpboxV0.8/Server.go
+++ /dev/null
@@ -1,71 +0,0 @@
-package main
-
-import (
- "fmt"
- "zinx/ziface"
- "zinx/znet"
-)
-
-type PingRouter struct{}
-
-func (p *PingRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call PingRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-type HelloRouter struct{}
-
-func (p *HelloRouter) Handle(request ziface.IRequest) {
- fmt.Println("Call HelloRouter Handle...")
- fmt.Println("rece from client:msgID:", request.GetMsgID(), ",data:", request.GetData())
- _, err := request.GetConnection().GetTCPConnection().Write([]byte("Hello...Hello...Hello..."))
- if nil != err {
- fmt.Println("Call back ping...ping...ping... err:", err)
- }
-}
-
-//创建连接之后的执行的钩子函数
-func DoConnectionBegin(conn ziface.IConnection) {
- fmt.Println("=====> DoConnectionBegin is Called......")
- if err := conn.SendMsg(202, []byte("DoConnection Begin")); err != nil {
- fmt.Println(err)
- }
- conn.SetProperty("lover", "潘丽萍")
- conn.SetProperty("name", "李光辉")
-}
-
-//链接断开之前需要执行的函数
-func DoConnectionLost(conn ziface.IConnection) {
- fmt.Println("====> DoConnectionLost is Called......")
- fmt.Println("conn ID = ", conn.GetConnID(), " is lost......")
- property1, err := conn.GetProperty("name")
- if nil != err {
- fmt.Println("this property not found")
- }
- fmt.Println(property1)
- property2, err := conn.GetProperty("lover")
- if nil != err {
- fmt.Println("this property not found")
- }
- fmt.Println(property2)
-}
-
-func main() {
- //创建服务器对象
- s := znet.NewServer("[Zinx V0.6]")
-
- //注册链接的钩子函数
- s.SetOnConnStart(DoConnectionBegin)
- s.SetOnConnStop(DoConnectionLost)
-
- //给当前的框架添加自定义的router
- s.AddRouter(0, &PingRouter{})
- s.AddRouter(1, &HelloRouter{})
-
- //启动server
- s.Server()
-}
diff --git a/tcpboxV0.8/conf/zinx.json b/tcpboxV0.8/conf/zinx.json
deleted file mode 100644
index 4546f29..0000000
--- a/tcpboxV0.8/conf/zinx.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "Name": "ZinxApp",
- "Host": "0.0.0.0",
- "Version": 0.6,
- "IPVersion": "tcp4",
- "Port": 8990,
- "MaxConn": 1000,
- "MaxPackageSize": 4096,
- "WorkerPoolSize": 10,
- "MaxWorkTaskLen": 1024,
-}
\ No newline at end of file
diff --git a/tcpboxV0.8/go.mod b/tcpboxV0.8/go.mod
deleted file mode 100644
index 00af073..0000000
--- a/tcpboxV0.8/go.mod
+++ /dev/null
@@ -1,3 +0,0 @@
-module tcpbox
-
-go 1.18
diff --git a/tcpboxV0.8/tcpiface/IMessage.go b/tcpboxV0.8/tcpiface/IMessage.go
deleted file mode 100644
index a3bd69f..0000000
--- a/tcpboxV0.8/tcpiface/IMessage.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-/*
-
- 设置消息的格式
-*/
-
-type IMessage interface {
-
- //获取消息的ID
- GetMsgID() uint32
-
- //获取消息的长度
- GetMsgLen() uint32
-
- //获取消息的内容
- GetMsgData() []byte
-
- //设置消息的ID
- SetMsgID(uint32)
-
- //设置消息的长度
- SetMsgLen(uint32)
-
- //设置消息的内容
- SetMsgData([]byte)
-}
diff --git a/tcpboxV0.8/tcpiface/iMsgHandle.go b/tcpboxV0.8/tcpiface/iMsgHandle.go
deleted file mode 100644
index e341d8f..0000000
--- a/tcpboxV0.8/tcpiface/iMsgHandle.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
- ·根据消息调度路由处理和添加接口
-*/
-type IMsgHandle interface {
- //调度/执行对应的router处理方法
- DoMsgHandle(request IRequest)
-
- //为消息添加具体的处理逻辑
- AddRouter(msgID uint32, router IRouter)
-
- //启动worker工作池
- StartWorkerPool()
-
- //将消息发送给消息任务队列处理
- SendMsgToTaskQueue(request IRequest)
-}
diff --git a/tcpboxV0.8/tcpiface/iconnmanager.go b/tcpboxV0.8/tcpiface/iconnmanager.go
deleted file mode 100644
index ddb8134..0000000
--- a/tcpboxV0.8/tcpiface/iconnmanager.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package tcpiface
-
-//连接管理模块抽象层
-
-type IConnManager interface {
- //添加链接
-
- Add(conn IConnection)
-
- //删除链接
- Remove(conn IConnection)
-
- //根据Conn ID获取链接
- Get(connID uint32) (IConnection, error)
-
- //得到当前链接总数
- Len() int
-
- //清除并终止所有的链接
- CleanConn()
-}
diff --git a/tcpboxV0.8/tcpiface/imsgpack.go b/tcpboxV0.8/tcpiface/imsgpack.go
deleted file mode 100644
index 80264b5..0000000
--- a/tcpboxV0.8/tcpiface/imsgpack.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
-
- 封包、拆包模块
- 直接面向tcp中的数据流,解决粘包问题
-*/
-
-type IMsgPack interface {
-
- //获取消息的长度
- GetHeadLen() uint32
- //将消息封装
- Pack(message IMessage) ([]byte, error)
-
- //拆包,获取消息内容
- Unpack([]byte) (IMessage, error)
-}
diff --git a/tcpboxV0.8/tcpiface/irequest.go b/tcpboxV0.8/tcpiface/irequest.go
deleted file mode 100644
index d190b13..0000000
--- a/tcpboxV0.8/tcpiface/irequest.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-
- //获取请求消息的ID
- GetMsgID() uint32
-}
diff --git a/tcpboxV0.8/tcpiface/irouter.go b/tcpboxV0.8/tcpiface/irouter.go
deleted file mode 100644
index 1542a2c..0000000
--- a/tcpboxV0.8/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- //PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- //PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.8/tcpnet/connection.go b/tcpboxV0.8/tcpnet/connection.go
deleted file mode 100644
index 15f51e4..0000000
--- a/tcpboxV0.8/tcpnet/connection.go
+++ /dev/null
@@ -1,248 +0,0 @@
-package tcpnet
-
-import (
- "errors"
- "fmt"
- "io"
- "net"
- "sync"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-/*
-链接接口的实现
-*/
-
-type Connection struct {
- //当前conn隶属于哪个server
- TcpServer tcpiface.IServer
-
- //当前连接的socket
- Conn *net.TCPConn
-
- //连接的ID
- ConnID uint32
-
- //当前链接的状态
- isClosed bool
-
- //告知当前链接已经退出/停止的channel
- ExitChan chan bool
-
- //开一个无缓冲的通道,用于读写之间的消息通信
- MsgChan chan []byte
-
- //消息的管理MsgID和对应的处理业务API关系
- MsgHandle tcpiface.IMsgHandle
-
- //链接属性集合
- property map[string]interface{}
-
- //保护链接属性的锁
- propertyLock sync.RWMutex
-}
-
-//初始化链接模块的方法
-func NewConnection(server tcpiface.IServer, conn *net.TCPConn, connID uint32, msgHandler tcpiface.IMsgHandle) *Connection {
- c := &Connection{
- TcpServer: server,
- Conn: conn,
- ConnID: connID,
- isClosed: false,
- MsgHandle: msgHandler,
- MsgChan: make(chan []byte),
- ExitChan: make(chan bool, 1),
- property: make(map[string]interface{}),
- }
- c.TcpServer.GetConnMgr().Add(c)
- return c
-}
-
-//链接的读数据方法
-func (c *Connection) StartReader() {
-
- fmt.Println("Reader goroutine is running...")
- defer fmt.Println("ConnID:", c.ConnID, "[Reader is exit],RemoteAddr is ", c.RemoteAddr().String())
- defer c.Stop()
-
- //读取刻划断的数据到buf中,最大512字节
- for {
- //buf := make([]byte, utils.GlobalObject.MaxPackageSize)
- //_, err := c.Conn.Read(buf)
- //if nil != err {
- // fmt.Println("receive buf err", err)
- // continue
- //}
-
- //创建一个装包拆包对象
- dp := NewDataPack()
-
- //读取客户端的msg head 二进制流8个字节
- headData := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), headData); nil != err {
- fmt.Println("Read msg error:", err)
- break
- }
- //拆包, 得到msg的id和len 放入到msg中
- msg, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("unpack error:", err)
- break
- }
-
- //拆包,得到dataLen 再次读取Data,放在msg.Data中
- var data []byte
- if msg.GetMsgLen() > 0 {
- data = make([]byte, msg.GetMsgLen())
- if _, err := io.ReadFull(c.GetTCPConnection(), data); nil != err {
- fmt.Println("read msg data error:", err)
- break
- }
-
- }
- req := Request{
- conn: c,
- msg: msg,
- }
-
- if utils.GlobalObject.WorkerPoolSize > 0 {
- //已经开启了工作池模式,将消息发送给worker工作池处理即可
- c.MsgHandle.SendMsgToTaskQueue(&req)
- } else {
- //从路由中找到之前注册绑定的Conn对应的router调用
- //根据绑定好的MsgID找到对应处理api业务执行
- go c.MsgHandle.DoMsgHandle(&req)
- }
-
- }
-}
-
-//写消息的goroutine,专门将消息发送给客户端的模块
-func (c *Connection) StartWriter() {
- fmt.Println("Writer Goroutine is running!!!")
- defer fmt.Println(c.RemoteAddr().String(), "[conn writer exit!]")
-
- //不断阻塞的等待channel的消息,进行写给客户端
- for {
- select {
- case data := <-c.MsgChan:
- //有数据要写给客户端
- if _, err := c.Conn.Write(data); nil != err {
- fmt.Println("Send data error:", err)
- return
- }
- case <-c.ExitChan:
- //代表Reader已经退出,此时Writer也要退出
- return
-
- }
- }
-}
-
-//启动链接,让当前的链接准备工作
-func (c *Connection) Start() {
-
- fmt.Println(" Conn Start()... ConnID:", c.ConnID)
- //启动当前连接的读数据业务
- go c.StartReader()
-
- //TODO 启动当前链接写数据业务
-
- //启动写数据业务
- go c.StartWriter()
-
- //在启动链接之后,调用相应的hook函数处理相应的业务
- c.TcpServer.CallOnConnStart(c)
-
-}
-
-//停止链接,结束当前链接的工作
-func (c *Connection) Stop() {
-
- fmt.Println(" Conn Stop()... ConnID:", c.ConnID)
-
- //如果当前链接已经关闭
- if c.isClosed == true {
- return
- }
-
- //在关闭连接之前,调用相应的hook函数,处理相应的业务
- c.TcpServer.CallOnConnStop(c)
-
- //关闭socket链接
- c.Conn.Close()
-
- //告知Writer关闭
- c.ExitChan <- true
-
- //将当前连接从connmgr中删除掉
- c.TcpServer.GetConnMgr().Remove(c)
- //关闭信道
- close(c.ExitChan)
- close(c.MsgChan)
-
-}
-
-//获取当前链接绑定的socket conn
-func (c *Connection) GetTCPConnection() *net.TCPConn {
- return c.Conn
-}
-
-//获取当前连接模块的连接ID
-func (c *Connection) GetConnID() uint32 {
- return c.ConnID
-}
-
-//获取远程客户端的TCP状态 IP PORT
-func (c *Connection) RemoteAddr() net.Addr {
- return c.Conn.RemoteAddr()
-}
-
-//发送数据,将数据发送给远程的客户端
-func (c *Connection) SendMsg(msgID uint32, data []byte) error {
- if c.isClosed == true {
- return errors.New("Connection closed when send msg")
- }
- dp := NewDataPack()
- //将data进行封包
- binaryMsg, err := dp.Pack(NewMsgPackage(msgID, data))
-
- if nil != err {
- fmt.Println("Pack error msg id :", msgID)
- return errors.New("pack error msg")
- }
-
- //将数据发送到客户端
- c.MsgChan <- binaryMsg
- return nil
-}
-
-//设置连接属性
-func (c *Connection) SetProperty(key string, value interface{}) {
- c.propertyLock.Lock()
- defer c.propertyLock.Unlock()
-
- //添加一个属性
- c.property[key] = value
-}
-
-//获取连接属性
-func (c *Connection) GetProperty(key string) (interface{}, error) {
- c.propertyLock.RLock()
- defer c.propertyLock.RUnlock()
-
- if value, ok := c.property[key]; ok {
- return value, nil
- } else {
- return nil, errors.New("no property found")
- }
-}
-
-//删除连接属性
-func (c *Connection) RemoveProperty(key string) {
- c.propertyLock.RLock()
- defer c.propertyLock.RUnlock()
-
- delete(c.property, key)
-}
diff --git a/tcpboxV0.8/tcpnet/connmanager.go b/tcpboxV0.8/tcpnet/connmanager.go
deleted file mode 100644
index 98bfceb..0000000
--- a/tcpboxV0.8/tcpnet/connmanager.go
+++ /dev/null
@@ -1,84 +0,0 @@
-package tcpnet
-
-import (
- "errors"
- "fmt"
- "sync"
- "tcpbox/tcpiface"
-)
-
-/*
-
- 连接管理模块
-*/
-
-type ConnManager struct {
- connections map[uint32]tcpiface.IConnection //管理链接的集合
- connLock sync.RWMutex //保护连接集合的读写锁
-}
-
-//创建当前链接管理的方法
-func NewConnManager() *ConnManager {
- return &ConnManager{
- connections: make(map[uint32]tcpiface.IConnection),
- }
-}
-
-//添加链接
-func (c *ConnManager) Add(conn tcpiface.IConnection) {
- //保护共享资源map,加写锁
- c.connLock.Lock()
- defer c.connLock.Unlock()
-
- //将conn加入到ConnManager中
- c.connections[conn.GetConnID()] = conn
- fmt.Println("connection add to Connmanager successfully:conn num =", c.Len())
-
-}
-
-//删除链接
-func (c *ConnManager) Remove(conn tcpiface.IConnection) {
- //保护共享资源map,加写锁
- c.connLock.Lock()
- defer c.connLock.Unlock()
-
- //删除连接信息
- delete(c.connections, conn.GetConnID())
- fmt.Println("connID =", conn.GetConnID(), "remove from ConnManger Successfully: conn num is ", conn.GetConnID())
-}
-
-//根据Conn ID获取链接
-func (c *ConnManager) Get(connID uint32) (tcpiface.IConnection, error) {
- //保护共享资源map,加读锁
- c.connLock.RLock()
- defer c.connLock.RUnlock()
-
- if conn, ok := c.connections[connID]; ok {
- //找到了
- return conn, nil
- } else {
- return nil, errors.New("connection not found")
- }
-}
-
-//得到当前链接总数
-func (c *ConnManager) Len() int {
- return len(c.connections)
-}
-
-//清除并终止所有的链接
-func (c *ConnManager) CleanConn() {
- //保护共享资源map,加读锁
- c.connLock.RLock()
- defer c.connLock.RUnlock()
-
- //删除conn并停止conn的工作
- for connID, conn := range c.connections {
- //停止
- conn.Stop()
- //删除
- delete(c.connections, connID)
-
- }
- fmt.Println("Clean all connections successfully! conn num=", c.Len())
-}
diff --git a/tcpboxV0.8/tcpnet/message.go b/tcpboxV0.8/tcpnet/message.go
deleted file mode 100644
index 79ebca2..0000000
--- a/tcpboxV0.8/tcpnet/message.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package tcpnet
-
-type Message struct {
- //消息的ID
- MsgID uint32
-
- //消息的长度
- MsgLen uint32
-
- //消息的内容
- MsgData []byte
-}
-
-//创建一个Message消息包
-func NewMsgPackage(msgID uint32, data []byte) *Message {
- return &Message{
- MsgID: msgID,
- MsgLen: uint32(len(data)),
- MsgData: data,
- }
-}
-
-//获取消息的ID
-func (m *Message) GetMsgID() uint32 {
- return m.MsgID
-}
-
-//获取消息的长度
-func (m *Message) GetMsgLen() uint32 {
- return m.MsgLen
-}
-
-//获取消息的内容
-func (m *Message) GetMsgData() []byte {
- return m.MsgData
-}
-
-//设置消息的ID
-func (m *Message) SetMsgID(id uint32) {}
-
-//设置消息的长度
-func (m *Message) SetMsgLen(len uint32) {}
-
-//设置消息的内容
-func (m *Message) SetMsgData(data []byte) {}
diff --git a/tcpboxV0.8/tcpnet/msgHandle.go b/tcpboxV0.8/tcpnet/msgHandle.go
deleted file mode 100644
index 008ceec..0000000
--- a/tcpboxV0.8/tcpnet/msgHandle.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "strconv"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type MsgHandler struct {
- //属性 根据消息ID调度路由
- Apis map[uint32]tcpiface.IRouter
-
- //负责Worker去任务的消息队列
- TaskQueue []chan tcpiface.IRequest
-
- //业务工作池Worker的数量
- WorkerPoolSize uint32
-}
-
-//初始化创建MsgHandler的处理逻辑
-func NewMsgHandler() *MsgHandler {
- return &MsgHandler{
- Apis: make(map[uint32]tcpiface.IRouter),
- WorkerPoolSize: utils.GlobalObject.WorkerPoolSize,
- TaskQueue: make([]chan tcpiface.IRequest, utils.GlobalObject.WorkerPoolSize),
- }
-}
-
-func (mh *MsgHandler) DoMsgHandle(request tcpiface.IRequest) {
-
- //从request中找到msgID
- handler, ok := mh.Apis[request.GetMsgID()]
- if !ok {
- fmt.Println("api msgID=", request.GetMsgID(), "is not found! need register")
- }
-
- //根据msgID调度对应的业务处理
- //handler.PreHandle(request)
- handler.Handle(request)
- //handler.PostHandle(request)
-}
-
-//为消息添加具体的处理逻辑
-func (mh *MsgHandler) AddRouter(msgID uint32, router tcpiface.IRouter) {
- //判断当前msg绑定的api处理方法事都已经存在
- if _, ok := mh.Apis[msgID]; ok {
- //id 已经注册了
- panic("repeat api,msgID=" + strconv.Itoa(int(msgID)))
- }
- //添加msg与api的绑定关系
- mh.Apis[msgID] = router
- fmt.Println("Add api MsgID=", msgID, "successed!")
-}
-
-//启动一个佛南工作池 (开启工作池的动作只能有一次)
-func (mh *MsgHandler) StartWorkerPool() {
- //根据workerpoolsize 分别开启Worker,每个Worker用一个go来承载
- for i := 0; i < int(mh.WorkerPoolSize); i++ {
- //一个worker被启动
- //1、当前的worker对应的channel消息队列 开辟空间 第0个worker就用第0个channel
- mh.TaskQueue[i] = make(chan tcpiface.IRequest, utils.GlobalObject.MaxWorkerTaskLen)
-
- //2、启动当前的worker,阻塞等待消息从channel传递过来
- go mh.StartOneWorker(i, mh.TaskQueue[i])
- }
-}
-
-//启动一个Worker工作流程
-func (mh *MsgHandler) StartOneWorker(workerID int, taskQueue chan tcpiface.IRequest) {
- fmt.Println("worker ID=", workerID, "is running......")
- //不断阻塞等待对应消息队列的消息
- select {
- //如果有消息过来,出列的就是一个客户端的request,执行当前的request所绑定的业务
- case request := <-taskQueue:
- mh.DoMsgHandle(request)
-
- }
-}
-
-//将消息均衡发送给对应的worker
-func (mh *MsgHandler) SendMsgToTaskQueue(request tcpiface.IRequest) {
- //将消息平均分配给不同的worker
- workerID := request.GetConnection().GetConnID() % mh.WorkerPoolSize
-
- fmt.Println("Add ConnID =", request.GetConnection().GetConnID(),
- "request MsgID =", request.GetMsgID(), "to WorkerID = ", workerID)
- //将消息发送给对应的worker的taskQueue即可
- mh.TaskQueue[workerID] <- request
-}
diff --git a/tcpboxV0.8/tcpnet/msgpack.go b/tcpboxV0.8/tcpnet/msgpack.go
deleted file mode 100644
index 7953085..0000000
--- a/tcpboxV0.8/tcpnet/msgpack.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package tcpnet
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "fmt"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type DataPack struct {
-}
-
-func NewDataPack() *DataPack {
- return &DataPack{}
-}
-
-//获取包的头部长度的方法
-func (dp *DataPack) GetHeadLen() uint32 {
- //datalen uint32 (4个字节) + dataID uint32(4个字节)
- return 8
-}
-
-//将消息打包
-func (dp *DataPack) Pack(msg tcpiface.IMessage) (data []byte, err error) {
- //创建一个存放bytes字节的缓冲
- dataBuf := bytes.NewBuffer([]byte{})
-
- //将dataLen写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgLen())
- if nil != err {
- return nil, err
- }
-
- //将dataID写入到dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgID())
- if nil != err {
- return nil, err
- }
-
- //将消息内容写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgData())
- if nil != err {
- return nil, err
- }
-
- return dataBuf.Bytes(), nil
-}
-
-//拆包方法 ,先将head中信息读出来,再根据head中的data长度再进行一次读
-func (dp *DataPack) Unpack(binaryData []byte) (tcpiface.IMessage, error) {
-
- //创建一个从输入二进制的ioReader
- dataBuf := bytes.NewBuffer(binaryData)
-
- //只解压head信息,获取dataLen和dataID信息
- msg := &Message{}
-
- //读取dataLen
- err := binary.Read(dataBuf, binary.LittleEndian, &msg.MsgLen)
- if nil != err {
- return nil, err
- }
-
- //读取dataID
- err = binary.Read(dataBuf, binary.LittleEndian, &msg.MsgID)
- if nil != err {
- return nil, err
- }
-
- //判断dataLen是否已经超出了我们允许的最大长度
- if utils.GlobalObject.MaxPackageSize > 0 && msg.MsgLen > utils.GlobalObject.MaxPackageSize {
- fmt.Println(utils.GlobalObject.MaxPackageSize, "||||", msg.MsgLen)
- return nil, errors.New("too large msg data recv!")
- }
- return msg, nil
-
-}
diff --git a/tcpboxV0.8/tcpnet/msgpack_test.go b/tcpboxV0.8/tcpnet/msgpack_test.go
deleted file mode 100644
index 942c22a..0000000
--- a/tcpboxV0.8/tcpnet/msgpack_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "io"
- "net"
- "testing"
-)
-
-func TestDataPack(t *testing.T) {
-
- /*
- 模拟服务器
- */
- //1、创建socketTCP
- listen, err := net.Listen("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Server listen failed!!! err:", err)
- return
- }
-
- //创建一个goroutine承载,负责从客户端处理业务
- go func() {
-
- //2、从客户端读取数据,拆包处理
- for {
- conn, err := listen.Accept()
- if nil != err {
- fmt.Println("Server accept failed!!! err:", err)
- return
- }
-
- go func(conn net.Conn) {
- //处理客户端请求
- //----------》拆包过程《---------------
- //定义一个拆包的对象dp
- dp := NewDataPack()
- for {
- //1、第一次从conn读,把包的head读出来
- headData := make([]byte, dp.GetHeadLen())
- _, err := io.ReadFull(conn, headData)
- if nil != err {
- fmt.Println("Read head failed!!! err:", err)
- break
- }
- fmt.Println(headData)
- msgHead, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("Server unpack1 failed!!! err:", err)
- return
- }
-
- if msgHead.GetMsgLen() > 0 {
- //msg是有数据的,需要进行第二次读取
- //2、第二次从conn中读取,再根据head中的len读取data的内容
- msg := msgHead.(*Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- //根据dataLen的长度再次从io流中读取
- _, err := io.ReadFull(conn, msg.MsgData)
- if nil != err {
- fmt.Println("Server unpack2 failed!!! err:", err)
- return
- }
-
- //完整的一个消息已经读取完毕
- fmt.Println("---->Receive MsgID:", msg.MsgID, "dataLen:", msg.MsgLen, "data:", string(msg.MsgData))
- }
- }
-
- }(conn)
- }
- }()
-
- /*
-
- 模拟客户端
-
- */
- conn, err := net.Dial("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Client dial failed!!! err:", err)
- return
-
- }
-
- //创建一个封包对象
- dp := NewDataPack()
-
- //模拟粘包过程
- //封装第一个包msg1
- msg1 := &Message{
- MsgID: 1,
- MsgLen: 5,
- MsgData: []byte{'a', 'b', 'c', 'd', 'e'},
- }
- sendData1, err := dp.Pack(msg1)
- if nil != err {
- fmt.Println("Client pack msg1 failed!!! err:", err)
- return
- }
-
- //封装第二个包msg1
- msg2 := &Message{
- MsgID: 2,
- MsgLen: 7,
- MsgData: []byte{'1', '2', '3', '4', '5', '6', '7'},
- }
- sendData2, err := dp.Pack(msg2)
- if nil != err {
- fmt.Println("Client pack msg2 failed!!! err:", err)
- return
- }
- //将两个包粘在一起
- sendData := append(sendData1, sendData2...)
-
- //一次性发送给服务端
- conn.Write(sendData)
-
- //阻塞客户端
- select {}
-}
diff --git a/tcpboxV0.8/tcpnet/request.go b/tcpboxV0.8/tcpnet/request.go
deleted file mode 100644
index 8556791..0000000
--- a/tcpboxV0.8/tcpnet/request.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- msg tcpiface.IMessage
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.msg.GetMsgData()
-}
-
-//获取消息的id
-func (r *Request) GetMsgID() uint32 {
- return r.msg.GetMsgID()
-}
diff --git a/tcpboxV0.8/tcpnet/router.go b/tcpboxV0.8/tcpnet/router.go
deleted file mode 100644
index a2c6c5c..0000000
--- a/tcpboxV0.8/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.8/utils/globalobj.go b/tcpboxV0.8/utils/globalobj.go
deleted file mode 100644
index c28b526..0000000
--- a/tcpboxV0.8/utils/globalobj.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package utils
-
-import (
- "encoding/json"
- "io/ioutil"
- "tcpbox/tcpiface"
-)
-
-/*
- 存储一切有关zinx框架的全局参数,供其他模块使用
- 一些参数是可以由用户通过zinx.json配置
-*/
-
-type GlobalObj struct {
- /*
- server
-
- */
- //服务器名称
- TcpServer tcpiface.IServer
- //主机地址
- Host string
- //服务端口
- Port int
- //服务器名称
- Name string
- /*
-
- zinx
-
- */
- Version float32
- IPVersion string
- MaxConn int
- MaxPackageSize uint32
- WorkerPoolSize uint32
- MaxWorkerTaskLen uint32
-}
-
-//定义一个全局的对外对象
-
-var GlobalObject *GlobalObj
-
-//提供一个init方法,初始化GlobalObject对象
-func init() {
- //如果配置文件没有加载,此为默认的配置
- GlobalObject = &GlobalObj{
- Name: "ZinxAPP",
- Host: "0.0.0.0",
- Version: 0.8,
- IPVersion: "tcp4",
- Port: 8999,
- MaxConn: 1000,
- MaxPackageSize: 4096,
- WorkerPoolSize: 10,
- MaxWorkerTaskLen: 1024,
- }
-
- //应该加载用户自定义的参数
- GlobalObject.Reload()
-}
-
-//从zinx.json去加载用户自定义的参数
-func (g *GlobalObj) Reload() {
- data, err := ioutil.ReadFile("./conf/zinx.json")
- if nil != err {
- panic("[Reload] Reload failed")
- }
- json.Unmarshal(data, &GlobalObject)
-}
diff --git a/tcpboxV0.9/Client.go b/tcpboxV0.9/Client.go
deleted file mode 100644
index 5c11e30..0000000
--- a/tcpboxV0.9/Client.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client0 start ......")
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- binaryMsg, err := dp.Pack(ms)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- fmt.Println(binaryHead)
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.9/Client1.go b/tcpboxV0.9/Client1.go
deleted file mode 100644
index 3eb68ac..0000000
--- a/tcpboxV0.9/Client1.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "net"
- "time"
- "zinx/znet"
-)
-
-func main() {
- fmt.Println("Client1 start .......")
- conn, err := net.Dial("tcp", "127.0.0.1:8999")
- if nil != err {
- fmt.Printf("dail err:", err)
- return
- }
- defer conn.Close()
- for {
- //发送封包的msg消息
- dp := znet.NewDataPack()
- ms := znet.NewMsgPackage(0, []byte("zinx0.5 client test message!"))
- fmt.Println(ms)
- binaryMsg, err := dp.Pack(ms)
- fmt.Println(binaryMsg)
- if nil != err {
- fmt.Println("Pack error:", err)
- return
- }
-
- if _, err := conn.Write(binaryMsg); nil != err {
- fmt.Println("write error", err)
- return
- }
-
- //服务器应该给我们回复一个message数据,示例:MsgID:1, ping ping ping
- //先读取流中的head部分 得到ID和dataLen
-
- //再根据DataLen进行第二次读取,将data读取出来
- binaryHead := make([]byte, dp.GetHeadLen())
- if _, err := io.ReadFull(conn, binaryHead); nil != err {
- fmt.Println(binaryHead)
- fmt.Println("read head error:", err)
- break
- }
-
- //将二进制的head拆包到msg结构体中
- msgHead, err := dp.Unpack(binaryHead)
- if nil != err {
- fmt.Println("client unpack msgHead error:", err)
- break
- }
- if msgHead.GetMsgLen() > 0 {
- //再根据datalen进行二次读取,将data读出来
- msg := msgHead.(*znet.Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- if _, err := io.ReadFull(conn, msg.MsgData); nil != err {
- fmt.Println("read msg data error:", err)
- return
- }
- fmt.Println("=-->Rece Server Msg:msgid=", msg.MsgID, ",len=", msg.MsgLen, ",msgdata=", string(msg.MsgData))
- }
-
- time.Sleep(5 * time.Second)
- }
-
-}
diff --git a/tcpboxV0.9/go.mod b/tcpboxV0.9/go.mod
deleted file mode 100644
index dcc89c1..0000000
--- a/tcpboxV0.9/go.mod
+++ /dev/null
@@ -1,40 +0,0 @@
-module tcpbox
-
-go 1.18
-
-require (
- github.com/gin-gonic/gin v1.9.0
- github.com/natefinch/lumberjack v2.0.0+incompatible
- go.uber.org/zap v1.24.0
-)
-
-require (
- github.com/BurntSushi/toml v1.2.1 // indirect
- github.com/bytedance/sonic v1.8.0 // indirect
- github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
- github.com/gin-contrib/sse v0.1.0 // indirect
- github.com/go-playground/locales v0.14.1 // indirect
- github.com/go-playground/universal-translator v0.18.1 // indirect
- github.com/go-playground/validator/v10 v10.11.2 // indirect
- github.com/goccy/go-json v0.10.0 // indirect
- github.com/json-iterator/go v1.1.12 // indirect
- github.com/klauspost/cpuid/v2 v2.0.9 // indirect
- github.com/leodido/go-urn v1.2.1 // indirect
- github.com/mattn/go-isatty v0.0.17 // indirect
- github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
- github.com/modern-go/reflect2 v1.0.2 // indirect
- github.com/pelletier/go-toml/v2 v2.0.6 // indirect
- github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
- github.com/ugorji/go/codec v1.2.9 // indirect
- go.uber.org/atomic v1.7.0 // indirect
- go.uber.org/multierr v1.6.0 // indirect
- golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
- golang.org/x/crypto v0.5.0 // indirect
- golang.org/x/net v0.7.0 // indirect
- golang.org/x/sys v0.5.0 // indirect
- golang.org/x/text v0.7.0 // indirect
- google.golang.org/protobuf v1.28.1 // indirect
- gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
- gopkg.in/yaml.v2 v2.4.0 // indirect
- gopkg.in/yaml.v3 v3.0.1 // indirect
-)
diff --git a/tcpboxV0.9/go.sum b/tcpboxV0.9/go.sum
deleted file mode 100644
index 771e7ea..0000000
--- a/tcpboxV0.9/go.sum
+++ /dev/null
@@ -1,98 +0,0 @@
-github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
-github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
-github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
-github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
-github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA=
-github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
-github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
-github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
-github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
-github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
-github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8=
-github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k=
-github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
-github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
-github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
-github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
-github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
-github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
-github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
-github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
-github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
-github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
-github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
-github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
-github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
-github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
-github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
-github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
-github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
-github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU=
-github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
-go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
-go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
-go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
-go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
-golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
-golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
-golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
-google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
-gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/tcpboxV0.9/tcpiface/IMessage.go b/tcpboxV0.9/tcpiface/IMessage.go
deleted file mode 100644
index a3bd69f..0000000
--- a/tcpboxV0.9/tcpiface/IMessage.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package tcpiface
-
-/*
-
- 设置消息的格式
-*/
-
-type IMessage interface {
-
- //获取消息的ID
- GetMsgID() uint32
-
- //获取消息的长度
- GetMsgLen() uint32
-
- //获取消息的内容
- GetMsgData() []byte
-
- //设置消息的ID
- SetMsgID(uint32)
-
- //设置消息的长度
- SetMsgLen(uint32)
-
- //设置消息的内容
- SetMsgData([]byte)
-}
diff --git a/tcpboxV0.9/tcpiface/iMsgHandle.go b/tcpboxV0.9/tcpiface/iMsgHandle.go
deleted file mode 100644
index e341d8f..0000000
--- a/tcpboxV0.9/tcpiface/iMsgHandle.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
- ·根据消息调度路由处理和添加接口
-*/
-type IMsgHandle interface {
- //调度/执行对应的router处理方法
- DoMsgHandle(request IRequest)
-
- //为消息添加具体的处理逻辑
- AddRouter(msgID uint32, router IRouter)
-
- //启动worker工作池
- StartWorkerPool()
-
- //将消息发送给消息任务队列处理
- SendMsgToTaskQueue(request IRequest)
-}
diff --git a/tcpboxV0.9/tcpiface/iconnection.go b/tcpboxV0.9/tcpiface/iconnection.go
deleted file mode 100644
index a3b5cc7..0000000
--- a/tcpboxV0.9/tcpiface/iconnection.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package tcpiface
-
-import "net"
-
-//定义链接模块的抽象层
-type IConnection interface {
- //启动链接,让当前的链接准备工作
- Start()
-
- //停止链接,结束当前链接的工作
- Stop()
-
- //获取当前链接绑定的socket conn
- GetTCPConnection() *net.TCPConn
-
- //获取当前连接模块的连接ID
- GetConnID() uint32
-
- //获取远程客户端的TCP状态 IP PORT
- RemoteAddr() net.Addr
-
- //发送数据,将数据发送给远程的客户端
- SendMsg(msgID uint32, data []byte) error
-
- //设置连接属性
- SetProperty(key string, value interface{})
- //获取连接属性
- GetProperty(key string) (interface{}, error)
- //移除连接属性
- RemoveProperty(key string)
-}
-
-//定义一个处理链接业务的方法
-type HandleFunc func(*net.TCPConn, []byte, int) error
diff --git a/tcpboxV0.9/tcpiface/iconnmanager.go b/tcpboxV0.9/tcpiface/iconnmanager.go
deleted file mode 100644
index ddb8134..0000000
--- a/tcpboxV0.9/tcpiface/iconnmanager.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package tcpiface
-
-//连接管理模块抽象层
-
-type IConnManager interface {
- //添加链接
-
- Add(conn IConnection)
-
- //删除链接
- Remove(conn IConnection)
-
- //根据Conn ID获取链接
- Get(connID uint32) (IConnection, error)
-
- //得到当前链接总数
- Len() int
-
- //清除并终止所有的链接
- CleanConn()
-}
diff --git a/tcpboxV0.9/tcpiface/imsgpack.go b/tcpboxV0.9/tcpiface/imsgpack.go
deleted file mode 100644
index 80264b5..0000000
--- a/tcpboxV0.9/tcpiface/imsgpack.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package tcpiface
-
-/*
-
- 封包、拆包模块
- 直接面向tcp中的数据流,解决粘包问题
-*/
-
-type IMsgPack interface {
-
- //获取消息的长度
- GetHeadLen() uint32
- //将消息封装
- Pack(message IMessage) ([]byte, error)
-
- //拆包,获取消息内容
- Unpack([]byte) (IMessage, error)
-}
diff --git a/tcpboxV0.9/tcpiface/irequest.go b/tcpboxV0.9/tcpiface/irequest.go
deleted file mode 100644
index d190b13..0000000
--- a/tcpboxV0.9/tcpiface/irequest.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package tcpiface
-
-/*
- IRequest接口:
- 实际上是把客户端请求的链接和客户端请求的数据包装到一个request中
-*/
-type IRequest interface {
- //得到当前链接
- GetConnection() IConnection
-
- //得到请求的数据
- GetData() []byte
-
- //获取请求消息的ID
- GetMsgID() uint32
-}
diff --git a/tcpboxV0.9/tcpiface/irouter.go b/tcpboxV0.9/tcpiface/irouter.go
deleted file mode 100644
index 1542a2c..0000000
--- a/tcpboxV0.9/tcpiface/irouter.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tcpiface
-
-/*
- 路由抽象接口
- 路由里的数据都是IRequest
-*/
-
-type IRouter interface {
- //处理conn业务之前的钩子方法Hook
- //PreHandle(request IRequest)
-
- //处理conn的主方法hook
- Handle(request IRequest)
-
- //处理conn业务之后的钩子方法Hook
- //PostHandle(request IRequest)
-}
diff --git a/tcpboxV0.9/tcpiface/iserver.go b/tcpboxV0.9/tcpiface/iserver.go
deleted file mode 100644
index 863134e..0000000
--- a/tcpboxV0.9/tcpiface/iserver.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package tcpiface
-
-type IServer interface {
- //启动服务器
- Start()
- //终止服务器
- Stop()
- //运行服务器
- Server()
- //路由功能:给当前的服务注册一个路由方法,共客户端的链接处理使用
- AddRouter(msgID uint32, router IRouter)
- //获取当前server的连接管理器
- GetConnMgr() IConnManager
- //注册OnConnStart钩子函数方法
- SetOnConnStart(func(connection IConnection))
- //注册OnConnStop钩子函数方法
- SetOnConnStop(func(connection IConnection))
- //调用OnConnStart钩子函数方法
- CallOnConnStart(connection IConnection)
- //调用OnConnStop钩子函数方法
- CallOnConnStop(connection IConnection)
-}
diff --git a/tcpboxV0.9/tcpnet/connmanager.go b/tcpboxV0.9/tcpnet/connmanager.go
deleted file mode 100644
index 98bfceb..0000000
--- a/tcpboxV0.9/tcpnet/connmanager.go
+++ /dev/null
@@ -1,84 +0,0 @@
-package tcpnet
-
-import (
- "errors"
- "fmt"
- "sync"
- "tcpbox/tcpiface"
-)
-
-/*
-
- 连接管理模块
-*/
-
-type ConnManager struct {
- connections map[uint32]tcpiface.IConnection //管理链接的集合
- connLock sync.RWMutex //保护连接集合的读写锁
-}
-
-//创建当前链接管理的方法
-func NewConnManager() *ConnManager {
- return &ConnManager{
- connections: make(map[uint32]tcpiface.IConnection),
- }
-}
-
-//添加链接
-func (c *ConnManager) Add(conn tcpiface.IConnection) {
- //保护共享资源map,加写锁
- c.connLock.Lock()
- defer c.connLock.Unlock()
-
- //将conn加入到ConnManager中
- c.connections[conn.GetConnID()] = conn
- fmt.Println("connection add to Connmanager successfully:conn num =", c.Len())
-
-}
-
-//删除链接
-func (c *ConnManager) Remove(conn tcpiface.IConnection) {
- //保护共享资源map,加写锁
- c.connLock.Lock()
- defer c.connLock.Unlock()
-
- //删除连接信息
- delete(c.connections, conn.GetConnID())
- fmt.Println("connID =", conn.GetConnID(), "remove from ConnManger Successfully: conn num is ", conn.GetConnID())
-}
-
-//根据Conn ID获取链接
-func (c *ConnManager) Get(connID uint32) (tcpiface.IConnection, error) {
- //保护共享资源map,加读锁
- c.connLock.RLock()
- defer c.connLock.RUnlock()
-
- if conn, ok := c.connections[connID]; ok {
- //找到了
- return conn, nil
- } else {
- return nil, errors.New("connection not found")
- }
-}
-
-//得到当前链接总数
-func (c *ConnManager) Len() int {
- return len(c.connections)
-}
-
-//清除并终止所有的链接
-func (c *ConnManager) CleanConn() {
- //保护共享资源map,加读锁
- c.connLock.RLock()
- defer c.connLock.RUnlock()
-
- //删除conn并停止conn的工作
- for connID, conn := range c.connections {
- //停止
- conn.Stop()
- //删除
- delete(c.connections, connID)
-
- }
- fmt.Println("Clean all connections successfully! conn num=", c.Len())
-}
diff --git a/tcpboxV0.9/tcpnet/message.go b/tcpboxV0.9/tcpnet/message.go
deleted file mode 100644
index 79ebca2..0000000
--- a/tcpboxV0.9/tcpnet/message.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package tcpnet
-
-type Message struct {
- //消息的ID
- MsgID uint32
-
- //消息的长度
- MsgLen uint32
-
- //消息的内容
- MsgData []byte
-}
-
-//创建一个Message消息包
-func NewMsgPackage(msgID uint32, data []byte) *Message {
- return &Message{
- MsgID: msgID,
- MsgLen: uint32(len(data)),
- MsgData: data,
- }
-}
-
-//获取消息的ID
-func (m *Message) GetMsgID() uint32 {
- return m.MsgID
-}
-
-//获取消息的长度
-func (m *Message) GetMsgLen() uint32 {
- return m.MsgLen
-}
-
-//获取消息的内容
-func (m *Message) GetMsgData() []byte {
- return m.MsgData
-}
-
-//设置消息的ID
-func (m *Message) SetMsgID(id uint32) {}
-
-//设置消息的长度
-func (m *Message) SetMsgLen(len uint32) {}
-
-//设置消息的内容
-func (m *Message) SetMsgData(data []byte) {}
diff --git a/tcpboxV0.9/tcpnet/msgHandle.go b/tcpboxV0.9/tcpnet/msgHandle.go
deleted file mode 100644
index 008ceec..0000000
--- a/tcpboxV0.9/tcpnet/msgHandle.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "strconv"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type MsgHandler struct {
- //属性 根据消息ID调度路由
- Apis map[uint32]tcpiface.IRouter
-
- //负责Worker去任务的消息队列
- TaskQueue []chan tcpiface.IRequest
-
- //业务工作池Worker的数量
- WorkerPoolSize uint32
-}
-
-//初始化创建MsgHandler的处理逻辑
-func NewMsgHandler() *MsgHandler {
- return &MsgHandler{
- Apis: make(map[uint32]tcpiface.IRouter),
- WorkerPoolSize: utils.GlobalObject.WorkerPoolSize,
- TaskQueue: make([]chan tcpiface.IRequest, utils.GlobalObject.WorkerPoolSize),
- }
-}
-
-func (mh *MsgHandler) DoMsgHandle(request tcpiface.IRequest) {
-
- //从request中找到msgID
- handler, ok := mh.Apis[request.GetMsgID()]
- if !ok {
- fmt.Println("api msgID=", request.GetMsgID(), "is not found! need register")
- }
-
- //根据msgID调度对应的业务处理
- //handler.PreHandle(request)
- handler.Handle(request)
- //handler.PostHandle(request)
-}
-
-//为消息添加具体的处理逻辑
-func (mh *MsgHandler) AddRouter(msgID uint32, router tcpiface.IRouter) {
- //判断当前msg绑定的api处理方法事都已经存在
- if _, ok := mh.Apis[msgID]; ok {
- //id 已经注册了
- panic("repeat api,msgID=" + strconv.Itoa(int(msgID)))
- }
- //添加msg与api的绑定关系
- mh.Apis[msgID] = router
- fmt.Println("Add api MsgID=", msgID, "successed!")
-}
-
-//启动一个佛南工作池 (开启工作池的动作只能有一次)
-func (mh *MsgHandler) StartWorkerPool() {
- //根据workerpoolsize 分别开启Worker,每个Worker用一个go来承载
- for i := 0; i < int(mh.WorkerPoolSize); i++ {
- //一个worker被启动
- //1、当前的worker对应的channel消息队列 开辟空间 第0个worker就用第0个channel
- mh.TaskQueue[i] = make(chan tcpiface.IRequest, utils.GlobalObject.MaxWorkerTaskLen)
-
- //2、启动当前的worker,阻塞等待消息从channel传递过来
- go mh.StartOneWorker(i, mh.TaskQueue[i])
- }
-}
-
-//启动一个Worker工作流程
-func (mh *MsgHandler) StartOneWorker(workerID int, taskQueue chan tcpiface.IRequest) {
- fmt.Println("worker ID=", workerID, "is running......")
- //不断阻塞等待对应消息队列的消息
- select {
- //如果有消息过来,出列的就是一个客户端的request,执行当前的request所绑定的业务
- case request := <-taskQueue:
- mh.DoMsgHandle(request)
-
- }
-}
-
-//将消息均衡发送给对应的worker
-func (mh *MsgHandler) SendMsgToTaskQueue(request tcpiface.IRequest) {
- //将消息平均分配给不同的worker
- workerID := request.GetConnection().GetConnID() % mh.WorkerPoolSize
-
- fmt.Println("Add ConnID =", request.GetConnection().GetConnID(),
- "request MsgID =", request.GetMsgID(), "to WorkerID = ", workerID)
- //将消息发送给对应的worker的taskQueue即可
- mh.TaskQueue[workerID] <- request
-}
diff --git a/tcpboxV0.9/tcpnet/msgpack.go b/tcpboxV0.9/tcpnet/msgpack.go
deleted file mode 100644
index 7953085..0000000
--- a/tcpboxV0.9/tcpnet/msgpack.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package tcpnet
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "fmt"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-type DataPack struct {
-}
-
-func NewDataPack() *DataPack {
- return &DataPack{}
-}
-
-//获取包的头部长度的方法
-func (dp *DataPack) GetHeadLen() uint32 {
- //datalen uint32 (4个字节) + dataID uint32(4个字节)
- return 8
-}
-
-//将消息打包
-func (dp *DataPack) Pack(msg tcpiface.IMessage) (data []byte, err error) {
- //创建一个存放bytes字节的缓冲
- dataBuf := bytes.NewBuffer([]byte{})
-
- //将dataLen写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgLen())
- if nil != err {
- return nil, err
- }
-
- //将dataID写入到dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgID())
- if nil != err {
- return nil, err
- }
-
- //将消息内容写入dataBuf中
- err = binary.Write(dataBuf, binary.LittleEndian, msg.GetMsgData())
- if nil != err {
- return nil, err
- }
-
- return dataBuf.Bytes(), nil
-}
-
-//拆包方法 ,先将head中信息读出来,再根据head中的data长度再进行一次读
-func (dp *DataPack) Unpack(binaryData []byte) (tcpiface.IMessage, error) {
-
- //创建一个从输入二进制的ioReader
- dataBuf := bytes.NewBuffer(binaryData)
-
- //只解压head信息,获取dataLen和dataID信息
- msg := &Message{}
-
- //读取dataLen
- err := binary.Read(dataBuf, binary.LittleEndian, &msg.MsgLen)
- if nil != err {
- return nil, err
- }
-
- //读取dataID
- err = binary.Read(dataBuf, binary.LittleEndian, &msg.MsgID)
- if nil != err {
- return nil, err
- }
-
- //判断dataLen是否已经超出了我们允许的最大长度
- if utils.GlobalObject.MaxPackageSize > 0 && msg.MsgLen > utils.GlobalObject.MaxPackageSize {
- fmt.Println(utils.GlobalObject.MaxPackageSize, "||||", msg.MsgLen)
- return nil, errors.New("too large msg data recv!")
- }
- return msg, nil
-
-}
diff --git a/tcpboxV0.9/tcpnet/msgpack_test.go b/tcpboxV0.9/tcpnet/msgpack_test.go
deleted file mode 100644
index 942c22a..0000000
--- a/tcpboxV0.9/tcpnet/msgpack_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "io"
- "net"
- "testing"
-)
-
-func TestDataPack(t *testing.T) {
-
- /*
- 模拟服务器
- */
- //1、创建socketTCP
- listen, err := net.Listen("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Server listen failed!!! err:", err)
- return
- }
-
- //创建一个goroutine承载,负责从客户端处理业务
- go func() {
-
- //2、从客户端读取数据,拆包处理
- for {
- conn, err := listen.Accept()
- if nil != err {
- fmt.Println("Server accept failed!!! err:", err)
- return
- }
-
- go func(conn net.Conn) {
- //处理客户端请求
- //----------》拆包过程《---------------
- //定义一个拆包的对象dp
- dp := NewDataPack()
- for {
- //1、第一次从conn读,把包的head读出来
- headData := make([]byte, dp.GetHeadLen())
- _, err := io.ReadFull(conn, headData)
- if nil != err {
- fmt.Println("Read head failed!!! err:", err)
- break
- }
- fmt.Println(headData)
- msgHead, err := dp.Unpack(headData)
- if nil != err {
- fmt.Println("Server unpack1 failed!!! err:", err)
- return
- }
-
- if msgHead.GetMsgLen() > 0 {
- //msg是有数据的,需要进行第二次读取
- //2、第二次从conn中读取,再根据head中的len读取data的内容
- msg := msgHead.(*Message)
- msg.MsgData = make([]byte, msg.GetMsgLen())
-
- //根据dataLen的长度再次从io流中读取
- _, err := io.ReadFull(conn, msg.MsgData)
- if nil != err {
- fmt.Println("Server unpack2 failed!!! err:", err)
- return
- }
-
- //完整的一个消息已经读取完毕
- fmt.Println("---->Receive MsgID:", msg.MsgID, "dataLen:", msg.MsgLen, "data:", string(msg.MsgData))
- }
- }
-
- }(conn)
- }
- }()
-
- /*
-
- 模拟客户端
-
- */
- conn, err := net.Dial("tcp", "127.0.0.1:8990")
- if nil != err {
- fmt.Println("Client dial failed!!! err:", err)
- return
-
- }
-
- //创建一个封包对象
- dp := NewDataPack()
-
- //模拟粘包过程
- //封装第一个包msg1
- msg1 := &Message{
- MsgID: 1,
- MsgLen: 5,
- MsgData: []byte{'a', 'b', 'c', 'd', 'e'},
- }
- sendData1, err := dp.Pack(msg1)
- if nil != err {
- fmt.Println("Client pack msg1 failed!!! err:", err)
- return
- }
-
- //封装第二个包msg1
- msg2 := &Message{
- MsgID: 2,
- MsgLen: 7,
- MsgData: []byte{'1', '2', '3', '4', '5', '6', '7'},
- }
- sendData2, err := dp.Pack(msg2)
- if nil != err {
- fmt.Println("Client pack msg2 failed!!! err:", err)
- return
- }
- //将两个包粘在一起
- sendData := append(sendData1, sendData2...)
-
- //一次性发送给服务端
- conn.Write(sendData)
-
- //阻塞客户端
- select {}
-}
diff --git a/tcpboxV0.9/tcpnet/request.go b/tcpboxV0.9/tcpnet/request.go
deleted file mode 100644
index 8556791..0000000
--- a/tcpboxV0.9/tcpnet/request.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-type Request struct {
- //已经和客户端建立好的链接
- conn tcpiface.IConnection
-
- //客户端请求的数据
- msg tcpiface.IMessage
-}
-
-//得到当前链接
-func (r *Request) GetConnection() tcpiface.IConnection {
- return r.conn
-}
-
-//获取请求数据
-func (r *Request) GetData() []byte {
- return r.msg.GetMsgData()
-}
-
-//获取消息的id
-func (r *Request) GetMsgID() uint32 {
- return r.msg.GetMsgID()
-}
diff --git a/tcpboxV0.9/tcpnet/router.go b/tcpboxV0.9/tcpnet/router.go
deleted file mode 100644
index a2c6c5c..0000000
--- a/tcpboxV0.9/tcpnet/router.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package tcpnet
-
-import "tcpbox/tcpiface"
-
-/*
- 这里的router之所以为空是因为有的router不需要PreHandle和PostHandle两个方法
-所以router继承BaseRouter的好处就是,不需要实现PreHandle和PostHandle两个方法
-*/
-type BaseRouter struct {
-}
-
-//处理conn业务之前的钩子方法Hook
-func (r *BaseRouter) PreHandle(request tcpiface.IRequest) {}
-
-//处理conn的主方法hook
-func (r *BaseRouter) Handle(request tcpiface.IRequest) {}
-
-//处理conn业务之后的钩子方法Hook
-func (r *BaseRouter) PostHandle(request tcpiface.IRequest) {}
diff --git a/tcpboxV0.9/tcpnet/server.go b/tcpboxV0.9/tcpnet/server.go
deleted file mode 100644
index 2096661..0000000
--- a/tcpboxV0.9/tcpnet/server.go
+++ /dev/null
@@ -1,152 +0,0 @@
-package tcpnet
-
-import (
- "fmt"
- "net"
- "tcpbox/tcpiface"
- "tcpbox/utils"
-)
-
-//IServer的接口实现,定义一个Server的服务器模块
-
-type Server struct {
- //服务器的名称
- Name string
- //服务器绑定的ip版本
- IPVersion string
- //服务器监听的ip
- IP string
- //服务武器监听的端口
- Port int
- //当前的server添加一个router,server注册的链接对应的处理业务
- MsgHandler tcpiface.IMsgHandle
- //当前server的connManager
- ConnManager tcpiface.IConnManager
-
- //该server创建连接之后自动调用的hook函数
- OnConnStart func(conn tcpiface.IConnection)
- //该server销毁链接之前自动调用的hook函数
- OnConnStop func(conn tcpiface.IConnection)
-}
-
-func (s *Server) Start() {
-
- //在启动之初打印一下zinx的配置信息
- fmt.Printf("[Zinx] Name:%s\n", utils.GlobalObject.Name)
- fmt.Printf("[Zinx] Host:%s,Port:%d\n", utils.GlobalObject.Host, utils.GlobalObject.Port)
- fmt.Printf("[Zinx] Version:%d ,MaxConn:%d,MaxPackageSize:%d\n", utils.GlobalObject.Version,
- +utils.GlobalObject.MaxConn, utils.GlobalObject.MaxPackageSize)
-
- //用一个goroution来处理
-
- go func() {
- //开启消息队列及worker工作池
- s.MsgHandler.StartWorkerPool()
-
- fmt.Printf("[Start] Server Listener at %s ,Port %d,is starting\n", s.IP, s.Port)
- //1、获取一个TCP的ADDR
- addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
- if nil != err {
- fmt.Println("resolve tcp addr err:", err)
- return
- }
-
- //2、监听TCP
- ip, err := net.ListenTCP(s.IPVersion, addr)
- if nil != err {
- fmt.Println("listen ip err:", err)
- return
- }
- //3、阻塞等待连接
- fmt.Println("Start Zinx Server successfully,Name: ", s.Name, ",Listening")
- //链接ID
- var cid uint32 = 0
- for {
- //循环等待客户端连接
- conn, err := ip.AcceptTCP()
- if nil != err {
- fmt.Println("accept err:", err)
- continue
- }
-
- //设置最大连接个数的判断,如果超过最大连接,那么关闭此新的连接
- if s.ConnManager.Len() >= utils.GlobalObject.MaxConn {
- //TODO 给客户端响应一个最大连接错误包
- fmt.Println("Too many Connections MaxConn = ", utils.GlobalObject.MaxConn)
- conn.Close()
- continue
- }
-
- //将处理新链接的业务方法与Conn绑定得到我们的链接模块
- dealConn := NewConnection(s, conn, cid, s.MsgHandler)
- cid++
- go dealConn.Start()
- }
- }()
-
-}
-
-func (s *Server) Stop() {
- //TODO 将一些服务器的资源、链接进行停止、释放
-
- fmt.Println("[Server] server name:", s.Name)
- s.ConnManager.CleanConn()
-}
-
-func (s *Server) AddRouter(msgID uint32, router tcpiface.IRouter) {
- s.MsgHandler.AddRouter(msgID, router)
- fmt.Println("Add Router successfully!!!")
-}
-
-func (s *Server) Server() {
- //启动Server的服务功能
- s.Start()
- //TODO 做一些服务启动之后的额外的业务
-
- //阻塞状态
- select {}
-}
-
-/* 初始化server模块的方法
-
- */
-func NewServer(name string) tcpiface.IServer {
- s := &Server{
- Name: utils.GlobalObject.Name,
- IPVersion: utils.GlobalObject.IPVersion,
- IP: utils.GlobalObject.Host,
- Port: utils.GlobalObject.Port,
- MsgHandler: NewMsgHandler(),
- ConnManager: NewConnManager(),
- }
- return s
-}
-func (s *Server) GetConnMgr() tcpiface.IConnManager {
- return s.ConnManager
-}
-
-//注册钩子函数方法
-func (s *Server) SetOnConnStart(hookFunc func(conn tcpiface.IConnection)) {
- s.OnConnStart = hookFunc
-}
-
-//注册钩子函数方法
-func (s *Server) SetOnConnStop(hookFunc func(conn tcpiface.IConnection)) {
- s.OnConnStop = hookFunc
-}
-
-//调用钩子函数方法
-func (s *Server) CallOnConnStart(conn tcpiface.IConnection) {
- if s.OnConnStart != nil {
- fmt.Println("---->Call OnConnStart()......")
- s.OnConnStart(conn)
- }
-}
-
-//调用钩子函数方法
-func (s *Server) CallOnConnStop(conn tcpiface.IConnection) {
- if s.OnConnStop != nil {
- fmt.Println("----->Call OnConnStop()......")
- s.OnConnStop(conn)
- }
-}
diff --git a/test.go b/test.go
deleted file mode 100644
index 4685de5..0000000
--- a/test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package main
-
-import (
- "fmt"
- "regexp"
-)
-
-func main() {
-
- compile := regexp.MustCompile("faksdjfskajdfj")
- fmt.Println(compile.LiteralPrefix())
-}
diff --git "a/thred/\345\271\266\345\217\221/channel_1/test_1.go" "b/thred/\345\271\266\345\217\221/channel_1/test_1.go"
deleted file mode 100644
index 3a1b8cd..0000000
--- "a/thred/\345\271\266\345\217\221/channel_1/test_1.go"
+++ /dev/null
@@ -1,24 +0,0 @@
-package main
-
-import (
- "fmt"
- "time"
-)
-
-var cha chan string
-
-func test() {
- select {
- case ch, ok := <-cha:
- if ok {
- fmt.Printf("%v", ch)
- }
- case <-time.After(time.Second * 2):
- }
-}
-func main() {
- go test()
- fmt.Print("ghajhdsgf")
- cha <- "你好!潘丽萍"
- time.Sleep(time.Second * 4)
-}
diff --git a/vipertest/config.json b/vipertest/config.json
new file mode 100644
index 0000000..05db619
--- /dev/null
+++ b/vipertest/config.json
@@ -0,0 +1,9 @@
+{
+ "mysql": {
+ "dbname": "test",
+ "dbuser": "sncot",
+ "password": "121231",
+ "host": "127.0.0.1",
+ "port": "336"
+ }
+}
diff --git a/vipertest/config.yaml b/vipertest/config.yaml
new file mode 100644
index 0000000..0bccfa7
--- /dev/null
+++ b/vipertest/config.yaml
@@ -0,0 +1,6 @@
+mysql:
+ dbuser: "root"
+ port: 3306
+ dbname: "test"
+ password: "950629"
+ dbhost: "47.92.232.26"
\ No newline at end of file
diff --git a/vipertest/go.mod b/vipertest/go.mod
new file mode 100644
index 0000000..b91d419
--- /dev/null
+++ b/vipertest/go.mod
@@ -0,0 +1,45 @@
+module vipertest
+
+go 1.18
+
+require (
+ github.com/gin-gonic/gin v1.9.1
+ github.com/spf13/viper v1.16.0
+)
+
+require (
+ github.com/bytedance/sonic v1.9.1 // indirect
+ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+ github.com/fsnotify/fsnotify v1.6.0 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.14.0 // indirect
+ github.com/goccy/go-json v0.10.2 // indirect
+ github.com/hashicorp/hcl v1.0.0 // indirect
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.4 // indirect
+ github.com/leodido/go-urn v1.2.4 // indirect
+ github.com/magiconair/properties v1.8.7 // indirect
+ github.com/mattn/go-isatty v0.0.19 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/pelletier/go-toml/v2 v2.0.8 // indirect
+ github.com/spf13/afero v1.9.5 // indirect
+ github.com/spf13/cast v1.5.1 // indirect
+ github.com/spf13/jwalterweatherman v1.1.0 // indirect
+ github.com/spf13/pflag v1.0.5 // indirect
+ github.com/subosito/gotenv v1.4.2 // indirect
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+ github.com/ugorji/go/codec v1.2.11 // indirect
+ golang.org/x/arch v0.3.0 // indirect
+ golang.org/x/crypto v0.9.0 // indirect
+ golang.org/x/net v0.10.0 // indirect
+ golang.org/x/sys v0.8.0 // indirect
+ golang.org/x/text v0.9.0 // indirect
+ google.golang.org/protobuf v1.30.0 // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/vipertest/go.sum b/vipertest/go.sum
new file mode 100644
index 0000000..b45f95d
--- /dev/null
+++ b/vipertest/go.sum
@@ -0,0 +1,539 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
+cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
+github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
+github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
+github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
+github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
+github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
+github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
+github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
+github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
+github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
+github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
+github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
+github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc=
+github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
+github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
+golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
+golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
+google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
+google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/vipertest/main.go b/vipertest/main.go
new file mode 100644
index 0000000..53445de
--- /dev/null
+++ b/vipertest/main.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/fsnotify/fsnotify"
+
+ "github.com/spf13/viper"
+)
+
+type App struct { //注意:一定要配置一个全局的,否则无法解析到结构体
+ Mysql `mapstructure:"mysql"` //指针或者值嵌入均可
+}
+type Mysql struct {
+ Dbname string `mapstructure:"dbname"`
+ Port int64 `mapstructure:"port"`
+ User string `mapstructure:"dbuser"`
+ Password string `mapstructure:"password"`
+ Host string `mapstructure:"dbhost"`
+}
+
+func main() {
+
+ viper.SetConfigName("config") //配置文件名称 对于本地文件不必带后缀
+ viper.AddConfigPath("../") //可以添加多个配置文件路径,依次寻找,找到第一个后将不再寻找
+ viper.AddConfigPath(".") // 添加配置文件路径
+ err := viper.ReadInConfig() // 读取配置文件
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ app := new(App)
+ err = viper.Unmarshal(app)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ viper.WatchConfig()
+ viper.OnConfigChange(func(in fsnotify.Event) {
+ fmt.Println("config changes!", in.Name)
+ })
+ fmt.Println(app.Port)
+ select {}
+
+}