github.com/nyan233/littlerpc@v0.4.6-0.20230316182519-0c8d5c48abaf/core/middle/plugin/plugin.go (about) 1 package plugin 2 3 import ( 4 "context" 5 "github.com/nyan233/littlerpc/core/common/logger" 6 perror "github.com/nyan233/littlerpc/core/protocol/error" 7 "github.com/nyan233/littlerpc/core/protocol/message" 8 "reflect" 9 ) 10 11 const ( 12 COMPLEX = 1 ^ 4 // 按照插件的功能区分,complex代表这个插件可以支持自定义的控制参数 13 NORMAL = 1 ^ 8 // 按照插件的功能区分,normal代表这个插件并不支持自定义的控制参数 14 ) 15 16 type Event int 17 18 const ( 19 OnOpen Event = 1 << (5 + iota) // 连接建立 20 OnMessage 21 OnRead // 收到读事件// 收到Rpc消息 22 OnClose // 连接关闭 23 ) 24 25 // Plugin 26 // 27 // NOTE: 返回的(error != nil)即表示中断调用过程, 所以何时返回error是一个慎重的决定 28 // 不确定是否返回时, 推荐使用pub中的Logger打印日志, 级别由严重程度决定 29 type Plugin interface { 30 ClientPlugin 31 ServerPlugin 32 } 33 34 // ClientPlugin 指针类型的数据均不能被多个Goroutine安全的使用 35 // 如果你要这么做的话,那么请将其拷贝一份 36 type ClientPlugin interface { 37 ClientPlugin2 38 } 39 40 // ServerPlugin 指针类型的数据均不能被多个Goroutine安全的使用 41 // 如果你要这么做的话,那么请将其拷贝一份 42 // 43 // 每个方法的触发时机, 不是所有方法在所有的时机皆可触发 44 // Api Event Message-Type 45 // Event4S --> All --> Call,Ping,Context-Cancel 46 // Receive4S --> OnMessage --> Call,Ping,Context-Cancel 47 // Call4S --> OnMessage --> Call 48 // AfterCall4S --> OnMessage --> Call 49 // Send4S --> OnMessage --> Call,Ping,Context-Cancel 50 // AfterSend4S --> OnMessage --> Call,Ping,Context-Cancel 51 type ServerPlugin interface { 52 ServerPlugin2 53 } 54 55 type ServerPlugin2 interface { 56 // Event4S 触发事件时执行, Event == OnClose时会忽略next返回值, 因为OnClose执行的操作 57 // 是回收OnOpen时创建的资源, 如果next使其能够中断的话则会造成资源泄漏 58 // OnOpen --> next == false --> 不会创建任何关于该新连接的资源, 同时关闭该连接 59 // OnMessage --> next == false --> 忽略本次OnMessage操作 60 Event4S(ev Event) (next bool) 61 // Receive4S 在这个阶段不会产生错误, 这个阶段之前发生的错误都不可能正确的生成消息, 也就是说在这个阶段前 62 // 发生的错误插件无法感知 63 Receive4S(pub *Context, msg *message.Message) perror.LErrorDesc 64 // Call4S 调用之前产生的error来自于LittleRpc本身的校验过程, 参数校验失败/反序列化失败等错误 65 Call4S(pub *Context, args []reflect.Value, err perror.LErrorDesc) perror.LErrorDesc 66 // AfterCall4S 调用之后产生的错误可能来自被调用者调用了panic()但是其自身没有处理, 导致被LittleRpc捕获到了 67 // 如果是其自身返回的错误则应该在results中 68 AfterCall4S(pub *Context, args, results []reflect.Value, err perror.LErrorDesc) perror.LErrorDesc 69 // Send4S 发送之前产生的错误可能来自于序列化结果, 当遇到一个不可序列化的结果则会产生错误 70 Send4S(pub *Context, msg *message.Message, err perror.LErrorDesc) perror.LErrorDesc 71 // AfterSend4S 发送之后的错误主要来自于Writer, 写请求失败时会产生一个错误 72 AfterSend4S(pub *Context, msg *message.Message, err perror.LErrorDesc) perror.LErrorDesc 73 } 74 75 type ClientPlugin2 interface { 76 // Request4C 77 // 在这个阶段不会产生错误, 这个阶段之前发生的错误都不可能正确的生成消息, 也就是说在这个阶段前 78 // 发生的错误插件无法感知 79 Request4C(pub *Context, args []interface{}, msg *message.Message) perror.LErrorDesc 80 // Send4C 发送之前产生的错误, 主要来自于序列化, 遇到不能序列化的数据时会产生一个错误 81 Send4C(pub *Context, msg *message.Message, err perror.LErrorDesc) perror.LErrorDesc 82 // AfterSend4C 发送之后产生的错误主要来自于Writer, 写请求失败会产生一个错误 83 AfterSend4C(pub *Context, msg *message.Message, err perror.LErrorDesc) perror.LErrorDesc 84 // Receive4C 接收消息时产生的错误来自于后台负责接收处理消息的异步过程 85 Receive4C(pub *Context, msg *message.Message, err perror.LErrorDesc) perror.LErrorDesc 86 // AfterReceive4C 接收消息后产生的错误来自多个方面 87 // ----> LRPC-Server回传 88 // ----> LRPC-Client解析消息时产生 89 // ----> RPC Callee返回 90 AfterReceive4C(pub *Context, results []interface{}, err perror.LErrorDesc) perror.LErrorDesc 91 } 92 93 // Context NOTE: 不将context放在Factory内是因为LittleRpc有重启 94 // 的功能, 如果放在Factory中 95 type Context struct { 96 PluginContext context.Context 97 Logger logger.LLogger 98 EHandler perror.LErrors 99 }