milvus各组件的结构体分析2
分析各组件的服务端API。
rootcoord
            
            
              go
              
              
            
          
          // Server grpc wrapper
type Server struct {
    //自身提供的api功能接口
	rootCoord   types.RootCoordComponent
	grpcServer  *grpc.Server
	grpcErrChan chan error
	wg sync.WaitGroup
	ctx    context.Context
	cancel context.CancelFunc
	serverID atomic.Int64
	etcdCli    *clientv3.Client
	tikvCli    *txnkv.Client
	dataCoord  types.DataCoordClient
	queryCoord types.QueryCoordClient
	newDataCoordClient  func(string, *clientv3.Client) types.DataCoordClient
	newQueryCoordClient func(string, *clientv3.Client) types.QueryCoordClient
}
        types.RootCoordComponent是一个接口。
包含了dataCoord和queryCoord客户端。
dataCoord由newDataCoordClient赋值。
queryCoord由newQueryCoordClient赋值。
从结构体可以看出:
1.Server结构体包裹了一个rootCoord接口,用来实现rootCoord的一些API功能。
            
            
              go
              
              
            
          
          type RootCoordComponent interface {
    RootCoord
    SetAddress(address string)
    SetEtcdClient(etcdClient *clientv3.Client)
    SetTiKVClient(client *txnkv.Client)
    UpdateStateCode(commonpb.StateCode)
    SetDataCoordClient(dataCoord DataCoordClient) error
    SetQueryCoordClient(queryCoord QueryCoordClient) error
    SetProxyCreator(func(ctx context.Context, addr string, nodeID int64) (ProxyClient, error))
    GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error)
}
        RootCoord也是一个接口,里面包含接口Component,这个接口有方法
Init()、Start()、Stop()、Regiter()。
2.Server结构体包含了客户端etcdCli和tikvCli,根据配置文件选择使用etcd还是tikv作为元数据存储。
3.包含一个grpcServer结构体
4.Server结构体包含了dataCoord客户端,说明rootcoord会和datacoord通信。
types.DataCoordClient是一个接口。
            
            
              go
              
              
            
          
          type DataCoordClient interface {
    io.Closer
    datapb.DataCoordClient
}
        datapb.DataCoordClient也是一个接口,是datacoord service的客户端接口。
5.Server结构体包含了queryCoord客户端,说明rootcoord会和queryCoord通信。
types.QueryCoordClient是一个接口。
            
            
              go
              
              
            
          
          type QueryCoordClient interface {
	io.Closer
	querypb.QueryCoordClient
}
        querypb.QueryCoordClient也是一个接口,是querycoord service的客户端接口。
datacoord
没有indexcoord,和datacoord合并。
            
            
              go
              
              
            
          
          // Server is the grpc server of datacoord
type Server struct {
	ctx    context.Context
	cancel context.CancelFunc
	serverID atomic.Int64
	wg        sync.WaitGroup
	dataCoord types.DataCoordComponent
	etcdCli *clientv3.Client
	tikvCli *txnkv.Client
	grpcErrChan chan error
	grpcServer  *grpc.Server
}
        从结构体可以看出:
1.Server结构体包裹了一个dataCoord接口,用来实现dataCoord的一些API功能。
            
            
              go
              
              
            
          
          type DataCoordComponent interface {
    DataCoord
    SetAddress(address string)
    SetEtcdClient(etcdClient *clientv3.Client)
    SetTiKVClient(client *txnkv.Client)
    SetRootCoordClient(rootCoord RootCoordClient)
    SetDataNodeCreator(func(context.Context, string, int64) (DataNodeClient, error))
    SetIndexNodeCreator(func(context.Context, string, int64) (IndexNodeClient, error))
}
        2.Server结构体包含了客户端etcdCli和tikvCli,根据配置文件选择使用etcd还是tikv作为元数据存储。
3.包含一个grpcServer结构体。
datacoord并不像rootcoord包含有其它组件的客户端。
querycoord
            
            
              go
              
              
            
          
          // Server is the grpc server of QueryCoord.
type Server struct {
	wg         sync.WaitGroup
	loopCtx    context.Context
	loopCancel context.CancelFunc
	grpcServer *grpc.Server
	serverID atomic.Int64
	grpcErrChan chan error
	queryCoord types.QueryCoordComponent
	factory dependency.Factory
	etcdCli *clientv3.Client
	tikvCli *txnkv.Client
	dataCoord types.DataCoordClient
	rootCoord types.RootCoordClient
}
        从结构体可以看出:
1.Server结构体包裹了一个querycoord接口,用来实现querycoord的一些API功能。
            
            
              go
              
              
            
          
          type QueryCoordComponent interface {
    QueryCoord
    SetAddress(address string)
    SetEtcdClient(etcdClient *clientv3.Client)
    SetTiKVClient(client *txnkv.Client)
    UpdateStateCode(stateCode commonpb.StateCode)
    SetDataCoordClient(dataCoord DataCoordClient) error
    SetRootCoordClient(rootCoord RootCoordClient) error
    SetQueryNodeCreator(func(ctx context.Context, addr string, nodeID int64) (QueryNodeClient, error))
}
        2.Server结构体包含了客户端etcdCli和tikvCli,根据配置文件选择使用etcd还是tikv作为元数据存储。
