通用的CP系统有etcd和consul, 通用的对立面就是专用系统. 所以在某些场合是有这种需求的.
然而etcd embed的可用性极差, Windows上面跑会出现各种问题, 而且不能定制协议, 你必须得用etcd定义好的协议和客户端来和etcd集群通讯. 所以这时候的选择:
1. 忍着
2. 自己实现一个raft算法库, 在这上面做应用
有一定的可能性, 起码MIT 6.824可以做出来, 但是和工业应用还是有很大的差距
3. 找一个工业级raft库, 然后在这上面做应用
这时候到Raft Consensus Algorithm上面看看就能找到几个可选的Raft算法库, 例如braft, hashicorp/raft, lni/dragonboat.
但是呢, C++代码比较难写的, 所以就pass掉了braft. 就剩下consul raft和dragonboat.
本文就用consul raft做一个简单的KeyValue服务.
首先前端用的gin, 提供put/get/inc/delete几个接口, 三个接口都走raft状态机, 因为要支持多节点, 所以内部非leader节点就需要把请求转发给leader节点.
前端的代码类似于这样:
func (this *ApiService) Start() error {
//转发请求给leader节点
this.router.Use(this.proxyHandler())
this.router.POST("/get", this.Get)
this.router.POST("/put", this.Put)
this.router.POST("/delete", this.Delete)
this.router.POST("/inc", this.Inc)
a