You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.7 KiB

2 years ago
package selector
import (
"context"
"github.com/go-kratos/kratos/v2/errors"
)
// ErrNoAvailable is no available node.
var ErrNoAvailable = errors.ServiceUnavailable("no_available_node", "")
// Selector is node pick balancer.
type Selector interface {
Rebalancer
// Select nodes
// if err == nil, selected and done must not be empty.
Select(ctx context.Context, opts ...SelectOption) (selected Node, done DoneFunc, err error)
}
// Rebalancer is nodes rebalancer.
type Rebalancer interface {
// Apply is apply all nodes when any changes happen
Apply(nodes []Node)
}
// Builder build selector
type Builder interface {
Build() Selector
}
// Node is node interface.
type Node interface {
// Scheme is service node scheme
Scheme() string
// Address is the unique address under the same service
Address() string
// ServiceName is service name
ServiceName() string
// InitialWeight is the initial value of scheduling weight
// if not set return nil
InitialWeight() *int64
// Version is service node version
Version() string
// Metadata is the kv pair metadata associated with the service instance.
// version,namespace,region,protocol etc..
Metadata() map[string]string
}
// DoneInfo is callback info when RPC invoke done.
type DoneInfo struct {
// Response Error
Err error
// Response Metadata
ReplyMD ReplyMD
// BytesSent indicates if any bytes have been sent to the server.
BytesSent bool
// BytesReceived indicates if any byte has been received from the server.
BytesReceived bool
}
// ReplyMD is Reply Metadata.
type ReplyMD interface {
Get(key string) string
}
// DoneFunc is callback function when RPC invoke done.
type DoneFunc func(ctx context.Context, di DoneInfo)