peer定义了获取远程数据的框架?
先有两个interface,为peer必须实现的接口
```// ProtoGetter is the interface that must be implemented by a peer.
type ProtoGetter interface {
Get(ctx context.Context, in *pb.GetRequest, out *pb.GetResponse) error
}
// PeerPicker is the interface that must be implemented to locate
// the peer that owns a specific key.
//peer必须实现的接口
type PeerPicker interface {
// PickPeer returns the peer that owns the specific key
// and true to indicate that a remote peer was nominated.
// It returns nil, false if the key owner is the current peer.
PickPeer(key string) (peer ProtoGetter, ok bool)
}
peerpicker接口的方法给定一个字符串,返回一个ProtoGetter,以及表示是否成功的ok,如果是单节点的话则用的是NoPeers,分布式情况下使用HTTPPool来代替NoPeers
// NoPeers is an implementation of PeerPicker that never finds a peer.
type NoPeers struct{}
根据groupName来返回peerpicker
func getPeers(groupName string) PeerPicker {
if portPicker == nil {
return NoPeers{}
}
pk := portPicker(groupName)
if pk == nil {
pk = NoPeers{}
}
return pk
}
函数类型,返回PeerPicker,根据上下文理解这个只会初始化一次.在Httppool中可以看到
var (
portPicker func(groupName string) PeerPicker
)
func RegisterPeerPicker(fn func() PeerPicker) {
if portPicker != nil {
panic("RegisterPeerPicker called more than once")
}
portPicker = func(_ string) PeerPicker { return fn() }
}
func RegisterPerGroupPeerPicker(fn func(groupName string) PeerPicker) {
if portPicker != nil {
panic("RegisterPeerPicker called more than once")
}
portPicker = fn
}
总结下这个文件里的调用顺序应该就是protpicker->PeerPicker->ProtoGetter->Get
网友评论