首先,让我们看一下实现实现的细节。让我们看一下中间部分的用法:
我相信,当学习Java的学生首先接触中间部分时,他们会感到这样:“这不是过滤器/拦截器吗?”
是的,从实用主义的角度来看,SO所谓的中间件本质上是开发人员提供的通用过程控制。我们可以将一些通用的过程控制代码集中在中间件上,例如权限验证,日志记录等待。
如果我们想实施类似于杜松子酒的中间机制,您会怎么做?
首先,让我们考虑中间件系统的功能:
总而言之,我们中间系统的主要目的是管理中间件功能的呼叫关系。您可以通过数组或链接列表管理中间功能,但该功能是Golang的第一个级别公民。自然,我们需要使用封闭机制来实现简单的中间件系统。
由于闭合机制用于实现中间件的功能,因此我们在中间功能中要做的是打包业务功能并返回包装业务功能,因此我们可以实现自由组合的中间功能。
我们将业务函数定义为无访问的函数。为了测试可以随机休眠0到2秒的函数,我们被用于模拟业务处理。
接下来,我们定义三个中间功能,并通过业务功能组装它们
组合(因为中间功能在包装后返回业务功能,所以我们可以自由地结合这些中间件。)
组合后的中间软件和业务功能如下:
可以看出,组合的中间件和业务功能本质上是呼叫堆栈()
与关闭相比,选择了具有小认知负担的实施方法。底层使用功能数组来保存这些中间件并定义以下内容:
每当有到达服务器的请求时,它将为此请求分配一个。上下文保存了请求的相应处理器链,并引用了一个符号记录当前正在处理的记录。
构造上下文时,调用方法将开始处理请求。
如果您想在上述情况下达到决策效果,我们只需要拨打中间呼叫即可。目前,上下文将在索引中添加1个以执行下一个。当函数调用堆栈回到当前方法时,索引大于索引大于不会发生大小的大小。
如果您注意到上述大小转换为类型类型,则可以限制类型的类型。从理论上讲,只能支持127个,但实际上,当添加呼叫方法时,将比较大小。该值直接报告错误。
因此,如果我们想事先结束请求,我们可以直接设置它以获得值得的值。
在转换上一篇文章的示例之后,我们将获得以下代码:
Gin的中间件系统的底层维护一个函数数组和一个索引,用于存储中间软件功能和接口处理功能。