Skip to content

第15章:负载均衡 ​

本章目标 ​

理解 gRPC Client-side 负载均衡


15.1 gRPC 负载均衡方式 ​

方式1:Proxy LB(传统)
Client → LB(nginx/envoy) → Server1/Server2

方式2:Client-side LB(gRPC 推荐)
Client → [Name Resolver + LB策略] → 直连 Server1/Server2

15.2 Client-side 负载均衡 ​

go
import _ "google.golang.org/grpc/balancer/roundrobin"

conn, _ := grpc.Dial(
	"dns:///localhost:50051,localhost:50052",
	grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`),
	grpc.WithTransportCredentials(insecure.NewCredentials()),
)
// DNS 解析多个 IP → Round Robin 分配

15.3 连接管理 ​

go
conn, _ := grpc.Dial(target,
	grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`),
	grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(10*1024*1024)),
)

defer conn.Close()
// gRPC 自动管理连接池、重连

15.4 一致性哈希(需要时) ​

适合有状态服务(同一用户请求路由到同一节点):

go
// 使用一致性哈希 balancer
import _ "github.com/makasim/grpc-go-consul-resolver"
// 配置一致性哈希策略

本章小结 ​

  • gRPC 支持 Client-side LB(默认 Proxy LB)
  • Round Robin:"loadBalancingPolicy":"round_robin"
  • 用 DNS resolver + 多地址实现简单负载均衡
  • gRPC 自动管理连接池

练习题 ​

  1. 启动两个 Server(不同端口),Client 用 Round Robin 连接。
  2. 观察请求是否均匀分配到两个 Server。

把零散知识,整理成可以反复走的路。