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

yog*_*sai 2 bigtable go google-cloud-bigtable

我正在尝试使用BigTable Emulator.我以前从未使用过它.我按照文档但无法理解,

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

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

chu*_*ckx 7

BIGTABLE_EMULATOR_HOST环境变量覆盖正常连接逻辑.设置它会导致客户端连接到模拟器,而代码中不需要任何特殊更改(即传递给NewAdminClient()/ 的项目/实例值NewClient()被忽略).

使用模拟器指令的步骤2中提供的命令为您设置环境变量.

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


演练

为了演示使用Bigtable Emulator,我正在使用免费的层,f1-micro计算引擎实例.这是我以前没用过的实例,所以它基本上是一个干净的平板.

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

$ sudo apt install golang
<... SNIP apt output ...>
$ mkdir ~/go
$ export GOPATH=$HOME/go
Run Code Online (Sandbox Code Playgroud)

然后我更新了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 ...>
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

启动它后,它在前台运行,所以我独自离开了那个终端并开始了一个新终端.

在新终端中,首先要设置BIGTABLE_EMULATOR_HOST环境变量.此步骤记录在仿真器指令中.以下命令生成用于设置变量的shell命令.要查看它生成它的命令,请直接运行它:

$ gcloud beta emulators bigtable env-init
export BIGTABLE_EMULATOR_HOST=localhost:8086
Run Code Online (Sandbox Code Playgroud)

运行所记录的命令$(...)告诉shell执行命令的输出,从而设置变量:

$ $(gcloud beta emulators bigtable env-init)
Run Code Online (Sandbox Code Playgroud)

现在模拟器正在运行并且环境已准备就绪,我需要一个客户端应用程序来连接它.我选择使用GoogleCloudPlatform/golang-samples存储库中helloworld应用程序.

$ git clone https://github.com/GoogleCloudPlatform/golang-samples.git
$ cd golang-samples/bigtable/helloworld
Run Code Online (Sandbox Code Playgroud)

在上述目录中的文件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
Run Code Online (Sandbox Code Playgroud)

然后我运行示例应用程序,使用-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
Run Code Online (Sandbox Code Playgroud)

模拟器终端中没有任何事实发生,表明它正被使用.因此,为了证明它实际上与模拟器交互,我停止了模拟器进程(通过在其终端中按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
$
Run Code Online (Sandbox Code Playgroud)

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