Golang Go语言 新鲜出炉!Golang Go语言版本的pipeline发布啦,你还在愁Golang Go语言没有好用的中间件吗?

发布于 1周前 作者 yibo5220 来自 Go语言

Golang Go语言 新鲜出炉!Golang Go语言版本的pipeline发布啦,你还在愁Golang Go语言没有好用的中间件吗?

Goal-web/pipeline

goal-web/pipeline
这是一个管道库,实现了 和 laravel 一样的管道功能,如果你很熟悉 laravel 的管道或者中间件,那你一定对这个库很有亲切感。

安装 - install

go get github.com/goal-web/pipeline

使用 - usage

得益于 goal 强大的容器,你可以在管道(pipe)和目的地(destination)任意注入容器中存在的实例

对管道不熟悉的同学,可以把 pipe 理解为中间件,destination 就是控制器方法

package tests

import ( “fmt” “github.com/goal-web/container” “github.com/goal-web/contracts” “github.com/goal-web/pipeline” “github.com/pkg/errors” “testing” )

type User struct { Id int Name string }

func TestPipeline(t *testing.T) { pipe := pipeline.New(container.New()) pipe.Send(User{Id: 1, Name: “goal”}). Through( func(user User, next pipeline.Pipe) interface{} { fmt.Println(“中间件 1-start”) result := next(user) fmt.Println(“中间件 1-end”) return result }, func(user User, next pipeline.Pipe) interface{} { fmt.Println(“中间件 2-start”) result := next(user) fmt.Println(“中间件 2-end”) return result }, ). Then(func(user User) { fmt.Println(“then”, user) }) }

// TestPipelineException 测试异常情况 func TestPipelineException(t *testing.T) { defer func() { recover() }() pipe := pipeline.New(container.New()) pipe.Send(User{Id: 1, Name: “goal”}). Through( func(user User, next pipeline.Pipe) interface{} { fmt.Println(“中间件 1-start”) result := next(user) fmt.Println(“中间件 1-end”, result) return result }, func(user User, next pipeline.Pipe) interface{} { fmt.Println(“中间件 2-start”) result := next(user) fmt.Println(“中间件 2-end”, result) return result }, ). Then(func(user User) { panic(errors.New(“报个错”)) }) }

// TestStaticPipeline 测试调用 magical 函数 func TestStaticPipeline(t *testing.T) { // 应用启动时就准备好的中间件和控制器函数,在大量并发时用 StaticPipeline 可以提高性能 middlewares := []contracts.MagicalFunc{ container.NewMagicalFunc(func(user User, next pipeline.Pipe) interface{} { fmt.Println(“中间件 1-start”) result := next(user) fmt.Println(“中间件 1-end”, result) return result }), container.NewMagicalFunc(func(user User, next pipeline.Pipe) interface{} { fmt.Println(“中间件 2-start”) result := next(user) fmt.Println(“中间件 2-end”, result) return result }), } controller := container.NewMagicalFunc(func(user User) int { fmt.Println(“then”, user) return user.Id })

pipe := pipeline.Static(container.New())
result := pipe.SendStatic(User{Id: 1, Name: "goal"}).
	ThroughStatic(middlewares...).
	ThenStatic(controller)

fmt.Println("穿梭结果", result)
/**
中间件 1-start
中间件 2-start
then {1 goal}
中间件 2-end [1]
中间件 1-end [1]
穿梭结果 [1]
 */

}

在 goal 之外的框架使用 - use in frameworks other than goal

这个库并不会限制你在哪个框架使用它,所以你可以在任意 go 环境使用这个管道库

goal-web
goal-web/pipeline
[email protected]


更多关于Golang Go语言 新鲜出炉!Golang Go语言版本的pipeline发布啦,你还在愁Golang Go语言没有好用的中间件吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

其实也不是那么新鲜了,因为是昨天晚上写好的了,早上起来才发的 V2

更多关于Golang Go语言 新鲜出炉!Golang Go语言版本的pipeline发布啦,你还在愁Golang Go语言没有好用的中间件吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


中间件是不是就类似 java 里的过滤器, 为什么要叫中间件这个名字呢, 感觉好诡异

PHP 的概念吧,middleware

只是名字而已吧哈哈,本质上是一个东西,最多可能实现方式不一样

shell 里叫管道,iptables 叫表 /链,都不是以 java 的标准起的名字

#2 过滤器是 Filter , 中间件可以 Filter 可以 map ,还可以干别的,你觉得叫什么合适呢

理解为中间件是什么意思?

中间件不是指比如 rpc, mq, 配置中心, apm, 链路追踪之类的周边设施吗?

其实没必要这么抠字眼,中间件是个思想,不是具体组件

可以看看红帽的文档
https://www.redhat.com/zh/topics/middleware/what-is-middleware

中间件是为应用提供通用服务和功能的软件。数据管理、应用服务、消息传递、身份验证和 API 管理通常都要通过中间件。

#8 对我也是这么理解的, 所以楼主的这个不是中间件

对的,楼主只是为了没用过 linux 管道的人方便理解,类比了中间件的思想,要是楼主也写过 java ,原话应该会是:

可以理解成 laravel 的中间件,java 的 filter

插件名,类名 /结构名写的就是管道 pipeline


顺便给 phper 提一下,laravel 有中间件,而调用中间件方法和 controller 是框架底层的 Pipeline 类

和 gin 的 middleware 区别在哪里

我赞成八楼老哥的,中间件是思想,不是具体的组件。

我这个管道库不是某个框架的中间件,只是洋葱模型的管道的一个实现,只是通常用来实现中间件功能。也就是说,你可以在任何需要用到管道的地方使用他,不局限于 gin 或者 goal 或者其他框架

最新的版本支持了纯净模式,也就是没有容器的管道,因为没有反射,性能更好,但是也没有了依赖注入功能。

还是不太一样,我这个主要是需要容器注入功能,框架中许多地方用到

针对您提到的Golang Go语言版本的pipeline发布,以及关于Golang中间件的问题,以下是我的专业回复:

首先,恭喜Golang社区迎来了新的pipeline工具,这无疑为Golang开发者提供了更多选择和便利。在软件开发中,中间件的使用可以极大地提高开发效率和系统的可维护性。

对于Golang而言,中间件同样扮演着重要角色。常见的Golang中间件包括Logger中间件(用于记录HTTP请求的日志信息)、Recovery中间件(用于捕获panic并返回500内部服务器错误响应,防止程序崩溃)、JWT认证中间件(用于验证用户的身份令牌)等。这些中间件可以帮助开发者更好地管理请求和响应,提高系统的安全性和稳定性。

此外,值得注意的是,go-pipeline项目是一个将Unix命令行的优雅管道机制带入Golang程序的开源项目,它使得复杂的命令链式执行和数据处理变得简单高效。虽然它并非传统意义上的“中间件”,但其在数据处理和命令执行方面的优势同样值得Golang开发者关注和使用。

总之,Golang拥有丰富的中间件和工具,开发者可以根据自己的需求选择合适的中间件来优化系统性能和提高开发效率。

回到顶部