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

我还有一个客户端代码试图连接到 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 工作原理的理解存在错误。

4

2 回答 2

2

这是因为当你在 Go 中运行 serf 时serf.Create(我假设你将上面的配置传递给它)它只会启动到配置中提到的端口的连接,并且不会启动 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!
于 2020-05-12T00:25:04.410 回答
0

我终于明白我做错了什么。

我的目标是拥有一个 Serf 集群并使节点相互通信。为此,我必须像我一样启动 serf 服务,但不需要客户端,节点在加入集群后相互通信。

我将按照我尝试的方式使用 Serf 客户端,前提是我通过 Serf cli 启动 Serf 代理。

于 2020-05-14T10:42:38.237 回答