Documentation
¶
Overview ¶
Package cherryDiscovery provides cluster node discovery for the Cherry framework.
It supports multiple discovery backends via the IDiscovery interface:
- "default" mode: reads node topology from the profile config file (dev/test use)
- "nats" mode: master-based discovery over NATS messaging
- "etcd" mode: distributed discovery via etcd (maintained in a separate repository)
Custom backends can be registered via Register() and selected via the "cluster.discovery.mode" property in the profile configuration file.
Index ¶
- Constants
- func GetDiscovery(mode string) (cfacade.IDiscoveryComponent, error)
- func GetMode() (string, error)
- func New() cfacade.IDiscoveryComponent
- func NewMemberWithApp(app cfacade.IApplication) *cproto.Member
- func Register(component cfacade.IDiscoveryComponent)
- type ComponentDefault
- func (n *ComponentDefault) AddMember(member cfacade.IMember)
- func (n *ComponentDefault) GetMember(nodeID string) (cfacade.IMember, bool)
- func (n *ComponentDefault) GetType(nodeID string) (nodeType string, err error)
- func (n *ComponentDefault) Init()
- func (n *ComponentDefault) ListByType(nodeType string, filterNodeID ...string) []cfacade.IMember
- func (n *ComponentDefault) Map() map[string]cfacade.IMember
- func (n *ComponentDefault) Mode() string
- func (*ComponentDefault) Name() string
- func (n *ComponentDefault) OnAddMember(listener cfacade.MemberListener)
- func (n *ComponentDefault) OnRemoveMember(listener cfacade.MemberListener)
- func (n *ComponentDefault) OnUpdateMember(listener cfacade.MemberListener)
- func (n *ComponentDefault) Random(nodeType string) (cfacade.IMember, bool)
- func (n *ComponentDefault) RemoveMember(nodeID string)
- func (n *ComponentDefault) UpdateMember(member *cproto.Member)
- func (n *ComponentDefault) UpdateSetting(key, value string)
- func (n *ComponentDefault) UpdateSettings(settings map[string]string)
- type ComponentMaster
- func (m *ComponentMaster) Init()
- func (m *ComponentMaster) Mode() string
- func (m *ComponentMaster) NodeID2Bytes(nodeID string) ([]byte, error)
- func (m *ComponentMaster) Stop()
- func (m *ComponentMaster) UpdateSetting(key, value string)
- func (m *ComponentMaster) UpdateSettings(setting map[string]string)
Constants ¶
const ( ConfigKeyNode = "node" ConfigKeyNodeID = "node_id" ConfigKeyRPCAddress = "rpc_address" ConfigKeySettings = "__settings__" )
Config keys used to parse node information from the profile file.
Variables ¶
This section is empty.
Functions ¶
func GetDiscovery ¶ added in v1.5.0
func GetDiscovery(mode string) (cfacade.IDiscoveryComponent, error)
GetDiscovery looks up a registered discovery component by mode name.
func GetMode ¶ added in v1.5.0
GetMode reads the discovery mode from the profile configuration. The config path is "cluster.discovery.mode".
func New ¶ added in v1.3.0
func New() cfacade.IDiscoveryComponent
New creates a discovery component based on the profile configuration. It reads the mode from "cluster.discovery.mode" and instantiates the corresponding registered component. Panics via log.Fatal on missing config or unknown mode.
func NewMemberWithApp ¶ added in v1.5.0
func NewMemberWithApp(app cfacade.IApplication) *cproto.Member
NewMemberWithApp creates a *cproto.Member populated from the application's node identity. HeartbeatTimeout is read from the "cluster_heartbeat_timeout" setting (default 3s).
func Register ¶ added in v1.3.0
func Register(component cfacade.IDiscoveryComponent)
Register adds a discovery component implementation to the registry. Panics via log.Fatal if component is nil or its Mode() returns empty.
Types ¶
type ComponentDefault ¶ added in v1.5.0
ComponentDefault is a file-based discovery implementation for development/testing. It reads node information directly from the profile configuration file (profile.json->node).
Fields:
- memberMap: stores all known cluster members keyed by nodeID (sync.Map for concurrent access)
- onAddListener: callbacks invoked when a new member is added via AddMember()
- onUpdateListener: callbacks invoked when an existing member is updated via UpdateMember()
- onRemoveListener: callbacks invoked when a member is removed via RemoveMember()
This implementation is designed as a composable base: other backends (nats, etcd) embed ComponentDefault to reuse the member storage and listener notification logic.
func (*ComponentDefault) AddMember ¶ added in v1.5.0
func (n *ComponentDefault) AddMember(member cfacade.IMember)
AddMember inserts a member into the local member table. If the member already exists, logs a debug message but still notifies add listeners. Otherwise stores the new member and notifies all onAddListener callbacks.
func (*ComponentDefault) GetMember ¶ added in v1.5.0
func (n *ComponentDefault) GetMember(nodeID string) (cfacade.IMember, bool)
GetMember looks up a member by nodeID. Returns nil, false if not found or nodeID is empty.
func (*ComponentDefault) GetType ¶ added in v1.5.0
func (n *ComponentDefault) GetType(nodeID string) (nodeType string, err error)
GetType returns the node type for the given nodeID.
func (*ComponentDefault) Init ¶ added in v1.5.0
func (n *ComponentDefault) Init()
Init loads node configuration from the profile file. sync.Map is usable in its zero value, no explicit initialization needed.
func (*ComponentDefault) ListByType ¶ added in v1.5.0
func (n *ComponentDefault) ListByType(nodeType string, filterNodeID ...string) []cfacade.IMember
ListByType returns members of the given nodeType, excluding any nodes listed in filterNodeID.
func (*ComponentDefault) Map ¶ added in v1.5.0
func (n *ComponentDefault) Map() map[string]cfacade.IMember
Map returns a snapshot of all known members as a plain map.
func (*ComponentDefault) Mode ¶ added in v1.5.0
func (n *ComponentDefault) Mode() string
func (*ComponentDefault) Name ¶ added in v1.5.0
func (*ComponentDefault) Name() string
func (*ComponentDefault) OnAddMember ¶ added in v1.5.0
func (n *ComponentDefault) OnAddMember(listener cfacade.MemberListener)
OnAddMember registers a listener that is called after a member is added via AddMember(). Nil listeners are silently ignored.
func (*ComponentDefault) OnRemoveMember ¶ added in v1.5.0
func (n *ComponentDefault) OnRemoveMember(listener cfacade.MemberListener)
OnRemoveMember registers a listener that is called after a member is removed via RemoveMember(). Nil listeners are silently ignored.
func (*ComponentDefault) OnUpdateMember ¶ added in v1.5.0
func (n *ComponentDefault) OnUpdateMember(listener cfacade.MemberListener)
OnUpdateMember registers a listener that is called when an existing member is updated via UpdateMember(). Nil listeners are silently ignored.
func (*ComponentDefault) Random ¶ added in v1.5.0
func (n *ComponentDefault) Random(nodeType string) (cfacade.IMember, bool)
Random returns a random member of the given nodeType. Returns nil, false if no members of that type exist.
func (*ComponentDefault) RemoveMember ¶ added in v1.5.0
func (n *ComponentDefault) RemoveMember(nodeID string)
RemoveMember deletes a member from the local member table by nodeID. If the member existed, notifies all onRemoveListener callbacks.
func (*ComponentDefault) UpdateMember ¶ added in v1.5.0
func (n *ComponentDefault) UpdateMember(member *cproto.Member)
UpdateMember updates an existing member in the local member table. If the member doesn't exist, it is stored but no update listeners are notified. If the member exists, the stored value is replaced and onUpdateListener callbacks fire.
func (*ComponentDefault) UpdateSetting ¶ added in v1.5.0
func (n *ComponentDefault) UpdateSetting(key, value string)
UpdateSetting updates a single setting on the local node's member entry and notifies OnUpdateMember listeners. If the local node is not in the member map (e.g. before Init completes), the call is silently ignored.
Backends with a transport layer (nats, etcd) override this method to also broadcast the change to other nodes.
func (*ComponentDefault) UpdateSettings ¶ added in v1.5.0
func (n *ComponentDefault) UpdateSettings(settings map[string]string)
UpdateSettings updates multiple settings on the local node's member entry and notifies OnUpdateMember listeners once. If the local node is not in the member map, the call is silently ignored.
Backends with a transport layer (nats, etcd) override this method to also broadcast the change to other nodes.
type ComponentMaster ¶ added in v1.5.0
type ComponentMaster struct {
ComponentDefault
// contains filtered or unexported fields
}
ComponentMaster implements NATS-based master/worker discovery.
Protocol overview:
- Start a single master node first.
- Worker nodes send a register message (cherry.<prefix>.discovery.<masterID>.register) to the master.
- The master replies with the full member list and broadcasts the new member via add subject.
- Workers periodically send heartbeat messages; the master removes members that time out.
- Workers broadcast remove messages on shutdown.
natsSubjects holds the NATS subject strings built from prefix and masterID. thisMember is the local node's member info, synced with the master on setting changes. ctx/cancel control the lifecycle of background goroutines (ticker, heartbeat check).
func NewMaster ¶ added in v1.5.0
func NewMaster() ComponentMaster
func (*ComponentMaster) Init ¶ added in v1.5.0
func (m *ComponentMaster) Init()
Init sets up the master component: loads local member info, builds NATS subjects, and starts the appropriate subscriptions and background loops based on role.
func (*ComponentMaster) Mode ¶ added in v1.5.0
func (m *ComponentMaster) Mode() string
func (*ComponentMaster) NodeID2Bytes ¶ added in v1.5.0
func (m *ComponentMaster) NodeID2Bytes(nodeID string) ([]byte, error)
func (*ComponentMaster) Stop ¶ added in v1.5.0
func (m *ComponentMaster) Stop()
Stop performs a graceful shutdown: workers send a remove message, then the lifecycle context is cancelled to stop all background loops.
func (*ComponentMaster) UpdateSetting ¶ added in v1.5.0
func (m *ComponentMaster) UpdateSetting(key, value string)
UpdateSetting updates a single setting on this member and broadcasts the change.
func (*ComponentMaster) UpdateSettings ¶ added in v1.5.0
func (m *ComponentMaster) UpdateSettings(setting map[string]string)
UpdateSettings updates multiple settings on this member and broadcasts the change.