既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
// start_revision 是可选的开始(包括)观察的修订版本。不设置 start_revision 则表示 “现在”.
int64 start_revision = 3;
bool progress_notify = 4;
enum FilterType {
// 过滤掉 put 事件
NOPUT = 0;
// 过滤掉 delete 事件
NODELETE = 1;
}
// 过滤器,在服务器端发送事件给回观察者之前,过滤掉事件。
repeated FilterType filters = 5;
// 如果 prev_kv 被设置,被创建的观察者在事件发生前获取上一次的KV。
// 如果上一次的KV已经被压缩,则不会返回任何东西
bool prev_kv = 6;
}
* range\_end 是要观察的范围 [key, range\_end) 的终点。如果 range\_end 没有设置,则只有参数 key 被观察;如果 range\_end 等同于 ‘\0’, 则大于等于参数 key 的所有 key 都将被观察;如果 range\_end 比给定 key 大1, 则所有以给定 key 为前缀的 key 都将被观察。
* progress\_notify 设置,这样如果最近没有事件,etcd 服务器将定期的发送不带任何事件的 WatchResponse 给新的观察者。当客户端希望从最近已知的修订版本开始恢复断开的观察者时有用。etcd 服务器将基于当前负载决定它发送通知的频率。
取消已有观察者的 WatchCancelRequest:
message WatchCancelRequest {
int64 watch_id = 1;
}
watch\_id 是要取消的观察者的id,这样就不再有更多事件传播过来了。
应答的消息体 WatchResponse:
message WatchResponse {
ResponseHeader header = 1;
// watch_id 是和应答相关的观察者的ID
int64 watch_id = 2;
bool created = 3;
bool canceled = 4;
int64 compact_revision = 5;
// cancel_reason 指出取消观察者的理由.
string cancel_reason = 6;
repeated mvccpb.Event events = 11;
}
* 如果应答是用于创建观察者请求的,则 created 设置为 true。客户端应该记录 watch\_id 并期待从同样的流中为创建的观察者接收事件。所有发送给被创建的观察者的事件将附带同样的 watch\_id;如果应答是用于取消观察者请求的,则 canceled 设置为true。不会再有事件发送给被取消的观察者。
* compact\_revision 被设置为最小 index,如果观察者试图观察被压缩的 index。当在被压缩的修订版本上创建观察者或者观察者无法追上键值对存储的进展时发生。客户端应该视观察者为被取消,并不应该试图再次创建任何带有相同 start\_revision 的观察者。
## 3 Lease 服务
Lease service 提供租约的支持。Lease 是一种检测客户端存活状况的机制。集群授予具有生存时间的租约。如果Etcd集群在给定的 TTL 时间内未收到 keepAlive,则租约到期。
为了将租约绑定到键值上,每个 key 最多可以附加一个租约。当租约到期或被撤销时,该租约所附的所有 key 都将被删除。每个过期的密钥都会在事件历史记录中生成一个删除事件。
在 rpc.proto 中 Lease service 定义的接口如下:
service Lease {
rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {}
rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {}
rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {}
rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {}
}
* LeaseGrant:创建租约
* LeaseRevoke:撤销租约
* LeaseKeepAlive:维持租约
* LeaseTimeToLive:获取租约信息
### 3.1 LeaseGrant 方法
LeaseGrant 方法创建一个租约。当服务器在给定 time to live 时间内没有接收到 keepAlive 时租约过期。如果租约过期则所有附加在租约上的 key 将过期并被删除。每个过期的 key 在事件历史中生成一个删除事件。
方法定义如下:
rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {}
请求的消息体是 LeaseGrantRequest:
message LeaseGrantRequest {
int64 TTL = 1;
int64 ID = 2;
}
TTL 建议以秒为单位的 time-to-live。ID 是租约的请求 ID,如果 ID 设置为 0,则出租人(也就是 etcd server)选择一个 ID。
应答的消息体 LeaseGrantResponse 定义如下:
message LeaseGrantResponse {
ResponseHeader header = 1;
int64 ID = 2;
int64 TTL = 3;
string error = 4;
}
ID 是承认的租约的 ID。TTL 是服务器选择的以秒为单位的租约 time-to-live。
### 3.2 LeaseRevoke 方法
LeaseRevoke 撤销一个租约,此时所有附加到租约的 key 将过期并被删除。
rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {}
请求的消息体 LeaseRevokeRequest 定义如下:
message LeaseRevokeRequest {
int64 ID = 1;
}
ID 是要取消的租约的 ID。当租约被取消时,所有关联的 key 将被删除。
应答的消息体 LeaseRevokeResponse 定义如下:
message LeaseRevokeResponse {
ResponseHeader header = 1;
}
LeaseRevokeResponse 中只有一个通用的响应头字段。
### 3.3 LeaseKeepAlive 方法
LeaseKeepAlive 方法维持一个租约。LeaseKeepAlive 通过从客户端到服务器端的流化的 keep alive 请求和从服务器端到客户端的流化的 keep alive 应答来维持租约。
rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {}
请求的消息体 LeaseKeepAliveRequest 定义如下:
message LeaseKeepAliveRequest {
int64 ID = 1;
}
ID 是要继续存活的租约的 ID。
应答的消息体 LeaseKeepAliveResponse:
message LeaseKeepAliveResponse {
ResponseHeader header = 1;
int64 ID = 2;
int64 TTL = 3;
}
ID 是从继续存活请求中得来的租约 ID。TTL 是租约新的 time-to-live。
### 3.4 LeaseTimeToLive 方法
LeaseTimeToLive 方法获取租约的信息。
rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {}
请求的消息体 LeaseTimeToLiveRequest 定义如下:
message LeaseTimeToLiveRequest {
// ID 是租约的 ID
int64 ID = 1;
bool keys = 2;
}
keys 设置为 true 可以查询附加到这个租约上的所有 key。
应答的消息体 LeaseTimeToLiveResponse 定义如下:
message LeaseTimeToLiveResponse {
ResponseHeader header = 1;
// ID 是来自请求的 ID
int64 ID = 2;
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
[外链图片转存中…(img-cwddds7D-1715803404740)]
[外链图片转存中…(img-TTnb7f9z-1715803404740)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新