mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-15 00:04:46 +08:00
新增rpc nats模块
This commit is contained in:
@@ -52,19 +52,21 @@ type Cluster struct {
|
||||
localNodeInfo NodeInfo //本结点配置信息
|
||||
|
||||
discoveryInfo DiscoveryInfo //服务发现配置
|
||||
rpcMode RpcMode
|
||||
//masterDiscoveryNodeList []NodeInfo //配置发现Master结点
|
||||
globalCfg interface{} //全局配置
|
||||
|
||||
localServiceCfg map[string]interface{} //map[serviceName]配置数据*
|
||||
serviceDiscovery IServiceDiscovery //服务发现接口
|
||||
|
||||
|
||||
locker sync.RWMutex //结点与服务关系保护锁
|
||||
mapRpc map[string]*NodeRpcInfo //nodeId
|
||||
//mapIdNode map[int]NodeInfo //map[NodeId]NodeInfo
|
||||
mapServiceNode map[string]map[string]struct{} //map[serviceName]map[NodeId]
|
||||
|
||||
rpcServer rpc.Server
|
||||
callSet rpc.CallSet
|
||||
rpcNats rpc.RpcNats
|
||||
rpcServer rpc.IServer
|
||||
|
||||
rpcEventLocker sync.RWMutex //Rpc事件监听保护锁
|
||||
mapServiceListenRpcEvent map[string]struct{} //ServiceName
|
||||
mapServiceListenDiscoveryEvent map[string]struct{} //ServiceName
|
||||
@@ -82,11 +84,12 @@ func SetServiceDiscovery(serviceDiscovery IServiceDiscovery) {
|
||||
cluster.serviceDiscovery = serviceDiscovery
|
||||
}
|
||||
|
||||
func (cls *Cluster) Start() {
|
||||
cls.rpcServer.Start(cls.localNodeInfo.ListenAddr, cls.localNodeInfo.MaxRpcParamLen,cls.localNodeInfo.CompressBytesLen)
|
||||
func (cls *Cluster) Start() error{
|
||||
return cls.rpcServer.Start()
|
||||
}
|
||||
|
||||
func (cls *Cluster) Stop() {
|
||||
cls.rpcServer.Stop()
|
||||
}
|
||||
|
||||
func (cls *Cluster) DiscardNode(nodeId string) {
|
||||
@@ -191,7 +194,12 @@ func (cls *Cluster) serviceDiscoverySetNodeInfo(nodeInfo *NodeInfo) {
|
||||
//不存在时,则建立连接
|
||||
rpcInfo := NodeRpcInfo{}
|
||||
rpcInfo.nodeInfo = *nodeInfo
|
||||
rpcInfo.client =rpc.NewRClient(nodeInfo.NodeId, nodeInfo.ListenAddr, nodeInfo.MaxRpcParamLen,cls.localNodeInfo.CompressBytesLen,cls.triggerRpcEvent)
|
||||
|
||||
if cls.IsNatsMode() {
|
||||
rpcInfo.client = cls.rpcNats.NewNatsClient(nodeInfo.NodeId, cls.GetLocalNodeInfo().NodeId,&cls.callSet)
|
||||
}else{
|
||||
rpcInfo.client =rpc.NewRClient(nodeInfo.NodeId, nodeInfo.ListenAddr, nodeInfo.MaxRpcParamLen,cls.localNodeInfo.CompressBytesLen,cls.triggerRpcEvent,&cls.callSet)
|
||||
}
|
||||
cls.mapRpc[nodeInfo.NodeId] = &rpcInfo
|
||||
log.Info("Discovery nodeId and new rpc client",log.String("NodeId", nodeInfo.NodeId),log.Any("services:", nodeInfo.PublicServiceList),log.Bool("Retire",nodeInfo.Retire),log.String("nodeListenAddr",nodeInfo.ListenAddr))
|
||||
}
|
||||
@@ -204,7 +212,15 @@ func (cls *Cluster) Init(localNodeId string, setupServiceFun SetupServiceFun) er
|
||||
return err
|
||||
}
|
||||
|
||||
cls.rpcServer.Init(cls)
|
||||
cls.callSet.Init()
|
||||
if cls.IsNatsMode() {
|
||||
cls.rpcNats.Init(cls.rpcMode.Nats.NatsUrl,cls.rpcMode.Nats.NoRandomize,cls.GetLocalNodeInfo().NodeId,cls.localNodeInfo.CompressBytesLen,cls)
|
||||
cls.rpcServer = &cls.rpcNats
|
||||
}else{
|
||||
s := &rpc.Server{}
|
||||
s.Init(cls.localNodeInfo.ListenAddr,cls.localNodeInfo.MaxRpcParamLen,cls.localNodeInfo.CompressBytesLen,cls)
|
||||
cls.rpcServer = s
|
||||
}
|
||||
|
||||
//2.安装服务发现结点
|
||||
err = cls.setupDiscovery(localNodeId, setupServiceFun)
|
||||
@@ -225,7 +241,6 @@ func (cls *Cluster) Init(localNodeId string, setupServiceFun SetupServiceFun) er
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
func (cls *Cluster) FindRpcHandler(serviceName string) rpc.IRpcHandler {
|
||||
pService := service.GetService(serviceName)
|
||||
if pService == nil {
|
||||
@@ -276,8 +291,8 @@ func GetRpcClient(nodeId string, serviceMethod string,filterRetire bool, clientL
|
||||
return GetCluster().GetNodeIdByService(serviceName, clientList, filterRetire)
|
||||
}
|
||||
|
||||
func GetRpcServer() *rpc.Server {
|
||||
return &cluster.rpcServer
|
||||
func GetRpcServer() rpc.IServer {
|
||||
return cluster.rpcServer
|
||||
}
|
||||
|
||||
func (cls *Cluster) IsNodeConnected(nodeId string) bool {
|
||||
|
||||
@@ -15,7 +15,7 @@ func (discovery *ConfigDiscovery) InitDiscovery(localNodeId string,funDelNode Fu
|
||||
discovery.funSetNode = funSetNode
|
||||
|
||||
//解析本地其他服务配置
|
||||
_,nodeInfoList,err := GetCluster().readLocalClusterConfig(rpc.NodeIdNull)
|
||||
_,nodeInfoList,_,err := GetCluster().readLocalClusterConfig(rpc.NodeIdNull)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -318,7 +318,6 @@ func (dc *OriginDiscoveryClient) addDiscoveryMaster() {
|
||||
continue
|
||||
}
|
||||
dc.funSetNode(&discoveryNodeList.MasterNodeList[i])
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,6 +555,10 @@ func (cls *Cluster) IsOriginMasterDiscoveryNode(nodeId string) bool {
|
||||
}
|
||||
|
||||
func (cls *Cluster) getOriginMasterDiscoveryNodeInfo(nodeId string) *NodeInfo {
|
||||
if cls.discoveryInfo.Origin == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
for i := 0; i < len(cls.discoveryInfo.Origin.MasterNodeList); i++ {
|
||||
if cls.discoveryInfo.Origin.MasterNodeList[i].NodeId == nodeId {
|
||||
return &cls.discoveryInfo.Origin.MasterNodeList[i]
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
"errors"
|
||||
)
|
||||
|
||||
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||
@@ -44,7 +45,19 @@ type DiscoveryInfo struct {
|
||||
Origin *OriginDiscovery //orign
|
||||
}
|
||||
|
||||
type NatsConfig struct {
|
||||
NatsUrl string
|
||||
NoRandomize bool
|
||||
}
|
||||
|
||||
type RpcMode struct {
|
||||
Typ string `json:"Type"`
|
||||
Nats NatsConfig
|
||||
|
||||
}
|
||||
|
||||
type NodeInfoList struct {
|
||||
RpcMode RpcMode
|
||||
Discovery DiscoveryInfo
|
||||
NodeList []NodeInfo
|
||||
}
|
||||
@@ -183,14 +196,41 @@ func (cls *Cluster) readServiceConfig(filepath string) (interface{}, map[string]
|
||||
return GlobalCfg, serviceConfig, mapNodeService, nil
|
||||
}
|
||||
|
||||
func (cls *Cluster) readLocalClusterConfig(nodeId string) (DiscoveryInfo, []NodeInfo, error) {
|
||||
func (cls *Cluster) SetRpcMode(cfgRpcMode *RpcMode,rpcMode *RpcMode) error {
|
||||
//忽略掉没有设置的配置
|
||||
if cfgRpcMode.Typ == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
//不允许重复的配置Rpc模式
|
||||
|
||||
if cfgRpcMode.Typ != "" && rpcMode.Typ != ""{
|
||||
return errors.New("repeat config RpcMode")
|
||||
}
|
||||
|
||||
//检查Typ是否合法
|
||||
if cfgRpcMode.Typ!="Nats" && cfgRpcMode.Typ!="Default" {
|
||||
return fmt.Errorf("RpcMode %s is not support", rpcMode.Typ)
|
||||
}
|
||||
|
||||
if cfgRpcMode.Typ == "Nats" && len(cfgRpcMode.Nats.NatsUrl)==0 {
|
||||
return fmt.Errorf("nats rpc mode config NatsUrl is empty")
|
||||
}
|
||||
|
||||
*rpcMode = *cfgRpcMode
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cls *Cluster) readLocalClusterConfig(nodeId string) (DiscoveryInfo, []NodeInfo,RpcMode, error) {
|
||||
var nodeInfoList []NodeInfo
|
||||
var discoveryInfo DiscoveryInfo
|
||||
var rpcMode RpcMode
|
||||
|
||||
clusterCfgPath := strings.TrimRight(configDir, "/") + "/cluster"
|
||||
fileInfoList, err := os.ReadDir(clusterCfgPath)
|
||||
if err != nil {
|
||||
return discoveryInfo, nil, fmt.Errorf("Read dir %s is fail :%+v", clusterCfgPath, err)
|
||||
return discoveryInfo, nil,rpcMode, fmt.Errorf("Read dir %s is fail :%+v", clusterCfgPath, err)
|
||||
}
|
||||
|
||||
//读取任何文件,只读符合格式的配置,目录下的文件可以自定义分文件
|
||||
@@ -200,12 +240,17 @@ func (cls *Cluster) readLocalClusterConfig(nodeId string) (DiscoveryInfo, []Node
|
||||
fileNodeInfoList, rerr := cls.ReadClusterConfig(filePath)
|
||||
|
||||
if rerr != nil {
|
||||
return discoveryInfo, nil, fmt.Errorf("read file path %s is error:%+v", filePath, rerr)
|
||||
return discoveryInfo, nil,rpcMode, fmt.Errorf("read file path %s is error:%+v", filePath, rerr)
|
||||
}
|
||||
|
||||
err = cls.SetRpcMode(&fileNodeInfoList.RpcMode,&rpcMode)
|
||||
if err != nil {
|
||||
return discoveryInfo, nil,rpcMode, err
|
||||
}
|
||||
|
||||
err = discoveryInfo.setDiscovery(&fileNodeInfoList.Discovery)
|
||||
if err != nil {
|
||||
return discoveryInfo,nil,err
|
||||
return discoveryInfo,nil,rpcMode,err
|
||||
}
|
||||
|
||||
for _, nodeInfo := range fileNodeInfoList.NodeList {
|
||||
@@ -217,7 +262,7 @@ func (cls *Cluster) readLocalClusterConfig(nodeId string) (DiscoveryInfo, []Node
|
||||
}
|
||||
|
||||
if nodeId != rpc.NodeIdNull && (len(nodeInfoList) != 1) {
|
||||
return discoveryInfo, nil, fmt.Errorf("%d configurations were found for the configuration with node ID %d!", len(nodeInfoList), nodeId)
|
||||
return discoveryInfo, nil,rpcMode, fmt.Errorf("%d configurations were found for the configuration with node ID %d!", len(nodeInfoList), nodeId)
|
||||
}
|
||||
|
||||
for i, _ := range nodeInfoList {
|
||||
@@ -231,7 +276,7 @@ func (cls *Cluster) readLocalClusterConfig(nodeId string) (DiscoveryInfo, []Node
|
||||
}
|
||||
}
|
||||
|
||||
return discoveryInfo, nodeInfoList, nil
|
||||
return discoveryInfo, nodeInfoList, rpcMode,nil
|
||||
}
|
||||
|
||||
func (cls *Cluster) readLocalService(localNodeId string) error {
|
||||
@@ -325,7 +370,7 @@ func (cls *Cluster) readLocalService(localNodeId string) error {
|
||||
func (cls *Cluster) parseLocalCfg() {
|
||||
rpcInfo := NodeRpcInfo{}
|
||||
rpcInfo.nodeInfo = cls.localNodeInfo
|
||||
rpcInfo.client = rpc.NewLClient(rpcInfo.nodeInfo.NodeId)
|
||||
rpcInfo.client = rpc.NewLClient(rpcInfo.nodeInfo.NodeId,&cls.callSet)
|
||||
|
||||
cls.mapRpc[cls.localNodeInfo.NodeId] = &rpcInfo
|
||||
|
||||
@@ -338,18 +383,27 @@ func (cls *Cluster) parseLocalCfg() {
|
||||
}
|
||||
}
|
||||
|
||||
func (cls *Cluster) IsNatsMode() bool {
|
||||
return cls.rpcMode.Typ == "Nats"
|
||||
}
|
||||
|
||||
func (cls *Cluster) GetNatsUrl() string {
|
||||
return cls.rpcMode.Nats.NatsUrl
|
||||
}
|
||||
|
||||
func (cls *Cluster) InitCfg(localNodeId string) error {
|
||||
cls.localServiceCfg = map[string]interface{}{}
|
||||
cls.mapRpc = map[string]*NodeRpcInfo{}
|
||||
cls.mapServiceNode = map[string]map[string]struct{}{}
|
||||
|
||||
//加载本地结点的NodeList配置
|
||||
discoveryInfo, nodeInfoList, err := cls.readLocalClusterConfig(localNodeId)
|
||||
discoveryInfo, nodeInfoList,rpcMode, err := cls.readLocalClusterConfig(localNodeId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
cls.localNodeInfo = nodeInfoList[0]
|
||||
cls.discoveryInfo = discoveryInfo
|
||||
cls.rpcMode = rpcMode
|
||||
|
||||
//读取本地服务配置
|
||||
err = cls.readLocalService(localNodeId)
|
||||
|
||||
Reference in New Issue
Block a user