这个Go语言包提供了一个简洁优雅的方式来将服务注册到Apache APISIX中,不需要额外的注册发现服务,同时包含健康检查。
go get github.com/linabellbiu/apisix-registration
以下是基本用法示例:
package main
import (
"log"
"os"
apisix "github.com/linabellbiu/apisix-registration"
)
func main() {
// 创建服务配置
cfg := apisix.Config{
Enabled: true,
Name: "your-service",
Host: "localhost", // 服务主机名
Port: 8080, // 服务端口
Upstream: apisix.Upstream{
Id: "custom-upstream-id", // 自定义上游ID(可选)
},
AdminApi: "http://apisix-admin:9180/apisix/admin", // APISIX Admin API 地址
ApiKey: os.Getenv("APISIX_API_KEY"), // APISIX Admin API 密钥
HealthCfg: apisix.HealthCheckConfig{
Enabled: true, // 启用健康检查
Path: "/health", // 健康检查路由
},
}
// 创建服务实例
service, err := apisix.New(cfg)
if err != nil {
log.Fatalf("创建服务失败: %v", err)
}
// 启动服务并处理优雅关闭
if err := service.Start(); err != nil {
log.Fatalf("服务启动失败: %v", err)
}
}
当服务注册到APISIX时,包会执行以下操作:
-
检查上游ID是否存在
- 如果不存在,创建新的上游
- 如果已存在,将当前服务节点添加到现有上游
-
当服务注销时:
- 只删除特定的服务节点,而非整个上游
这种设计允许同一上游ID注册多个不同节点,从而支持负载均衡和高可用性。
健康检查功能只有在配置中设置 HealthCfg.Enabled: true
时才会启用。启用健康检查时,包会:
- 在服务的端口上提供一个健康检查路由(默认为
/health
) - 返回包含服务状态的JSON响应
您可以选择将健康检查集成到您已有的HTTP服务器中,而不是让包创建新的服务器。有多种方式可以实现这一点:
// 创建自己的HTTP服务器
myServer := &http.Server{
Addr: ":8080",
Handler: myHandler,
}
// 在配置中传入
cfg := apisix.Config{
Enabled: true,
// ...其他配置...
HealthCfg: apisix.HealthCheckConfig{
Enabled: true,
Route: "/api/health", // 自定义健康检查路径
},
}
service, err := apisix.New(cfg,apisix.OptionsWithHttpServer(myServer))
我们提供了通用接口HealthHandler
,可以适配任何HTTP框架:
// 定义一个自定义的健康检查处理器
customHandler := &apisix.HealthHandler{
RegisterHealthCheck: func(path string, handler http.HandlerFunc) error {
// 在您的框架中注册健康检查路由
// 例如: router.GET(path, handler)
return nil
},
}
// 在配置中传入
cfg := apisix.Config{
// ...其他配置...
HealthHandler: customHandler,
}
内置支持Gin框架:
// 创建Gin引擎
engine := gin.Default()
// 创建Gin适配器
ginHandler := &apisix.GinHealthHandler{
Engine: engine,
}
// 在配置中传入
cfg := apisix.Config{
// ...其他配置...
}
service, err := apisix.New(cfg,apisix.OptionsWithHealthHandler(engine))
内置支持go-zero框架:
// 创建go-zero服务器
server := rest.MustNewServer(c.RestConf)
// 创建go-zero适配器
goZeroHandler := &apisix.GoZeroHealthHandler{
RegisterRoute: func(path string, handler http.HandlerFunc) error {
// 注册健康检查路由
server.AddRoute([]rest.Route{
{
Method: http.MethodGet,
Path: path,
Handler: handler,
},
})
return nil
},
}
// 在配置中传入
cfg := apisix.Config{
// ...其他配置...
}
service, err := apisix.New(cfg,apisix.OptionsWithHealthHandler(goZeroHandler))
// 创建服务实例
service, _ := apisix.New(cfg)
// 设置自定义健康检查处理器
service.SetHealthHandler(myHandler, "/custom/health")
// 或使用标准HTTP服务器(向后兼容)
service.SetHTTPServer(myServer, "/custom/health")
// 启动健康检查
service.StartHealthCheck()
使用自定义HTTP服务器时,包会在您的处理器逻辑中添加健康检查路由,而不会创建新的HTTP服务器。
如果您希望手动控制注册和注销过程:
service, err := apisix.New(cfg)
// 注册服务(包含检查上游是否存在的逻辑)
err := service.Register()
// 启动健康检查
err := service.StartHealthCheck()
// 注销服务(只删除特定节点,不删除整个上游)
err := service.Deregister()
服务会监听 SIGINT 和 SIGTERM 信号,当接收到这些信号时:
- 从APISIX中注销服务(只删除特定节点)
- 关闭健康检查服务
- 完成所有清理工作
开启apisix.HealthCheckConfig.Enabled=true
代码健康检查路由后,还要在apisix开启主动检查
功能然后重启apisix服务,才能生效