我正在像这样初始化我的代理:
conf := serf.DefaultConfig()
conf.NodeName = "node-a"
conf.MemberlistConfig.BindAddr = "127.0.0.1"
conf.MemberlistConfig.BindPort = 6666
conf.MemberlistConfig.AdvertiseAddr = "127.0.0.1"
conf.MemberlistConfig.AdvertisePort = 6666我还有一个客户端代码,试图连接到RPC客户机:
c, err := client.NewRPCClient("127.0.0.1:7373")
if err != nil {
fmt.Println("error creating RCP Client:", err)
return
}我启动了我的代理程序,我看到了这个输出:
2020/05/06 07:15:18 [INFO] serf: EventMemberJoin: node-a 127.0.0.1
[{node-a 127.0.0.1 6666 map[] alive 1 5 2 2 5 4}]当我启动我的客户时,我会得到这个:
error creating RCP Client: dial tcp 127.0.0.1:7373: connect: connection refused如果我使用CLI启动代理(如in:serf agent -bind=0.0.0.0:6667 -advertise=0.0.0.0:6667 -join=0.0.0.0:6666 -node=agent-2 -log-level=debug )并运行我的客户端代码,它将连接到RPC客户端。
我确信,在我的代码中,或者在我对Serf如何工作的理解中,存在一个错误。
发布于 2020-05-14 10:42:38
我终于明白我做错了什么。
我的目标是拥有一个Serf集群,并使节点相互通信。要做到这一点,我必须像我所做的那样启动serf服务,但是不需要客户机,节点在加入集群后相互通信。
只有当我通过Serf启动Serf代理时,我才会以我尝试的方式使用Serf客户端。
发布于 2020-05-12 00:25:04
这是因为当您通过serf.Create运行serf时(我假设您将上述配置传递给),它只启动到配置中提到的端口的连接,而不启动RPC服务。
但是,当运行serf agent时,它也会在端口7373上运行生听者。
下面是我假设您正在运行的代理程序:
package main
import (
"fmt"
"github.com/hashicorp/serf/serf"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("\r- Ctrl+C pressed")
os.Exit(0)
}()
conf := serf.DefaultConfig()
conf.NodeName = "node-a"
conf.MemberlistConfig.BindAddr = "127.0.0.1"
conf.MemberlistConfig.BindPort = 6666
conf.MemberlistConfig.AdvertiseAddr = "127.0.0.1"
conf.MemberlistConfig.AdvertisePort = 6666
serf.Create(conf)
for {
fmt.Println("- Sleeping")
time.Sleep(10 * time.Second)
}
}使用netcat,您可以看到情况是这样的:
#running my go program
$ nc localhost 7373 -v
nc: connectx to localhost port 7373 (tcp) failed: Connection refused
nc: connectx to localhost port 7373 (tcp) failed: Connection refused与此输出相比,如果绑定了TCP端口:
#running serf agent
$ nc localhost 7373 -v
Connection to localhost port 7373 [tcp/*] succeeded!https://stackoverflow.com/questions/61633062
复制相似问题