0

我想在 Kubernetes 上测试一个非常基本的 NATS-streaming 应用程序。为此,我遵循了官方 NATS-docs 中的命令

它基本上归结为跑步

kubectl apply -f https://raw.githubusercontent.com/nats-io/k8s/master/nats-server/single-server-nats.yml
kubectl apply -f https://raw.githubusercontent.com/nats-io/k8s/master/nats-streaming-server/single-server-stan.yml

在可以访问集群的终端中(在我的情况下,它是一个kind -cluster)。

我用作stan.goNATS-streaming-client。这是我尝试连接到 NATS-streaming-server 的代码:

package main

import stan "github.com/nats-io/stan.go"

func main() {
    sc, err := stan.Connect("stan", "test-client")

    if err != nil {
        panic(err)
    }
    if err := sc.Publish("test-subject", []byte("This is a test-message!")); err != nil {
        panic(err)
    }
}

这是我得到的错误:

panic: nats: no servers available for connection

goroutine 1 [running]:
main.main()
    /Users/thilt/tmp/main.go:9 +0x15d
exit status 2

所以我认为集群使用了另一个名称或其他名称。如果我使用上面 docs.nats-link 提供的示例nats-box,它也不起作用!我在这里哪里做错了?

如果需要,我很乐意提供更多信息。

4

1 回答 1

1

stan.go 文档中有一个很好的例子:

// Connect to NATS
nc, err := nats.Connect(URL, opts...)
if err != nil {
    log.Fatal(err)
}
defer nc.Close()

sc, err := stan.Connect(clusterID, clientID, stan.NatsConn(nc))
if err != nil {
    log.Fatalf("Can't connect: %v.\nMake sure a NATS Streaming Server is running at: %s", err, URL)
}
defer sc.Close()

您的错误发生是因为默认情况下 stan 连接到 localhost 地址(源代码):

// DefaultNatsURL is the default URL the client connects to
DefaultNatsURL = "nats://127.0.0.1:4222"

请注意,上面的示例覆盖了这个默认连接。

Stan 源代码简短且易于分析。我真的建议您尝试分析它并弄清楚它的作用。


现在让我们把它们放在一起;这是一个工作示例:

package main

import (
    nats "github.com/nats-io/nats.go"
    stan "github.com/nats-io/stan.go"
)

func main() {
    // Create a NATS connection 
    nc, err := nats.Connect("nats://nats:4222")
    if err != nil {
        panic(err)
    }

    // Then pass it to the stan.Connect() call.
    sc, err := stan.Connect("stan", "me", stan.NatsConn(nc))
    if err != nil {
        panic(err)
    }
    if err := sc.Publish("test-subject", []byte("This is a test-message!")); err != nil {
        panic(err)
    }
}
于 2021-05-10T08:30:30.493 回答