feat(report): implement module registration and gateway mode handling
This commit is contained in:
parent
a9c98b67f1
commit
eb25095623
@ -5,6 +5,9 @@ import (
|
||||
"net"
|
||||
"os"
|
||||
|
||||
"github.com/go-resty/resty/v2"
|
||||
"github.com/perfect-panel/server/pkg/constant"
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@ -43,9 +46,64 @@ func GatewayPort() (int, error) {
|
||||
var port int
|
||||
_, err := fmt.Sscanf(value, "%d", &port)
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to parse GATEWAY_PORT: %v Value %s", err.Error(), value)
|
||||
panic(err)
|
||||
}
|
||||
return port, nil
|
||||
}
|
||||
return 0, errors.New("could not determine gateway port")
|
||||
}
|
||||
|
||||
// RegisterModule registers a module with the gateway.
|
||||
func RegisterModule(port int) error {
|
||||
// 从环境变量中读取网关模块端口
|
||||
gatewayPort, err := GatewayPort()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 从环境变量中获取通讯密钥
|
||||
value, exists := os.LookupEnv("SECRET_KEY")
|
||||
if !exists {
|
||||
panic("could not determine secret key")
|
||||
}
|
||||
|
||||
var response RegisterResponse
|
||||
|
||||
client := resty.New().SetBaseURL(fmt.Sprintf("http://127.0.0.1:%d", gatewayPort))
|
||||
result, err := client.R().SetHeader("Content-Type", "application/json").SetBody(RegisterServiceRequest{
|
||||
Secret: value,
|
||||
ProxyPath: "/api",
|
||||
ServiceURL: fmt.Sprintf("http://127.0.0.1:%d", port),
|
||||
Repository: "https://github.com/perfect-panel/server",
|
||||
ServiceName: "ApiService",
|
||||
ServiceVersion: constant.Version,
|
||||
}).SetResult(&response).Post(RegisterAPI)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if result.IsError() {
|
||||
return errors.New("failed to register module: " + result.Status())
|
||||
}
|
||||
|
||||
if !response.Success {
|
||||
return errors.New("failed to register module: " + response.Message)
|
||||
}
|
||||
logger.Infof("Module registered successfully: %s", response.Message)
|
||||
return nil
|
||||
}
|
||||
|
||||
// IsGatewayMode checks if the application is running in gateway mode.
|
||||
// It returns true if GATEWAY_MODE is set to "true" and GATEWAY_PORT is valid.
|
||||
func IsGatewayMode() bool {
|
||||
value, exists := os.LookupEnv("GATEWAY_MODE")
|
||||
if exists && value == "true" {
|
||||
if _, err := GatewayPort(); err == nil {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
16
internal/report/types.go
Normal file
16
internal/report/types.go
Normal file
@ -0,0 +1,16 @@
|
||||
package report
|
||||
|
||||
// RegisterServiceResponse 模块注册请求参数
|
||||
type RegisterServiceResponse struct {
|
||||
Success bool `json:"success"` // 注册是否成功
|
||||
Message string `json:"message"` // 返回信息
|
||||
}
|
||||
|
||||
type RegisterServiceRequest struct {
|
||||
Secret string `json:"secret"` // 通讯密钥
|
||||
ProxyPath string `json:"proxy_path"` // 代理路径
|
||||
ServiceURL string `json:"service_url"` // 服务地址
|
||||
Repository string `json:"repository"` // 服务代码仓库
|
||||
ServiceName string `json:"service_name"` // 服务名称
|
||||
ServiceVersion string `json:"service_version"` // 服务版本
|
||||
}
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/server/internal/report"
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
|
||||
"github.com/perfect-panel/server/pkg/proc"
|
||||
@ -65,9 +66,32 @@ func (m *Service) Start() {
|
||||
if m.svc == nil {
|
||||
panic("config file path is nil")
|
||||
}
|
||||
|
||||
// init service
|
||||
r := initServer(m.svc)
|
||||
serverAddr := fmt.Sprintf("%v:%d", m.svc.Config.Host, m.svc.Config.Port)
|
||||
// get server port
|
||||
port := m.svc.Config.Port
|
||||
host := m.svc.Config.Host
|
||||
// check gateway mode
|
||||
if report.IsGatewayMode() {
|
||||
// get free port
|
||||
freePort, err := report.ModulePort()
|
||||
if err != nil {
|
||||
logger.Errorf("get module port error: %s", err.Error())
|
||||
panic(err)
|
||||
}
|
||||
port = freePort
|
||||
host = "127.0.0.1"
|
||||
// register module
|
||||
err = report.RegisterModule(port)
|
||||
if err != nil {
|
||||
logger.Errorf("register module error: %s", err.Error())
|
||||
panic(err)
|
||||
}
|
||||
logger.Infof("module registered on port %d", port)
|
||||
}
|
||||
|
||||
serverAddr := fmt.Sprintf("%v:%d", host, port)
|
||||
m.server = &http.Server{
|
||||
Addr: serverAddr,
|
||||
Handler: r,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user