3.包含一个grpcServer结构体。
4.Server结构体包含了dataCoord客户端,说明querycoord会和datacoord通信。
5.Server结构体包含了rootCoord客户端,说明querycoord会和rootCoord通信。
indexcoord
没有indexcoord,和datacoord合并。
datanode
            
            
              go
              
              
            
          
          type Server struct {
	datanode    types.DataNodeComponent
	wg          sync.WaitGroup
	grpcErrChan chan error
	grpcServer  *grpc.Server
	ctx         context.Context
	cancel      context.CancelFunc
	etcdCli     *clientv3.Client
	factory     dependency.Factory
	serverID atomic.Int64
	rootCoord types.RootCoord
	dataCoord types.DataCoord
	newRootCoordClient func(string, *clientv3.Client) (types.RootCoordClient, error)
	newDataCoordClient func(string, *clientv3.Client) (types.DataCoordClient, error)
}
        从结构体可以看出:
1.Server结构体包裹了一个datanode接口,用来实现datanode的一些API功能。
            
            
              go
              
              
            
          
          type DataNodeComponent interface {
    DataNode
    UpdateStateCode(stateCode commonpb.StateCode)
    GetStateCode() commonpb.StateCode
    SetAddress(address string)
    GetAddress() string
    SetEtcdClient(etcdClient *clientv3.Client)
    SetRootCoordClient(rootCoord RootCoordClient) error
    SetDataCoordClient(dataCoord DataCoordClient) error
}
        2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含一个grpcServer结构体。
4.包含了rootCoord和dataCoord接口。
indexnode
            
            
              go
              
              
            
          
          // Server is the grpc wrapper of IndexNode.
type Server struct {
	indexnode types.IndexNodeComponent
	grpcServer  *grpc.Server
	grpcErrChan chan error
	serverID atomic.Int64
	loopCtx    context.Context
	loopCancel func()
	loopWg     sync.WaitGroup
	etcdCli *clientv3.Client
}
        从结构体可以看出:
1.Server结构体包裹了一个indexnode接口,用来实现indexnode的一些API功能。
            
            
              go
              
              
            
          
          type IndexNodeComponent interface {
    IndexNode
    SetAddress(address string)
    GetAddress() string
    SetEtcdClient(etcdClient *clientv3.Client)
    UpdateStateCode(stateCode commonpb.StateCode)
}
        2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含一个grpcServer结构体。
不包含其它组件。
querynode
            
            
              go
              
              
            
          
          // Server is the grpc server of QueryNode.
type Server struct {
	querynode   types.QueryNodeComponent
	wg          sync.WaitGroup
	ctx         context.Context
	cancel      context.CancelFunc
	grpcErrChan chan error
	serverID atomic.Int64
	grpcServer *grpc.Server
	etcdCli *clientv3.Client
}
        从结构体可以看出:
1.Server结构体包裹了一个querynode接口,用来实现querynode的一些API功能。
            
            
              go
              
              
            
          
          type QueryNodeComponent interface {
    QueryNode
    UpdateStateCode(stateCode commonpb.StateCode)
    SetAddress(address string)
    GetAddress() string
    SetEtcdClient(etcdClient *clientv3.Client)
}
        2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含一个grpcServer结构体。
不包含其它组件。
proxy
            
            
              go
              
              
            
          
          // Server is the Proxy Server
type Server struct {
	ctx                context.Context
	wg                 sync.WaitGroup
	proxy              types.ProxyComponent
	httpListener       net.Listener
	grpcListener       net.Listener
	tcpServer          cmux.CMux
	httpServer         *http.Server
	grpcInternalServer *grpc.Server
	grpcExternalServer *grpc.Server
	serverID atomic.Int64
	etcdCli          *clientv3.Client
	rootCoordClient  types.RootCoordClient
	dataCoordClient  types.DataCoordClient
	queryCoordClient types.QueryCoordClient
}
        从结构体可以看出:
1.Server结构体包裹了一个proxy接口,用来实现proxy的一些API功能。
            
            
              go
              
              
            
          
          type ProxyComponent interface {
    Proxy
    SetAddress(address string)
    GetAddress() string
    SetEtcdClient(etcdClient *clientv3.Client)
    SetRootCoordClient(rootCoord RootCoordClient)
    SetDataCoordClient(dataCoord DataCoordClient)
    SetQueryCoordClient(queryCoord QueryCoordClient)
    SetQueryNodeCreator(func(ctx context.Context, addr string, nodeID int64) (QueryNodeClient, error))
    GetRateLimiter() (Limiter, error)
    UpdateStateCode(stateCode commonpb.StateCode)
}
        2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含客户端rootCoordClient、dataCoordClient、queryCoordClient。