如何从 GoLang 应用程序连接到 Bigtable Emulator?如何使用它?

Posted

技术标签:

【中文标题】如何从 GoLang 应用程序连接到 Bigtable Emulator?如何使用它?【英文标题】:How to connect to Bigtable Emulator from a GoLang application? How to use it? 【发布时间】:2018-11-26 14:46:51 【问题描述】:

我正在尝试使用 BigTable 模拟器。我以前从未使用过它。我关注了documentation但看不懂,

    如何将应用程序连接到模拟器。 如何设置BIGTABLE_EMULATOR_HOST环境变量。

请帮助解释它或向我指出任何示例或链接。 谢谢。

【问题讨论】:

【参考方案1】:

The BIGTABLE_EMULATOR_HOST environment variable overrides the normal connection logic。设置它会导致客户端连接到模拟器,而无需对代码进行任何特殊更改(即忽略传递给 NewAdminClient()/NewClient() 的项目/实例值)。

step 2 of the Using the emulator instructions 中提供的命令为您设置环境变量。

请参阅GoogleCloudPlatform/golang-samples/bigtable/helloworld/main.go 的实现,了解与 BigTable 实例交互的简单具体示例。


演练

为了演示如何从 go 中使用 Bigtable 模拟器,我使用了 free tier, f1-micro Compute Engine instance。这是一个我以前没有使用过 go 的实例,所以它基本上是一张白纸。

首先,我设置我的 go 环境:

$ sudo apt install golang
<... SNIP apt output ...>
$ mkdir ~/go
$ export GOPATH=$HOME/go

然后我更新了google-cloud-sdk 包并安装了google-cloud-sdk-bigtable-emulator 包:

$ sudo apt install google-cloud-sdk
<... SNIP apt output ...>
$ sudo apt install google-cloud-sdk-bigtable-emulator
<... SNIP apt output ...>

此时模拟器已准备好运行,因此我使用文档中的命令启动它:

$ gcloud beta emulators bigtable start
Executing: /usr/lib/google-cloud-sdk/platform/bigtable-emulator/cbtemulator --host=localhost --port=8086
[bigtable] Cloud Bigtable emulator running on 127.0.0.1:8086

启动后,它在前台运行,所以我不理会那个终端并启动了一个新终端。

在新终端中,第一件事是设置BIGTABLE_EMULATOR_HOST 环境变量。此步骤记录在模拟器说明中。以下命令生成用于设置变量的 shell 命令。要查看它生成的命令,请直接运行它:

$ gcloud beta emulators bigtable env-init
export BIGTABLE_EMULATOR_HOST=localhost:8086

按照记录运行包含在$(...) 中的命令告诉shell 执行命令的输出,从而设置变量:

$ $(gcloud beta emulators bigtable env-init)

现在模拟器正在运行并且环境已经准备好,我需要一个客户端应用程序来连接它。我选择使用GoogleCloudPlatform/golang-samples repository 中的helloworld 应用程序。

$ git clone https://github.com/GoogleCloudPlatform/golang-samples.git
$ cd golang-samples/bigtable/helloworld

在上面目录的 main.go 文件中,cloud.google.com/go/bigtablegolang.org/x/net/context 包被导入,所以我运行go get 来获取它们。

$ go get cloud.google.com/go/bigtable
$ go get golang.org/x/net/context

然后我运行示例应用程序,使用 -project-instance 标志的虚拟值,因为它将连接到本地运行的模拟器。

$ go run main.go -project foo -instance bar
2018/06/18 00:39:27 Creating table Hello-Bigtable
2018/06/18 00:39:27 Writing greeting rows to table
2018/06/18 00:39:27 Getting a single greeting by row key:
2018/06/18 00:39:27     greeting0 = Hello World!
2018/06/18 00:39:27 Reading all greeting rows:
2018/06/18 00:39:27     greeting0 = Hello World!
2018/06/18 00:39:27     greeting1 = Hello Cloud Bigtable!
2018/06/18 00:39:27     greeting2 = Hello golang!
2018/06/18 00:39:27 Deleting the table

在模拟器终端中并没有真正发生任何事情来表明它正在被使用。因此,为了证明它实际上是在与模拟器交互,我停止了模拟器进程(通过在其终端中按 Ctrl-C)并尝试再次执行客户端应用程序:

$ go run main.go -project foo -instance bar
2018/06/18 00:40:03 Retryable error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp [::1]:8086: getsockopt: connection refused", retrying in 47.77941ms
2018/06/18 00:40:03 Retryable error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp [::1]:8086: getsockopt: connection refused", retrying in 2.153551ms
2018/06/18 00:40:03 Retryable error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp [::1]:8086: getsockopt: connection refused", retrying in 114.145821ms
<... SNIP repeated errors ...>
^Csignal: interrupt
$

因此,使用未修改的客户端应用程序只需设置适当的环境变量即可与模拟器交互。

【讨论】:

谢谢,它成功了。我使用的是 Mac,所以 Go 安装步骤对我来说是不同的。 :) 这个例子也适用于我;但是,我似乎无法让它在 docker compose 环境中工作。我在 docker compose 中运行了 bigtable 容器,但我的服务容器无法连接到它。我确保在我的服务容器中为 BIGTABLE_EMULATOR_HOST 设置环境变量,但没有运气。有什么想法吗? 我不熟悉 Docker Compose 环境,但您可能需要将 BIGTABLE_EMULATOR_HOST 设置为 localhost:8006 以外的值,以便针对在不同容器上运行的模拟器实例。如果您仍然有问题,最好提出一个新问题。

以上是关于如何从 GoLang 应用程序连接到 Bigtable Emulator?如何使用它?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 golang 连接到 docker postgres 容器

从golang mysql连接到mysql容器时,用户'root'@'localhost'的访问被拒绝(使用密码:YES)

使用 golang 1.10.2 连接到带有 IKEv2 证书的 socks5 代理

Google App Engine Golang 连接到 Cloud SQL Postgres unix dial no such file or directory

Golang将不正确的字符连接到字符串[重复]

如何从 Jython 连接到数据库