提交origin2.0版本

This commit is contained in:
duanhf2012
2020-03-28 09:57:16 +08:00
parent 0d98f77d07
commit 84fb8ab36d
111 changed files with 3657 additions and 8382 deletions

192
cluster/parsecfg.go Normal file
View File

@@ -0,0 +1,192 @@
package cluster
import (
"encoding/json"
"fmt"
"io/ioutil"
"strings"
)
func (slf *Cluster) ReadClusterConfig(filepath string) (*SubNet,error) {
c := &SubNet{}
d, err := ioutil.ReadFile(filepath)
if err != nil {
return nil, err
}
err = json.Unmarshal(d, c)
if err != nil {
return nil, err
}
return c,nil
}
func (slf *Cluster) ReadServiceConfig(filepath string) (map[string]interface{},error) {
c := map[string]interface{}{}
d, err := ioutil.ReadFile(filepath)
if err != nil {
return nil, err
}
err = json.Unmarshal(d, &c)
if err != nil {
return nil, err
}
return c,nil
}
func (slf *Cluster) ReadAllSubNetConfig() error {
clusterCfgPath :=strings.TrimRight(configdir,"/") +"/cluster"
fileInfoList,err := ioutil.ReadDir(clusterCfgPath)
if err != nil {
return err
}
slf.mapSubNetInfo =map[string] SubNet{}
for _,f := range fileInfoList{
if f.IsDir() == true {
subnetinfo,err:=slf.ReadClusterConfig(strings.TrimRight(strings.TrimRight(clusterCfgPath,"/"),"\\")+"/"+f.Name()+"/"+"cluster.json")
if err != nil {
return err
}
slf.mapSubNetInfo[f.Name()] = *subnetinfo
}
}
return nil
}
func (slf *Cluster) ReadLocalSubNetServiceConfig(subnet string) error {
clusterCfgPath :=strings.TrimRight(configdir,"/") +"/cluster"
fileInfoList,err := ioutil.ReadDir(clusterCfgPath)
if err != nil {
return err
}
slf.mapSubNetInfo =map[string] SubNet{}
for _,f := range fileInfoList{
if f.IsDir() == true && f.Name()==subnet{ //同一子网
localNodeServiceCfg,err:=slf.ReadServiceConfig(strings.TrimRight(strings.TrimRight(clusterCfgPath,"/"),"\\")+"/"+f.Name()+"/"+"service.json")
if err != nil {
return err
}
slf.localNodeServiceCfg =localNodeServiceCfg
}
}
return nil
}
func (slf *Cluster) InitCfg(currentNodeId int) error{
//mapSubNetInfo := map[string] SubNet{} //子网名称,子网信息
mapSubNetNodeInfo := map[string]map[int]NodeInfo{} //map[子网名称]map[NodeId]NodeInfo
localSubNetMapNode := map[int]NodeInfo{} //本子网内 map[NodeId]NodeInfo
localSubNetMapService := map[string][]NodeInfo{} //本子网内所有ServiceName对应的结点列表
localNodeMapService := map[string]interface{}{} //本Node支持的服务
localNodeInfo := NodeInfo{}
err := slf.ReadAllSubNetConfig()
//分析配置
var localSubnetName string
for subnetName,subnetInfo := range slf.mapSubNetInfo {
for _,nodeinfo := range subnetInfo.NodeList {
//装载slf.mapNodeInfo
_,ok := mapSubNetNodeInfo[subnetName]
if ok == false {
mapnodeInfo := make(map[int]NodeInfo,1)
mapnodeInfo[nodeinfo.NodeId] = nodeinfo
mapSubNetNodeInfo[subnetName] = mapnodeInfo
}else{
mapSubNetNodeInfo[subnetName][nodeinfo.NodeId] = nodeinfo
}
//判断本进程的子网
if nodeinfo.NodeId == currentNodeId {
localSubnetName = subnetName
}
}
}
//装载
subnet,ok := slf.mapSubNetInfo[localSubnetName]
if ok == false {
return fmt.Errorf("NodeId %d not in any subnet",currentNodeId)
}
for _,nodeinfo := range subnet.NodeList {
localSubNetMapNode[nodeinfo.NodeId] = nodeinfo
//装载本Node进程所有的服务
if nodeinfo.NodeId == currentNodeId {
for _,s := range nodeinfo.ServiceList {
servicename := s
if strings.Index(s,"_") == 0 {
servicename = s[1:]
}
localNodeMapService[servicename] = nil
}
localNodeInfo = nodeinfo
}
for _,s := range nodeinfo.ServiceList {
//以_打头的表示只在本机进程不对整个子网开发
if strings.Index(s,"_") == 0 {
continue
}
if _,ok := localSubNetMapService[s];ok== true{
localSubNetMapService[s] = []NodeInfo{}
}
localSubNetMapService[s] = append(localSubNetMapService[s],nodeinfo)
}
}
if localNodeInfo.NodeId == 0 {
return fmt.Errorf("Canoot find NodeId %d not in any config file.",currentNodeId)
}
slf.mapSubNetNodeInfo=mapSubNetNodeInfo
slf.localSubNetMapNode=localSubNetMapNode
slf.localSubNetMapService = localSubNetMapService
slf.localNodeMapService = localNodeMapService
slf.localsubnet = subnet
slf.localNodeInfo =localNodeInfo
//读取服务
return err
}
func (slf *Cluster) IsConfigService(servicename string) bool {
_,ok := slf.localNodeMapService[servicename]
return ok
}
func (slf *Cluster) GetNodeIdByService(servicename string) []int{
var nodelist []int
nodeInfoList,ok := slf.localSubNetMapService[servicename]
if ok == true {
for _,node := range nodeInfoList {
nodelist = append(nodelist,node.NodeId)
}
}
return nodelist
}
func (slf *Cluster) GetServiceCfg(servicename string) interface{}{
v,ok := slf.localNodeServiceCfg[servicename]
if ok == false{
return nil
}
return v
}