From 6ef6050a854cb9a20bef8005a5f2a8463374ef17 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期二, 06 八月 2019 17:05:34 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.14:10010/r/syncdb
---
searcher.go | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/searcher.go b/searcher.go
new file mode 100644
index 0000000..afd2daa
--- /dev/null
+++ b/searcher.go
@@ -0,0 +1,110 @@
+package syncdb
+
+import (
+ "encoding/json"
+ "fmt"
+ "time"
+
+ "github.com/hashicorp/memberlist"
+)
+
+var (
+ members [][]byte
+ delay time.Duration
+)
+
+// delegate is the interface that clients must implement if they want to hook into the gossip layer of Memberlist.
+type delegate struct{}
+
+// NodeMeta is the delegate method, must implement.
+func (d *delegate) NodeMeta(limit int) []byte {
+ return []byte{}
+}
+
+// LocalState is the delegate method, must implement.
+func (d *delegate) LocalState(join bool) []byte {
+ return []byte{}
+}
+
+// MergeRemoteState is the delegate method, must implement.
+func (d *delegate) MergeRemoteState(buf []byte, join bool) {
+}
+
+// GetBroadcasts is the delegate method, must implement.
+func (d *delegate) GetBroadcasts(overhead, limit int) [][]byte {
+ return [][]byte{}
+}
+
+// eventDelegate is the interface that clients must implement if they want to hook into the gossip layer of Memberlist.
+type eventDelegate struct{}
+
+// NotifyJoin is the eventDelegate method, must implement.
+func (ed *eventDelegate) NotifyJoin(node *memberlist.Node) {
+}
+
+// NotifyLeave is the eventDelegate method, must implement.
+func (ed *eventDelegate) NotifyLeave(node *memberlist.Node) {
+}
+
+// NotifyUpdate is the eventDelegate method, must implement.
+func (ed *eventDelegate) NotifyUpdate(node *memberlist.Node) {
+}
+
+// NotifyMsg is called when a user-data message is received
+func (d *delegate) NotifyMsg(b []byte) {
+ // logMsg(b)
+ members = append(members, b)
+}
+
+func logMsg(b []byte) {
+ type nodeInfo struct {
+ NodeName string `json:"name"`
+ Address string `json:"address"`
+ }
+
+ node := nodeInfo{}
+ if err := json.Unmarshal(b, &node); err != nil {
+
+ fmt.Println("Umarshal failed:", err)
+ return
+ }
+
+ fmt.Println(node)
+}
+
+func CreateSearchNode(key string) (*memberlist.Memberlist, error) {
+ conf := memberlist.DefaultLocalConfig()
+ conf.Events = &eventDelegate{}
+ conf.Delegate = &delegate{}
+ conf.BindAddr = BroadcastIP
+ conf.BindPort = BroadcastPort
+ conf.Name = "Cluster-Searcher"
+
+ keyring, err := memberlist.NewKeyring(nil, []byte(key))
+ if err != nil {
+ fmt.Printf("Failed to restore keyring: %s", err)
+ return nil, err
+ }
+ conf.Keyring = keyring
+
+ return memberlist.Create(conf)
+}
+
+func CreateSearchNodeWhitClose(key string, delay time.Duration) [][]byte {
+ m, err := CreateSearchNode(key)
+ if err == nil {
+ // fmt.Printf("Local member %s:%d\n", m.LocalNode().Addr, m.LocalNode().Port)
+ time.Sleep(delay)
+
+ m.Shutdown()
+ }
+ return members
+}
+
+func CloseSearchNode(m *memberlist.Memberlist) error {
+ return m.Shutdown()
+}
+
+func GetSearchNodes() [][]byte {
+ return members
+}
--
Gitblit v1.8.0