Golang可编程代理服务器 - PipeHub的使用与实现
Golang可编程代理服务器 - PipeHub的使用与实现 大家好,
在过去的几周里,我一直在进行一个酝酿已久的个人项目——一个可编程代理服务器。
负载均衡器、API网关、缓存、TLS终止等都是在典型技术栈中运行的服务器示例。但为什么我们需要运行所有这些服务器呢?将这些逻辑整合到一个服务器中不是更好吗?这就是本项目的核心理念。
该项目旨在实现对请求路径的深度定制。这种定制通过注入称为"pipe"的Go包来处理请求。
目前项目还处于非常早期的阶段。接下来我将专注于文档、日志和指标等重要细节。
非常期待听到大家的意见和建议。
pipehub/pipehub
一个可编程代理服务器。通过在GitHub上创建账户来为pipehub/pipehub的开发做出贡献。
更多关于Golang可编程代理服务器 - PipeHub的使用与实现的实战教程也可以访问 https://www.itying.com/category-94-b0.html
diego.bernardes:
将所有逻辑整合到单一服务器中不是更好吗?
这难道不像 Caddy 服务器吗?
是的,它类似于 Caddy。这两个项目在运作方式上有所不同。Caddy 明确关注其配置文件,类似于 Nginx。而 PipeHub 则采用另一种方式,配置文件非常精简,所有处理都在 Go 代码中完成。
我已在 Reddit 上提到过这一点,为避免误解,在此重申一遍。我绝不是说 Caddy 比 PipeHub 差,它们只是有所不同。
当我开始使用GO编程时,我担心panic会导致整个系统崩溃,于是到处使用defer来捕获它们。
经过一段时间的休息后,今年二月我开始了一个新的GO项目,发现我编写的经过测试的代码并不需要这些defer……实际上,在读到您上次的回复之前,我已经忘记了这个问题。
我的想法是,如果您正在编写商业网络软件而不是一个漂亮的网站,那么您应该使用TCP而不是HTTP作为系统的基础。
现在看来,GO确实是目前可用的最佳产品
你说得完全正确。
然而这需要经过充分测试的代码,而缺乏高水平程序员的情况下很难做到这一点,目前这类人才供不应求。
大多数代码都是由那些正在学习所开发产品的人编写的,当他们意识到整个系统应该如何运作时,往往没有能力重新设计基础架构。经过多年在基础设计上不断添加功能,许多产品的设计都成了历史遗留问题的产物。
实际上,代码应该是自文档化的,只需要最少的注释。可以将其与 net/http 包的代码进行对比。
如今的计算机速度比当年将阿波罗送上月球的计算机快数百万倍,为什么绝大多数安装还需要负载均衡?也许是因为软件膨胀已经失控。
祝愿你的项目顺利推进,我将饶有兴趣地关注进展。
billc3012:
当我开始使用GO编程时,我担心panic会导致整个系统崩溃,于是开始到处使用defer来捕获它们。
休息一段时间后,今年二月我启动了一个新的GO项目,发现我编写的经过测试的代码并不需要这些defer…实际上在读到你的上一条回复之前,我已经忘记了这个问题。
是的,通常我在处理可能发生panic的goroutine时会使用recover。在PipeHub中,我们在动态代码周围设置了recover来捕获panic。
billc3012:
我的想法是,如果你正在编写商业网络软件而不是一个漂亮的网站,那么你应该使用TCP而不是HTTP作为系统的基础。
TCP支持已在计划中。我已经朝着这个方向做了修改。之前配置是这样写的:
host {
endpoint = "google"
origin = "https://www.google.com"
handler = "base.Default"
}
现在改为这样:
http "google" {
handler = "base.Default"
}
这样的改动使得这类配置成为可能:
tcp "127.0.0.1:80" {
handler = "base.Default"
}
您对软件包质量的看法是正确的,这本身就是该项目面临的最大挑战。
虽然不知道这个项目的未来会如何,但我们的目标是打造一个"可编程代理框架",并在此基础上添加经过充分测试的功能模块——理想情况下由社区创建——以满足HTTP服务器/代理/缓存等场景的需求:
- 速率限制
- 路由功能
- 负载均衡
- A/B测试
- 等等…
但目前仍然存在一个问题:当有人在goroutine中触发panic时,整个服务器就会崩溃。遗憾的是,并非所有方面都得到了改进。不过有些问题已经可以解决,以下是一段配置文件的示例:
host {
endpoint = "api1.com"
handler = "teama.Handler"
}
host {
endpoint = "api2.com"
handler = "teamb.Handler"
}
pipe "github.com/sample/teama" {
version = "v1.2.0"
alias = "teama"
}
pipe "github.com/sample/teamb" {
version = "v3.0.5"
alias = "teamb"
}
每个主机可以使用不同的管道来处理请求。因此,这实际上相当安全。如果出现问题,也只会影响特定的域名。
PipeHub 是一个很有前景的可编程代理服务器项目,它通过 Go 包(称为 “pipe”)来定制请求处理逻辑,从而整合负载均衡、API 网关、缓存和 TLS 终止等功能。以下是一个基本的使用示例,展示如何实现一个简单的 pipe 来处理 HTTP 请求。
首先,确保你已安装 Go(版本 1.16 或更高),然后通过 GitHub 克隆 PipeHub 仓库:
git clone https://github.com/pipehub/pipehub.git
cd pipehub
接下来,创建一个自定义 pipe 包。假设我们要实现一个简单的 pipe,它在每个请求中添加一个自定义头。在 PipeHub 项目中,pipe 通常作为 Go 模块实现。创建一个新目录 my-pipe,并初始化 Go 模块:
mkdir my-pipe
cd my-pipe
go mod init github.com/your-username/my-pipe
然后,创建一个 Go 文件(例如 main.go),实现 pipe 逻辑。PipeHub 要求 pipe 实现特定的接口(具体接口可能因项目版本而异,请参考官方文档)。以下是一个示例代码,假设 pipe 需要处理 HTTP 请求:
package main
import (
"context"
"net/http"
)
// Pipe 结构体实现 PipeHub 的 pipe 接口
type Pipe struct{}
// Init 方法用于初始化 pipe,可以处理配置等
func (p *Pipe) Init(ctx context.Context, config []byte) error {
// 这里可以解析配置,例如从 config 字节数组中加载设置
return nil
}
// Process 方法处理传入的 HTTP 请求
func (p *Pipe) Process(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
// 添加自定义头到响应
w.Header().Set("X-Custom-Pipe", "processed-by-my-pipe")
// 这里可以添加更多逻辑,如修改请求、记录日志或调用其他服务
// 注意:在实际使用中,可能需要调用下一个 pipe 或终止请求
return nil
}
// 导出 Pipe 实例,供 PipeHub 加载
var PipeInstance Pipe
在 PipeHub 的主配置文件中,你需要引用这个 pipe。创建一个配置文件(如 config.hcl),指定 pipe 的路径和处理规则。示例配置可能如下:
pipe "my-custom-pipe" {
path = "github.com/your-username/my-pipe"
config = "" # 可以传入配置数据,例如 JSON 字符串
}
server {
address = ":8080"
pipe = ["my-custom-pipe"]
}
运行 PipeHub 时,使用这个配置文件启动服务器:
pipehub -config config.hcl
现在,当 HTTP 请求发送到 :8080 时,PipeHub 会调用你的 pipe,为每个响应添加 X-Custom-Pipe 头。你可以扩展这个逻辑来实现更复杂的功能,如请求过滤、缓存或负载均衡。
PipeHub 还支持更高级的特性,如动态加载和管道链。例如,你可以组合多个 pipe 来处理请求:
pipe "auth-pipe" {
path = "github.com/example/auth-pipe"
}
pipe "cache-pipe" {
path = "github.com/example/cache-pipe"
}
server {
address = ":8080"
pipe = ["auth-pipe", "cache-pipe"] # 按顺序执行 pipe
}
在这个例子中,请求会先经过认证 pipe,再经过缓存 pipe。这展示了 PipeHub 如何将多个功能整合到单个服务器中,减少基础设施的复杂性。
总之,PipeHub 通过 Go 的模块化设计提供了高度可定制的代理解决方案。随着项目的发展,关注文档和社区反馈将有助于完善其功能。如果你有具体问题或需要调试,可以查看项目 GitHub 页面的 Issue 和示例。

