如何从 GoLang 应用程序连接到 Bigtable 模拟器?如何使用它?

How to connect to Bigtable Emulator from a GoLang application? How to use it?

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

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

请通过解释或指向任何示例或链接来帮助我。 谢谢。

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

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

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


演练

为了演示如何从 go 开始使用 Bigtable 模拟器,我使用了 free tier, f1-micro Compute Engine instance。这是一个我以前没有使用过的例子,所以它基本上是一个干净的石板。

首先,我设置我的 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 ...>

此时模拟器已准备好 [=7​​7=],所以我使用记录的命令启动它:

$ 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)

既然模拟器已 运行ning 并且环境已准备就绪,我需要一个客户端应用程序来连接它。我选择使用 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 标志的虚拟值,因为它将连接到本地 运行ning 模拟器.

$ 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
$

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