ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Go 负载均衡:从轮询到 BFE 自研算法实战

Go 负载均衡:从轮询到 BFE 自研算法实战 Go 负载均衡从轮询到 BFE 自研算法实战客户端负载均衡、服务端 LB、反向代理怎么选本文拆解 LB 是什么、怎么写、怎么测。一、负载均衡分类服务端 LBNginx、F5、AWS ALB客户端 LBgRPC Dial、kubernetes-clientSidecar LBIstio/Linkerd二、轮询 / 加权轮询typeRoundRobinstruct{mu sync.Mutex posintsvrs[]string}func(r*RoundRobin)Next()string{r.mu.Lock();deferr.mu.Unlock()s:r.svrs[r.pos%len(r.svrs)]r.posreturns}加权版按权重算 N 个元素。三、最少连接 / 加权最少typeLeastConnstruct{mu sync.Mutex statsmap[string]int}func(l*LeastConn)Next()string{l.mu.Lock();deferl.mu.Unlock()varbeststring;min:math.MaxIntfork,v:rangel.stats{ifvmin{minv;bestk}}returnbest}适合长连接场景如 gRPC streaming。四、一致性哈希typeConsistentstruct{ringmap[uint32]string}func(c*Consistent)Add(nodestring,slotsint){fori:0;islots;i{h:hash(nodestrconv.Itoa(i))c.ring[h]node}}func(c*Consistent)Get(keystring)string{h:hash(key)keys:[]uint32{}fork:rangec.ring{keysappend(keys,k)}sort.Slice(keys,func(i,jint)bool{returnkeys[i]keys[j]})idx:sort.Search(len(keys),func(iint)bool{returnkeys[i]h})returnc.ring[keys[idx%len(keys)]]}适合缓存集群相同 key 落相同节点。五、自适应 LB// 综合指标打分CPU、Latency、ErrorRate 越低权重越高typeAdaptivestruct{metricsmap[string]float64}func(a*Adaptive)Next()string{sorted:sortByScore(a.metrics)returnsorted[0]}需要监控配套采集。六、Server Sidenginx BFE开源 BFEBaidu Front End自动多协议http、tcp、grpcWasm 插件流量染色七、客户端负载均衡RPC Resolverresolver.Register(ConsulResolverBuilder{})conn,err:grpc.Dial(consul:///svc,grpc.WithInsecure(),grpc.WithDefaultServiceConfig({loadBalancingPolicy:round_robin}),)gRPC 内置 round_robin、pick_first 等策略。八、K8s 端 LBimportk8s.io/client-go/kubernetesclientset,_:kubernetes.NewForConfig(config)service,_:clientset.CoreV1().Services(default).Get(user-service,metav1.GetOptions{})for_,ip:rangeservice.Spec.ClusterIPs{fmt.Println(ip)}配合 Endpoints / EndpointSlices下游做 RR。九、踩坑清单LB 缓存健康态网络抖动不要瞬间踢掉版本探测灰度发布需带 weight跨机房 LBgeo-aware or near-real十、生产实战灰度发布typeGrayRulestruct{HeaderstringWeightint}// gin middlewarefuncGrayUser()gin.HandlerFunc{returnfunc(c*gin.Context){ifc.GetHeader(x-version)v2{c.Set(service_pool,v2)return}c.Set(service_pool,v1)}}十一、Sidecar LBIstioapiVersion:networking.istio.io/v1alpha3kind:DestinationRulemetadata:name:user-svcspec:host:user-svctrafficPolicy:loadBalancer:simple:LEAST_REQUESTconsistentHash:useSourceIp:trueLB 治理交给 sidecar。十二、总结与展望服务端 LBnginx/F5客户端 LBgrpc / 自研 SDKSidecarServiceMesh未来eBPF BGP 让跨节点 LB 无感知应用层不再关心。十三、参考文献gRPC 官方文档Load BalancingBFE 文档Nginx upstream 文档
返回列表