Indexer
Indexer是client-go提供的一种缓存机制,通过检索本地缓存而不是直接请求apiserver,可以大大降低apiserver的负载压力。
Indexer由Store接口与Index相关操作的接口函数组成。而它的实现是由cache来实现,cache主要是涉及两个类型:
- ThreadSafeStore
- KeyFunc
我们来看一下Indexer接口中的Add方法(也可以认为是Store接口中的方法)
1
2
3
4
5
6
7
8
9
| // Add inserts an item into the cache.
func (c *cache) Add(obj interface{}) error {
key, err := c.keyFunc(obj)
if err != nil {
return KeyError{obj, err}
}
c.cacheStorage.Add(key, obj)
return nil
}
|
keyFunc方法可以获取资源的Key,然后调用cacheStorage.Add方法完成对应的增删改查过程。
1
| type KeyFunc func(obj interface{}) (string, error)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| // DeletionHandlingMetaNamespaceKeyFunc checks for
// DeletedFinalStateUnknown objects before calling
// MetaNamespaceKeyFunc.
func DeletionHandlingMetaNamespaceKeyFunc(obj interface{}) (string, error) {
if d, ok := obj.(DeletedFinalStateUnknown); ok {
return d.Key, nil
}
return MetaNamespaceKeyFunc(obj)
}
func MetaNamespaceKeyFunc(obj interface{}) (string, error) {
if key, ok := obj.(ExplicitKey); ok {
return string(key), nil
}
objName, err := ObjectToName(obj)
if err != nil {
return "", err
}
return objName.String(), nil
}
|