etcd-3. 网关 gateway

2022-03-09  本文已影响0人  husky_1

1. grpc-gateway

参考翻译自https://etcd.io/docs/v3.5/dev-guide/api_grpc_gateway

gRPC-Gateway 主要是为非 gRPC 的客户端提供 HTTP 接口

etcd v3 API使用 gRPC 作为消息传输协议。etcd 项目中包括了基于 gRPC 的 Go client 和命令行工具 etcdctl,客户端通过 gRPC 框架与 etcd 集群通讯。对于不支持 gRPC 的客户端语言,etcd 提供 JSON 的 gRPC-Gateway,通过 gRPC-Gateway 提供 RESTful 代理,转换 HTTP/JSON 请求为 gRPC 的 Protocol Buffer 格式的消息。

注意 在 HTTP 请求体中的 JSON 对象,其包含的 key 和 value 字段都被定义成了 byte 数组,因此必须在 JSON 对象中,使用 base64 编码对内容进行处理

1.1 版本

etcd 各个版本与grcp-gateway url的关系如下

etcd 版本 gateway url
v3.2及之前版本 [CLIENT-URL]/v3alpha/*
v3.3 [CLIENT-URL]/v3beta/* 和 [CLIENT-URL]/v3alpha/*
v3.4 [CLIENT-URL]/v3/* 和 [CLIENT-URL]/v3beta/*
v.3.5及之后版本 [CLIENT-URL]/v3/*

gRPC-gateway 不支持使用 基于TLS 身份验证

1.2 请求示例

假设对键test, 值aaa 的键值对进行操作,首先要对其进行base64编码,

 # 通过https://www.base64encode.org/ 获取编码值
 foo-----> Zm9v
 bar ------>YmFy
 

具体操作链接 https://etcd.io/docs/v3.5/dev-guide/api_grpc_gateway/

swagger 脚本:https://etcd.io/docs/v3.5/devguide/apispec/swagger/rpc.swagger.json

2. etcd-gateway

etcd 网关是一个简单的 TCP 代理,转发网络数据到 etcd 集群。网关是无状态和透明的;它既不检查客户端请求也不干涉集群应答。 它不会终止 TLS 连接,不会代替客户端进行 TLS 握手,也不会验证连接是否安全

网关支持多个 etcd 服务器端点,并采用简单的轮训策略(round-robin policy)。它只路由到可用的端点并对其客户端隐藏故障。未来可能会支持其他重试策略,例如加权轮询

2.1 使用场景

每个访问 etcd 的应用程序必须首先具有 etcd 集群客户端端点的地址。如果同一台服务器上的多个应用程序访问同一个 etcd 集群,每个应用程序仍然需要知道 etcd 集群的通告客户端端点。如果 etcd 集群被重新配置为具有不同的端点,每个应用程序可能还需要更新其端点列表。这种大规模的重新配置既乏味又容易出错。 etcd 网关通过充当稳定的本地端点解决了这个问题。典型的 etcd 网关配置让每台机器运行一个网关,监听本地地址,并且每个 etcd 应用程序都连接到其本地网关。结果只是网关需要更新其端点,而不是更新每个应用程序。 总之,为了自动传播集群端点更改,etcd 网关运行在每台机器上,为访问同一个 etcd 集群的多个应用程序提供服务

etcd 在如下场景中不应使用

2.2 启动gateway

以单机多节点为例, 在一台服务器启动三个etcd 服务组成集群

hostName IP 客户端交互端口 节点间交互端口
test1 127.0.0.1 12379 12380
tes2 127.0.0.1 22379 22380
test3 127.0.0.1 32379 32380

此时创建一个网关

etcd gateway start --endpoints=127.0.0.1:12379,127.0.0.1:22379,127.0.0.1:32379 --listen-addr=127.0.0.1:23790

{"level":"info","ts":1646797196.1293163,"caller":"etcdmain/gateway.go:103","msg":"Running: ","args":["etcd","gateway","start","--endpoints=127.0.0.1:12379,127.0.0.1:22379,127.0.0.1:32379","--listen-addr=127.0.0.1:23790"]}
{"level":"info","ts":1646797196.1296158,"caller":"etcdmain/main.go:47","msg":"notifying init daemon"}
{"level":"info","ts":1646797196.129632,"caller":"etcdmain/main.go:53","msg":"successfully notified init daemon"}
{"level":"info","ts":1646797196.1296465,"caller":"tcpproxy/userspace.go:87","msg":"ready to proxy client requests","endpoints":["127.0.0.1:12379","127.0.0.1:22379","127.0.0.1:32379"]}
参数名 含义
endpoints 以逗号分隔的用于转发客户端连接的etcd服务器目标列表,默认127.0.0.1:2379
discovery-srv 用于通过SRV记录引导群集终结点的DNS域
listen-addr 接收客户端请求绑定的接口和端口,默认:127.0.0.1:23790
retry-delay 重试连接到失败的端点之前的延迟时间。默认值:1m0s
insecure-discovery 接受不安全或容易受到中间人攻击的SRV记录,默认false
trusted-ca-file etcd集群的客户端TLS CA文件的路径。 用于认证端点,默认未设置

此时客户端可以通过网关地址去访问集群

etcdctl --endpoints=127.0.0.1:23790 put /gateway 123
OK

etcdctl --endpoints=127.0.0.1:23790 member list  --write-out=table
+------------------+---------+-------+------------------------+------------------------+------------+
|        ID        | STATUS  | NAME  |       PEER ADDRS       |      CLIENT ADDRS      | IS LEARNER |
+------------------+---------+-------+------------------------+------------------------+------------+
| 8211f1d0f64f3269 | started | test1 | http://127.0.0.1:12380 | http://127.0.0.1:12379 |      false |
| 91bc3c398fb3c146 | started | test2 | http://127.0.0.1:22380 | http://127.0.0.1:22379 |      false |
| fd422379fda50e48 | started | test3 | http://127.0.0.1:32380 | http://127.0.0.1:32379 |      false |
+------------------+---------+-------+------------------------+------------------------+------------+

上一篇 下一篇

猜你喜欢

热点阅读