连接编辑

本页面包含连接和使用 Elasticsearch 客户端所需的信息。

本页内容

连接到 Elastic Cloud编辑

如果您使用的是 Elastic Cloud,则客户端提供了一种连接到它的简单方法。您必须传递在云控制台中可以找到的云 ID 和相应的 API 密钥。

cfg := elasticsearch.Config{
        CloudID: "CLOUD_ID",
        APIKey: "API_KEY"
}
es, err := elasticsearch.NewClient(cfg)

您需要将 API 密钥 复制并存储在安全的地方,因为您将无法在 Elastic Cloud 中再次查看它。

连接到自管集群编辑

从 8.0 版开始,Elasticsearch 默认提供安全性,并启用了身份验证和 TLS。

要连接到 Elasticsearch 集群,您需要将客户端配置为使用生成的 CA 证书。如果您刚开始使用 Elasticsearch,我们建议您阅读有关配置和启动 Elasticsearch 的文档,以确保您的集群按预期运行。

首次启动 Elasticsearch 时,您会在 Elasticsearch 的输出中看到一个类似于下面的独特块(如果已经有一段时间了,您可能需要向上滚动)

----------------------------------------------------------------
-> Elasticsearch security features have been automatically configured!
-> Authentication is enabled and cluster connections are encrypted.
->  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  lhQpLELkjkrawaBoaz0Q
->  HTTP CA certificate SHA-256 fingerprint:
  a52dd93511e8c6045e21f16654b77c9ee0f34aea26d9f40320b531c474676228
...
----------------------------------------------------------------

记下 elastic 用户密码和 HTTP CA 指纹,以供下一节使用。在下面的示例中,它们将分别存储在变量 ELASTIC_PASSWORDCERT_FINGERPRINT 中。

根据情况,有两种验证 HTTPS 连接的选项,可以使用 CA 证书本身进行验证,也可以通过 HTTP CA 证书指纹进行验证。

使用 CA 证书验证 HTTPS编辑

生成的根 CA 证书位于 Elasticsearch 配置位置的 certs 目录中($ES_CONF_PATH/certs/http_ca.crt)。如果您在 Docker 中运行 Elasticsearch,则有 有关检索 CA 证书的其他文档

http_ca.crt 文件放在可以访问的位置后,通过 CACert 将文件内容传递给客户端

cert, _ := os.ReadFile("/path/to/http_ca.crt")

cfg := elasticsearch.Config{
        Addresses: []string{
            "https://127.0.0.1:9200",
        },
        Username: "elastic",
        Password: ELASTIC_PASSWORD
        CACert:   cert
}
es, err := elasticsearch.NewClient(cfg)

使用证书指纹验证 HTTPS编辑

这种验证 HTTPS 连接的方法利用了之前记下的证书指纹值。获取此 SHA256 指纹值,并通过 ca_fingerprint 将其传递给 Go Elasticsearch 客户端

cfg := elasticsearch.Config{
        Addresses: []string{
            "https://127.0.0.1:9200",
        },
        Username: "elastic",
        Password: ELASTIC_PASSWORD
        CertificateFingerprint: CERT_FINGERPRINT
}
es, err := elasticsearch.NewClient(cfg)

可以使用 openssl x509 和证书文件计算证书指纹

openssl x509 -fingerprint -sha256 -noout -in /path/to/http_ca.crt

如果您无权访问 Elasticsearch 生成的 CA 文件,则可以使用以下脚本通过 openssl s_client 输出 Elasticsearch 实例的根 CA 指纹

# Replace the values of 'localhost' and '9200' to the
# corresponding host and port values for the cluster.
openssl s_client -connect localhost:9200 -servername localhost -showcerts </dev/null 2>/dev/null \
  | openssl x509 -fingerprint -sha256 -noout -in /dev/stdin

openssl x509 的输出如下所示

SHA256 Fingerprint=A5:2D:D9:35:11:E8:C6:04:5E:21:F1:66:54:B7:7C:9E:E0:F3:4A:EA:26:D9:F4:03:20:B5:31:C4:74:67:62:28

在未启用安全性的情况下连接编辑

不建议在未启用安全性的情况下运行 Elasticsearch。

如果您的集群配置为 显式禁用了安全性,则可以通过 HTTP 连接

cfg := elasticsearch.Config{
        Addresses: []string{
            "https://127.0.0.1:9200",
        },
}
es, err := elasticsearch.NewClient(cfg)

连接到多个节点编辑

