[{"data":1,"prerenderedAt":464},["ShallowReactive",2],{"blog:\u002Fblog\u002F2020\u002F09\u002F15\u002Fgrpc-load-balancing\u002F":3},{"id":4,"title":5,"body":6,"categories":402,"comments":404,"date":405,"description":406,"draft":407,"extension":408,"legacySlug":409,"meta":410,"navigation":404,"path":456,"seo":457,"stem":458,"tags":459,"updated":462,"__hash__":463},"blog\u002Fblog\u002F2020\u002F09\u002F15\u002FgRPC-Load-Balancing.md","【译】gRPC负载均衡(gRPC博客)",{"type":7,"value":8,"toc":390},"minimark",[9,38,41,44,49,52,71,74,77,82,88,91,98,101,106,109,172,175,178,181,186,231,234,237,240,244,249,262,265,270,273,276],[10,11,12,13,20,21,25,26,31,32,37],"p",{},"原文:",[14,15,19],"a",{"href":16,"rel":17},"https:\u002F\u002Fgrpc.io\u002Fblog\u002Fgrpc-load-balancing\u002F",[18],"nofollow","Load Balancing in gRPC"," \t",[22,23,24],"strong",{},"June 15, 2017","  makdharma, Google\n翻译整理: ",[14,27,30],{"href":28,"rel":29},"https:\u002F\u002Fzhizhi123.com",[18],"本站"," 译文链接:",[14,33,36],{"href":34,"rel":35},"https:\u002F\u002Fwww.zhizhi123.com\u002Fblog\u002F2020\u002F09\u002F15\u002Fgrpc-load-balancing\u002F",[18],"【译】gRPC负载均衡","。 转载请保留原文出处和译文译者和出处。",[10,39,40],{},"这篇文章描述了在部署gRPC时看到的各种负载平衡场景。如果您使用具有多个后端的gRPC，则此文档适合您。",[10,42,43],{},"大规模gRPC部署通常具有许多相同的后端实例和许多客户端。 每个服务器都有一定的容量。 负载平衡用于在可用服务器之间最佳地分配来自客户端的负载。",[45,46,48],"h2",{"id":47},"为何选用grpc","为何选用gRPC?",[10,50,51],{},"gRPC是在HTTP\u002F2之上实现的现代RPC协议。HTTP\u002F2是一个第7层(应用层)协议，运行在TCP协议(第4层-传输层)之上，TCP协议运行在IP协议(第3层-网络层)之上。与传统的HTTP\u002FREST\u002FJSON机制相比，gRPC有许多优点，例如:",[53,54,55,59,62,65,68],"ol",{},[56,57,58],"li",{},"二进制协议（HTTP\u002F2）",[56,60,61],{},"在一个连接上多路复用多个请求(HTTP\u002F2)",[56,63,64],{},"协议头压缩(HTTP\u002F2)",[56,66,67],{},"强类型服务和消息定义(Protobuf)",[56,69,70],{},"多种语言的惯用客户端\u002F服务器库实现",[10,72,73],{},"此外，gRPC与生态系统组件无缝集成，例如服务发现，名称解析器，负载平衡器，跟踪和监视等。",[45,75,76],{"id":76},"负载均衡选项",[78,79,81],"h3",{"id":80},"代理模式还是客户端模式","代理模式还是客户端模式？",[10,83,84],{},[85,86,87],"em",{},"注意：代理负载平衡在某些文献中也称为服务器端负载平衡",[10,89,90],{},"选择代理负载平衡还是客户端负载平衡是一个主要的架构选择。在代理负载平衡中，客户端向负载平衡器(LB)代理发出rpc。LB将RPC调用分发到一个可用的后端服务器，后端服务器实现了为调用提供服务的实际逻辑。LB跟踪每个后端上的负载，并实现公平分配负载的算法。客户机本身并不知道后端服务器。客户可能是不可信的。此体系结构通常用于面向用户的服务，其中来自开放internet的客户端可以连接到数据中心中的服务器，如下图所示。在这个场景中，客户机向LB发出请求(#1)。LB将请求传递给其中一个后端(#2)，后端将负载报告给LB(#3)。",[10,92,93],{},[94,95],"img",{"alt":96,"src":97},"image alt text","\u002Fblog-assets\u002FgRPC-Load-Balancing\u002Fimage_0.png",[10,99,100],{},"在客户端负载平衡中，客户端知道多个后端服务器，并为每个RPC请求选择一个。 客户端从后端服务器获取负载报告，并且客户端实施负载平衡算法。 在更简单的配置中，不考虑服务器负载，客户端只能在可用服务器之间进行轮询。 如下图所示。 如您所见，客户端向特定后端（＃1）发出请求。 后端通常在执行客户端RPC的同一连接上以负载信息（＃2）进行响应。 客户端然后更新其内部状态。",[10,102,103],{},[94,104],{"alt":96,"src":105},"\u002Fblog-assets\u002FgRPC-Load-Balancing\u002Fimage_1.png",[10,107,108],{},"下表概述了每种模型的优缺点。",[110,111,112,127],"table",{},[113,114,115],"thead",{},[116,117,118,121,124],"tr",{},[119,120],"th",{},[119,122,123],{},"代理模式",[119,125,126],{},"客户端模式",[128,129,130,142],"tbody",{},[116,131,132,136,139],{},[133,134,135],"td",{},"优点",[133,137,138],{},"客户端对后端无感知。可以与不受信任的客户端一起使用",[133,140,141],{},"高性能，因为消除了多余的跃点",[116,143,144,147,157],{},[133,145,146],{},"缺点",[133,148,149,150,153,154,156],{},"1. LB在数据路径中",[151,152],"br",{}," 2. 更高的延迟 ",[151,155],{},"3. LB吞吐量可能限制其伸缩性",[133,158,159,160,162,163,165,166,168,169,171],{},"1.复杂的客户端 ",[151,161],{},"2. 客户端跟踪服务器负载和运行状况 ",[151,164],{},"3.客户端实现负载均衡算法",[151,167],{},"4.每种语言的实现和维护负担",[151,170],{},"5.客户端需要被信任，或者信任边界需要由后备LB处理。",[78,173,174],{"id":174},"代理负载均衡器选项",[10,176,177],{},"代理负载均衡可以运行在L3\u002FL4(传输层)或者L7(应用层)。在传输层负载均衡中，服务器终止TCP连接并打开与所选后端的另一个连接。应用程序数据（HTTP\u002F2和gRPC帧）只是简单地从客户端连接复制到后端连接。通过设计，L3\u002FL4 LB做很少的处理，与L7 LB相比增加的延迟更少，而且由于消耗更少的资源而更便宜。",[10,179,180],{},"在L7(应用层)负载均衡中，LB终止并解析HTTP\u002F2协议。LB可以检查每个请求并根据请求内容分配后端。例如，作为HTTP标头的一部分发送的会话cookie可用于与特定后端关联，因此对该回话的所有请求均由同一后端提供。一旦LB选择了一个合适的后端，它将创建到该后端的新HTTP \u002F 2连接。然后，它将从客户端接收的HTTP\u002F2流转发到所选的后端。使用HTTP \u002F 2，LB可以在多个后端之间分配来自一个客户端的流。",[182,183,185],"h4",{"id":184},"l3l4-传输层-vs-l7应用层","L3\u002FL4 (传输层) vs L7(应用层)",[110,187,188,198],{},[113,189,190],{},[116,191,192,195],{},[119,193,194],{},"用例",[119,196,197],{},"推荐",[128,199,200,208,216,224],{},[116,201,202,205],{},[133,203,204],{},"RPC负载在连接之间变化很大",[133,206,207],{},"使用应用层LB",[116,209,210,213],{},[133,211,212],{},"存储或计算关联很重要",[133,214,215],{},"使用应用层LB并且使用cookie或者类似东西路由请求到正确的后端",[116,217,218,221],{},[133,219,220],{},"在代理中的最小化资源使用比功能更重要",[133,222,223],{},"使用L3\u002FL4 LB",[116,225,226,229],{},[133,227,228],{},"减少延迟是最重要的",[133,230,223],{},[78,232,233],{"id":233},"客户端负载均衡选项",[182,235,236],{"id":236},"胖客户端",[10,238,239],{},"胖客户端方法意味着在客户端中实现了负载平衡智能。 客户端负责跟踪可用服务器，它们的工作负载以及用于选择服务器的算法。 客户端通常集成与其他基础架构通信的库，例如服务发现，名称解析，配额管理等。",[182,241,243],{"id":242},"后备lookaside负载均衡","后备（lookaside）负载均衡",[10,245,246],{},[85,247,248],{},"注意：后备负载均衡器也称为外部负载均衡器或单臂负载均衡器",[10,250,251,252,256,257,261],{},"通过后备负载均衡，可以在专用的LB服务器中实现负载均衡智能。客户端请求后备LB，LB响应以可使用的最佳服务器列表。在后备LB中统一了保持服务器状态和LB算法实现的繁重工作。 请注意，客户端可能会选择在LB中实现的复杂算法之上实现简单算法。gRPC使用此模型定义了一个客户端和LB之间的通信协议。查看文章 ",[14,253,19],{"href":254,"rel":255},"https:\u002F\u002Fgithub.com\u002Fgrpc\u002Fgrpc\u002Fblob\u002Fmaster\u002Fdoc\u002Fload-balancing.md",[18]," (该文档译文:",[14,258,36],{"href":259,"rel":260},"https:\u002F\u002Fwww.zhizhi123.com\u002Fblog\u002F2020\u002F09\u002F11\u002Fload-balancing-in-grpc\u002F",[18],")以获得详细信息.",[10,263,264],{},"下图说明了这种方法。 客户端从后备LB（＃1）获得至少一个地址。 然后，客户端使用该地址进行RPC（＃2），然后服务器将负载报告发送到LB（＃3）。 后备LB与其他基础结构进行通信，例如名称解析，服务发现等（＃4）。",[10,266,267],{},[94,268],{"alt":96,"src":269},"\u002Fblog-assets\u002FgRPC-Load-Balancing\u002Fimage_2.png",[45,271,272],{"id":272},"推荐和最佳实践",[10,274,275],{},"根据特定的部署和约束条件，我们建议以下内容。",[110,277,278,288],{},[113,279,280],{},[116,281,282,285],{},[119,283,284],{},"设置（Setup）",[119,286,287],{},"建议",[128,289,290,312,342,365],{},[116,291,292,298],{},[133,293,294,295,297],{},"1.客户端和服务器之间的流量非常大",[151,296],{},"2.客户端可以被信任",[133,299,300,303,305,306,311],{},[22,301,302],{},"胖客户端负载均衡",[151,304],{},"客户端LB + ZooKeeper\u002FEtcd\u002FConsul\u002FEureka.",[14,307,310],{"href":308,"rel":309},"https:\u002F\u002Fgithub.com\u002Fmakdharma\u002Fgrpc-zookeeper-lb",[18],"ZooKeeper Example",".",[116,313,314,320],{},[133,315,316,317,319],{},"1.传统设置-许多客户端通过代理连接到服务",[151,318],{},"2.需要在服务器和客户端之间设置信任边界",[133,321,322,325,327,328,330,331,336,338,339,341],{},[22,323,324],{},"代理负载均衡",[151,326],{},"1.使用GCLB（谷歌云负载均衡）的L3\u002FL4 LB（如果使用谷歌云平台）",[151,329],{},"2.使用haproxy的L3\u002FL4 LB - ",[14,332,335],{"href":333,"rel":334},"https:\u002F\u002Fgist.github.com\u002Fthpham\u002F114d20de8472b2cef966",[18],"Config file",[151,337],{},"3.Nginx就要支持了（备注：NGINX 1.13.10已经支持）",[151,340],{},"4.如果需要会话粘性-使用Envoy作为代理的L7 LB",[116,343,344,353],{},[133,345,346,347,349,350,352],{},"1.微服务-数据中心中有N个客户端，M个服务器",[151,348],{},"2.极高的性能要求（低延迟，高流量）",[151,351],{},"3.客户可以是不受信任的",[133,354,355,357,359,360,364],{},[22,356,243],{},[151,358],{},"客户端LB使用",[14,361,363],{"href":254,"rel":362},[18],"gRPC-LB protocol",".推出你自己的实现，hosted gRPC-LB正在工作中",[116,366,367,370],{},[133,368,369],{},"现有的服务网格，例如使用Linkerd或Istio进行的设置",[133,371,372,375,377,378,383,384,389],{},[22,373,374],{},"服务网格",[151,376],{},"使用",[14,379,382],{"href":380,"rel":381},"https:\u002F\u002Fistio.io\u002F",[18],"Istio",", or ",[14,385,388],{"href":386,"rel":387},"https:\u002F\u002Fgithub.com\u002Flyft\u002Fenvoy",[18],"Envoy","的内置LB",{"title":391,"searchDepth":392,"depth":392,"links":393},"",2,[394,395,401],{"id":47,"depth":392,"text":48},{"id":76,"depth":392,"text":76,"children":396},[397,399,400],{"id":80,"depth":398,"text":81},3,{"id":174,"depth":398,"text":174},{"id":233,"depth":398,"text":233},{"id":272,"depth":392,"text":272},[403],"架构",true,"2020-09-15","原文:Load Balancing in gRPC June 15, 2017 makdharma, Google 翻译整理: 本站 译文链接:【译】gRPC负载均衡。 转载请保留原文出处和译文译者和出处。 这篇文章描述了在部署gRPC时看到的各种负载平衡场景。如果您使用具有多个后端的gRPC，则",false,"md","gRPC-Load-Balancing",{"excerpt":411},{"type":7,"value":412},[413,426,428,430,432,434,446,448,450,452],[10,414,12,415,20,418,25,420,31,423,37],{},[14,416,19],{"href":16,"rel":417},[18],[22,419,24],{},[14,421,30],{"href":28,"rel":422},[18],[14,424,36],{"href":34,"rel":425},[18],[10,427,40],{},[10,429,43],{},[45,431,48],{"id":47},[10,433,51],{},[53,435,436,438,440,442,444],{},[56,437,58],{},[56,439,61],{},[56,441,64],{},[56,443,67],{},[56,445,70],{},[10,447,73],{},[45,449,76],{"id":76},[78,451,81],{"id":80},[10,453,454],{},[85,455,87],{},"\u002Fblog\u002F2020\u002F09\u002F15\u002Fgrpc-load-balancing",{"title":5,"description":406},"blog\u002F2020\u002F09\u002F15\u002FgRPC-Load-Balancing",[460,461],"gRPC","微服务",null,"G_4xQb7TNYspy05W8UTvu3pTSpmtu3nJeBhtLGHUG0A",1783807996125]