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  }