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 {} + +}