glogcenter/glc/www/controller/cluster_node_controller.go
2022-11-06 15:34:55 +08:00

130 lines
3.5 KiB
Go

package controller
import (
"glc/com"
"glc/conf"
"glc/gweb"
"glc/www/cluster"
"glc/www/service"
"io"
"net/http"
"strings"
"github.com/gotoeasy/glang/cmn"
)
// 从本节点取集群信息
func ClusterGetClusterInfoController(req *gweb.HttpRequest) *gweb.HttpResult {
if conf.IsEnableSecurityKey() && req.GetHeader(conf.GetHeaderSecurityKey()) != conf.GetSecurityKey() {
return gweb.Error(403, "未经授权的访问,拒绝服务")
}
kv, err := service.GetSysmntItem(cluster.KEY_CLUSTER)
if kv == nil || err != nil {
return gweb.Error500("没找到集群信息 " + err.Error())
}
return gweb.Result(kv.ToJson())
}
// 作为Master接收保存集群信息
func ClusterMasterSaveKvDataController(req *gweb.HttpRequest) *gweb.HttpResult {
if conf.IsEnableSecurityKey() && req.GetHeader(conf.GetHeaderSecurityKey()) != conf.GetSecurityKey() {
return gweb.Error(403, "未经授权的访问,拒绝服务")
}
// 参数
pkv := &service.KeyValue{}
err := req.BindJSON(pkv)
if err != nil || pkv.Key == "" {
cmn.Error("请求参数有误", err)
return gweb.Error500(err.Error())
}
// 保存
dkv, err := service.SetSysmntItem(pkv)
if err != nil {
cmn.Error(err)
return gweb.Error500(err.Error())
}
// 转发
cl := &cluster.ClusterInfo{}
cl.LoadJson(dkv.Value)
urls := cmn.Split(cl.NodeUrls, ";")
jsonstr := dkv.ToJson()
for i := 0; i < len(urls); i++ {
if urls[i] != com.GetLocalGlcUrl() {
go httpClusterAsyncData(urls[i], jsonstr) // 异步转发其他节点保存,暂且忽略失败
}
}
return gweb.Result(dkv.ToJson())
}
// 接收其他节点发来的同步信息
func ClusterMasterAsyncDataController(req *gweb.HttpRequest) *gweb.HttpResult {
cmn.Info("接收其他节点发来的同步信息")
if conf.IsEnableSecurityKey() && req.GetHeader(conf.GetHeaderSecurityKey()) != conf.GetSecurityKey() {
cmn.Info("接收其他节点发来的同步信息", 403, "未经授权的访问")
return gweb.Error(403, "未经授权的访问,拒绝服务")
}
pkv := &service.KeyValue{}
err := req.BindJSON(pkv)
if err != nil || pkv.Key == "" {
cmn.Error("接收其他节点发来的同步信息", "请求参数有误", err)
return gweb.Error500("请求参数有误" + err.Error())
}
dkv, err := service.SetSysmntItem(pkv)
if err != nil {
cmn.Error("接收其他节点发来的同步信息", "保存失败", err)
} else {
cmn.Info("接收其他节点发来的同步信息", dkv.ToJson())
}
return gweb.Result(dkv.ToJson())
}
func httpClusterAsyncData(serverUrl string, kvJson string) *service.KeyValue {
// 请求
req, err := http.NewRequest("POST", serverUrl+conf.GetContextPath()+"/sys/cluster/async", strings.NewReader(kvJson))
if err != nil {
cmn.Error("异步发送集群信息到", serverUrl, "失败1", err)
return nil
}
// 请求头
req.Header.Set("Content-Type", "application/json;charset=UTF-8")
req.Header.Set(conf.GetHeaderSecurityKey(), conf.GetSecurityKey())
// 读取响应内容
client := http.Client{}
res, err := client.Do(req)
if err != nil {
cmn.Error("异步发送集群信息到", serverUrl, "失败2", err)
return nil
}
defer res.Body.Close()
by, err := io.ReadAll(res.Body)
if err != nil {
cmn.Error("异步发送集群信息到", serverUrl, "失败3", err)
return nil
}
rs := &gweb.HttpResult{}
rs.LoadBytes(by)
if !rs.Success {
cmn.Error("异步发送集群信息到", serverUrl, "失败4", rs.Message)
return nil
}
cmn.Info("异步发送集群信息到", serverUrl, "成功")
kv := &service.KeyValue{}
kv.LoadJson(rs.Result.(string))
return kv
}