Serf 客户端无法连接到本地运行的 RPC 客户端

我正在像这样初始化我的代理:


    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 启动代理,如下所示: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 工作原理的理解存在错误。


天涯尽头无女友
浏览 99回答 2
2回答

函数式编程

这是因为当您在 Go 中运行 serf 时serf.Create(我假设您将上述配置传递给),它只会启动与配置中提到的端口的连接,而不会启动 RPC 服务。但是,当serf agent它运行时,它还会在端口 7373 上生成一个侦听器。这是我假设您正在为代理运行的程序:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "github.com/hashicorp/serf/serf"&nbsp; &nbsp; "os"&nbsp; &nbsp; "os/signal"&nbsp; &nbsp; "syscall"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; c := make(chan os.Signal)&nbsp; &nbsp; signal.Notify(c, os.Interrupt, syscall.SIGTERM)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; <-c&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("\r- Ctrl+C pressed")&nbsp; &nbsp; &nbsp; &nbsp; os.Exit(0)&nbsp; &nbsp; }()&nbsp; &nbsp; conf := serf.DefaultConfig()&nbsp; &nbsp; conf.NodeName = "node-a"&nbsp; &nbsp; conf.MemberlistConfig.BindAddr = "127.0.0.1"&nbsp; &nbsp; conf.MemberlistConfig.BindPort = 6666&nbsp; &nbsp; conf.MemberlistConfig.AdvertiseAddr = "127.0.0.1"&nbsp; &nbsp; conf.MemberlistConfig.AdvertisePort = 6666&nbsp; &nbsp; serf.Create(conf)&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("- Sleeping")&nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(10 * time.Second)&nbsp; &nbsp; }}使用netcat,你可以看到是这样的:#running my go program$ nc localhost 7373 -vnc: connectx to localhost port 7373 (tcp) failed: Connection refusednc: connectx to localhost port 7373 (tcp) failed: Connection refused如果该 TCP 端口已绑定,则与此输出对比:#running serf agent$ nc localhost 7373 -vConnection to localhost port 7373 [tcp/*] succeeded!

缥缈止盈

我终于明白我做错了什么。我的目标是拥有一个 Serf 集群并使节点相互通信。为此,我必须像我一样启动 serf 服务,但不需要客户端,节点在加入集群后相互通信。我将按照我尝试的方式使用 Serf 客户端,前提是我通过 Serf cli 启动 Serf 代理。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go