Go Elasticsearch 客户端支持将 API 请求发送到集群中的多个节点。这意味着工作将更均匀地分布在集群中,而不是反复使用相同的节点来处理请求。要使用多个节点配置客户端,您可以传递一个 URL 列表,每个 URL 将用作池中的单独节点。

cfg := elasticsearch.Config{
  Addresses: []string{
    "https://127.0.0.1:9200",
    "https://127.0.0.1:9201",
  },
  CACert:   caCert,
  Username: "elastic",
  Password: ELASTIC_PASSWORD,
}
es, err := elasticsearch.NewClient(cfg)

默认情况下,使用轮询方式选择节点,但可以通过 elastictransport.Selector 接口实现备用节点选择策略,并将其提供给客户端配置。

如果您的 Elasticsearch 集群位于负载均衡器之后(例如使用 Elastic Cloud 时),则无需配置多个节点。而是使用负载均衡器主机和端口。

身份验证编辑

本节包含代码片段,向您展示如何使用 Elasticsearch 进行身份验证。

基本身份验证编辑

要以编程方式设置集群端点、用户名和密码,请将配置对象传递给 elasticsearch.NewClient() 函数。

cfg := elasticsearch.Config{
  Addresses: []string{
    "https://127.0.0.1:9200",
    "https://127.0.0.1:9201",
  },
  Username: "foo",
  Password: "bar",
}
es, err := elasticsearch.NewClient(cfg)

您还可以在端点 URL 中包含用户名和密码

'https://username:password@localhost:9200'

HTTP Bearer 身份验证编辑

HTTP Bearer 身份验证通过将令牌作为字符串传递来使用 ServiceToken 参数。此身份验证方法由 服务帐户令牌Bearer 令牌 使用。

cfg := elasticsearch.Config{
    Addresses: []string{
        "https://127.0.0.1:9200",
    },
    ServiceToken: "token-value",
}
es, err := elasticsearch.NewClient(cfg)

兼容模式编辑

Elasticsearch 服务器 8.0 版引入了一种新的兼容模式,可以让您从 7 升级到 8 的体验更加顺畅。简而言之,您可以将最新的 7.x go-elasticsearch Elasticsearch 客户端与 8.x Elasticsearch 服务器一起使用,从而为将代码库升级到下一个主要版本提供更多空间。

如果要利用此功能,请确保您使用的是最新的 7.x go-elasticsearch 客户端,并将环境变量 ELASTIC_CLIENT_APIVERSIONING 设置为 true 或在客户端 Config 中设置配置选项 config.EnableCompatibilityMode。客户端在内部处理其余部分。对于每个 8.0 及更高版本的 go-elasticsearch 客户端,您都已准备就绪!默认情况下启用兼容模式。

使用客户端编辑

Elasticsearch 包将两个独立的包捆绑在一起,用于调用 Elasticsearch API 和通过 HTTP 传输数据:分别是 esapiestransport

使用 elasticsearch.NewDefaultClient() 函数创建具有默认设置的客户端。

es, err := elasticsearch.NewDefaultClient()
if err != nil {
  log.Fatalf("Error creating the client: %s", err)
}

res, err := es.Info()
if err != nil {
  log.Fatalf("Error getting response: %s", err)
}

defer res.Body.Close()
log.Println(res)

在函数即服务环境中使用客户端编辑

本节说明了在函数即服务 (FaaS) 环境中利用 Elasticsearch 客户端的最佳实践。最有影响力的优化是在函数外部(全局范围)初始化客户端。这种做法不仅可以提高性能,还可以启用后台功能,例如 嗅探。以下示例提供了最佳实践的框架。

GCP 云函数编辑

package httpexample

import (
	"github.com/elastic/go-elasticsearch/v8"
)

var client *elasticsearch.Client

func init() {
	var err error

	... # Client configuration
	client, err = elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("elasticsearch.NewClient: %v", err)
	}
}

func HttpExample(w http.ResponseWriter, r *http.Request) {
	... # Client usage
}

AWS Lambda编辑

package httpexample

import (
	"github.com/aws/aws-lambda-go/lambda"
	"github.com/elastic/go-elasticsearch/v8"
)

var client *elasticsearch.Client

func init() {
	var err error

	... # Client configuration
	client, err = elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("elasticsearch.NewClient: %v", err)
	}
}

func HttpExample() {
	... # Client usage
}

func main() {
	lambda.Start(HttpExample)
}

用于评估这些建议的资源