路由与负载均衡

接口实现

路由与负载均衡主要的接口是 Selector,在同目录下也提供了一个默认的 Selector 实现,该实现可以通过替换 NodeBuilderFilterBalancer 来分别实现节点权重计算算法、服务路由过滤策略、负载均衡算法的可插拔

  1. type Selector interface {
  2. // Selector 内部维护的服务节点列表通过 Rebalancer 接口来更新
  3. Rebalancer
  4. // Select nodes
  5. // if err == nil, selected and done must not be empty.
  6. Select(ctx context.Context, opts ...SelectOption) (selected Node, done DoneFunc, err error)
  7. }
  8. // 通过 Rebalancer 实现服务节点变更感知
  9. type Rebalancer interface {
  10. Apply(nodes []Node)
  11. }

已支持的实现:

  • wrr : Weighted round robin (Kratos Client 内置默认算法)
  • p2c : Power of two choices
  • random : Random

使用方式

HTTP Client

  1. import "github.com/go-kratos/kratos/v2/selector/wrr"
  2. import "github.com/go-kratos/kratos/v2/selector/filter"
  3. // 创建路由 Filter:筛选版本号为"2.0.0"的实例
  4. filter := filter.Version("2.0.0")
  5. // 创建 P2C 负载均衡算法 Selector,并将路由 Filter 注入
  6. selector.SetGlobalSelector(wrr.NewBuilder())
  7. hConn, err := http.NewClient(
  8. context.Background(),
  9. http.WithEndpoint("discovery:///helloworld"),
  10. http.WithDiscovery(r),
  11. http.WithNodeFilter(filter)
  12. )

gRPC Client

  1. import "github.com/go-kratos/kratos/v2/selector/wrr"
  2. import "github.com/go-kratos/kratos/v2/selector/filter"
  3. // 创建路由 Filter:筛选版本号为"2.0.0"的实例
  4. filter := filter.Version("2.0.0")
  5. // 由于 gRPC 框架的限制,只能使用全局 balancer name 的方式来注入 selector
  6. selector.SetGlobalSelector(wrr.NewBuilder())
  7. conn, err := grpc.DialInsecure(
  8. context.Background(),
  9. grpc.WithEndpoint("discovery:///helloworld"),
  10. grpc.WithDiscovery(r),
  11. // 通过 grpc.WithFilter 注入路由 Filter
  12. grpc.WithNodeFilter(filter),
  13. )