美文网首页
groupcache peer.go

groupcache peer.go

作者: n_xy | 来源:发表于2021-04-08 17:20 被阅读0次

    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

    相关文章

      网友评论

          本文标题:groupcache peer.go

          本文链接:https://www.haomeiwen.com/subject/yqfxkltx.html