0. 概述
在上一篇文章中介绍了 raft 读请求源码走读,本文继续结合 etcd-raft 源码介绍 raft 写请求流程。
需要说明的是,本文使用的是单节点集群环境,后续会补充多节点集群环境加以介绍。
1. 写请求流程
1.1 客户端写入请求
客户端通过 PUT 请求写入键值对请求:- curl -L http://127.0.0.1:12380/my-key -XPUT -d hello
复制代码 该请求被 httpKVAPI 处理:
[code]func (h *httpKVAPI) ServeHTTP(w http.ResponseWriter, r *http.Request) { key := r.RequestURI defer r.Body.Close() switch r.Method { case http.MethodPut: // 匹配 PUT 方法,处理写请求 v, err := io.ReadAll(r.Body) if err != nil { log.Printf("Failed to read on PUT (%v)\n", err) http.Error(w, "Failed on PUT", http.StatusBadRequest) return } h.store.Propose(key, string(v)) // 调用 h.store.Propose 提交该请求 w.WriteHeader(http.StatusNoContent) } ...}func (s *kvstore) Propose(k string, v string) { var buf strings.Builder if err := gob.NewEncoder(&buf).Encode(kv{k, v}); err != nil { log.Fatal(err) } s.proposeC |