当前位置:网站首页>ETCD数据库源码分析——集群间网络层客户端peerRt
ETCD数据库源码分析——集群间网络层客户端peerRt
2022-07-05 13:36:00 【肥叔菌】
peerRt(RoundTripper类型)主要负责实现etcdserver的网络请求等功能,用于向集群其他节点发送version或lease服务请求。我们知道其是在ETCD数据库源码分析——etcdserver bootstrap初始化中的第二步进行初始化的。如何使用它呢?
如server/etcdserver/cluster_util.go的promoteMemberHTTP所示,使用peerRt创建http客户端,然后构造请求Url和指定请求方法为POST,创建http Request结构体,调用http客户端的do函数向服务端进行请求,并获取其响应。
func promoteMemberHTTP(ctx context.Context, url string, id uint64, peerRt http.RoundTripper) ([]*membership.Member, error) {
cc := &http.Client{
Transport: peerRt} // 使用peerRt创建http客户端
// TODO: refactor member http handler code cannot import etcdhttp, so manually construct url
requestUrl := url + "/members/promote/" + fmt.Sprintf("%d", id)
req, err := http.NewRequest("POST", requestUrl, nil)
if err != nil {
return nil, err }
req = req.WithContext(ctx)
resp, err := cc.Do(req)
if err != nil {
return nil, err }
defer resp.Body.Close()
b, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err }
// 处理请求超时
if resp.StatusCode == http.StatusRequestTimeout {
return nil, errors.ErrTimeout }
if resp.StatusCode == http.StatusPreconditionFailed {
// both ErrMemberNotLearner and ErrLearnerNotReady have same http status code
if strings.Contains(string(b), errors.ErrLearnerNotReady.Error()) {
return nil, errors.ErrLearnerNotReady }
if strings.Contains(string(b), membership.ErrMemberNotLearner.Error()) {
return nil, membership.ErrMemberNotLearner }
return nil, fmt.Errorf("member promote: unknown error(%s)", string(b))
}
if resp.StatusCode == http.StatusNotFound {
return nil, membership.ErrIDNotFound }
// 其他类型的错误
if resp.StatusCode != http.StatusOK {
// all other types of errors
return nil, fmt.Errorf("member promote: unknown error(%s)", string(b))
}
var membs []*membership.Member
if err := json.Unmarshal(b, &membs); err != nil {
return nil, err } // 反序列化请求响应内容
return membs, nil
}
如下server/etcdserver/adapters.go中的GetMembersVersions也是使用peerRt获取MembersVersions。
func (s *serverVersionAdapter) GetMembersVersions() map[string]*version.Versions {
return getMembersVersions(s.lg, s.cluster, s.MemberId(), s.peerRt, s.Cfg.ReqTimeout())
}
边栏推荐
- Could not set property ‘id‘ of ‘class XX‘ with value ‘XX‘ argument type mismatch 解决办法
- CAN和CAN FD
- 53. Maximum subarray sum: give you an integer array num, please find a continuous subarray with the maximum sum (the subarray contains at least one element) and return its maximum sum.
- "Baidu Cup" CTF competition in September, web:sql
- FPGA learning notes: vivado 2019.1 add IP MicroBlaze
- Write API documents first or code first?
- Usage, installation and use of TortoiseSVN
- Operational research 68 | the latest impact factors in 2022 were officially released. Changes in journals in the field of rapid care
- [MySQL usage Script] catch all MySQL time and date types and related operation functions (3)
- leetcode 10. Regular Expression Matching 正则表达式匹配 (困难)
猜你喜欢
Binder通信过程及ServiceManager创建过程
Datapipeline was selected into the 2022 digital intelligence atlas and database development report of China Academy of communications and communications
FPGA learning notes: vivado 2019.1 add IP MicroBlaze
[notes of in-depth study paper]transbtsv2: wider instead of deep transformer for medical image segmentation
Could not set property 'ID' of 'class xx' with value 'XX' argument type mismatch solution
Record in-depth learning - some bug handling
Laravel框架运行报错:No application encryption key has been specified
[deep learning paper notes] hnf-netv2 for segmentation of brain tumors using multimodal MR imaging
A detailed explanation of ASCII code, Unicode and UTF-8
Can and can FD
随机推荐
Can and can FD
Flutter InkWell & Ink组件
Solve the problem of invalid uni app configuration page and tabbar
DataPipeline双料入选中国信通院2022数智化图谱、数据库发展报告
DataPipeline双料入选中国信通院2022数智化图谱、数据库发展报告
Wonderful express | Tencent cloud database June issue
ASEMI整流桥HD06参数,HD06图片,HD06应用
Difference between avc1 and H264
stm32逆向入门
[MySQL usage Script] catch all MySQL time and date types and related operation functions (3)
JS to determine whether an element exists in the array (four methods)
记录一下在深度学习-一些bug处理
Clock cycle
redis6主从复制及集群
【Hot100】33. 搜索旋转排序数组
关于 Notion-Like 工具的反思和畅想
What are the private addresses
Go pointer
【Hot100】34. 在排序数组中查找元素的第一个和最后一个位置
从外卖点单浅谈伪需求