一、Gateway負載均衡實現原理
Gateway作為服務網關,實現負載均衡主要是通過兩種方式:第一種是基於Ribbon實現的客戶端負載均衡,第二種是基於Zuul Filter實現的網關負載均衡。客戶端負載均衡使用了Netflix的Ribbon,它是一個基於HTTP和TCP的客戶端負載均衡器。它可以對客戶端請求進行統一的管理和路由,同時對服務進行負載均衡。而網關負載均衡則採用了Zuul Filter來實現,Zuul Filter通過一些規則來定義路由策略,處理請求並將它們轉發到後端服務器。
二、Gateway負載均衡輪詢
輪詢是Gateway中實現負載均衡的一種策略,具體實現方法就是按順序依次將請求轉發到不同的服務器上。這種策略具有簡單、易實現、均衡的特點,但是如果服務器長時間不能響應或者響應時間過長的話,就有可能出現服務器偏斜或者集群壓力增大的情況。
//@RibbonClient的name屬性,調用指定name的服務做負載均衡(服務名不區分大小寫) @FeignClient(name = "demo", configuration = FeignConfig.class, fallback = HelloRemoteFallback.class) public interface HelloRemote { @RequestMapping("/hello") String hello(); }
三、Gateway負載均衡配置
Gateway的負載均衡可以通過配置文件進行設置。通過指定不同的路由規則配置,可以為不同的服務實現不同的路由策略。通過配置多個服務的路由規則,可以對服務實現多元化的負載均衡策略。
#服務名稱 spring: application: name: server-a #聲明服務端口 server: port: 8082 #ribbon負載均衡策略: #RandomRule:隨機策略 #RoundRobinRule:輪詢策略 #RetryRule:重試策略 #WeightedResponseTimeRule:基於響應時間加權的負載均衡策略 ribbon: eureka: enabled: true #所需的最大連接數,默認為1 MaxTotalConnectinos: 10 #對每個服務的請求所需的最大連接數,默認為1 MaxPerRoutes: 2 #請求連接超時時間(毫秒) ConnectTimeout: 3000 #請求處理響應時間(毫秒) ReadTimeout: 5000 #ribbon默認的負載均衡策略 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
四、Gateway負載均衡的區別
在Gateway負載均衡中,除了輪詢策略,還有很多其他的負載均衡策略。如Random(隨機)、ResponseTime(響應速度)等,這些策略都是對某一特定場景下的負載均衡優化。另外,客戶端負載均衡和網關負載均衡的最大區別在於前者是由客戶端進行路由,而後者則是由網關進行路由。這樣可以在一定程度上對服務進行統一的管理和路由,從而降低了服務管理的複雜度。
五、Gateway負載均衡策略
在Gateway中,有眾多負載均衡策略可供選擇。其中較常用的策略有:IP Hash、Round Robin(輪詢)、Least Connection(最小連接數)。IP Hash策略是將請求的IP地址經過哈希運算後,得到一個數值;之後將該值與可用的服務器數取模,以得到一個介於0到可用服務器數之間的數。該數值對應的服務器將會被選擇並返回給客戶端。Round Robin策略是輪流讓各個服務來處理請求,實現均衡負載。Least Connection策略會將請求分配到連接數最少的服務器中。
@LoadBalanced @Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
六、Gateway負載均衡是本地
因為Gateway負載均衡是本地的負載均衡,只對本地進行負載均衡,不會對遠程服務進行負載均衡。這就是相對於其他負載均衡而言的天然優勢。可以通過在發起請求的時候,將請求路由到最近的服務實例上,從而降低延遲,提高服務響應時間,達到更好的性能優化。
七、Gateway負載均衡原理
Gateway負載均衡的原理可以用一張圖來表示:客戶端請求發送到服務網關(Gateway)之後,服務網關會根據預先設定的路由規則,將請求轉發到不同的服務實例上,再通過服務實例的負載均衡來選擇具體的服務來響應請求。
//Ribbon負載均衡啟用註解 @Bean @ConditionalOnMissingBean @ConditionalOnProperty(value = "feign.ribbon.enabled", matchIfMissing = true) public Client feignClient(RibbonClientHttpRequestFactory requestFactory) { return new RibbonClientFeignTemplate(requestFactory, context); }
八、Gateway負載均衡HTTP
在Gateway負載均衡中,HTTP是常用的協議之一。除了HTTP以外,還有TCP以及UDP等協議。
//服務請求工廠 @Bean public RibbonClientHttpRequestFactory requestFactory(ClientHttpRequestFactory clientHttpRequestFactory) { return new RibbonClientHttpRequestFactory(clientHttpRequestFactory); }
九、Gateway負載均衡策略IP Hash
IP Hash策略是一種常用的負載均衡策略。它的思路是將請求的IP地址哈希,然後再將哈希值和當前可用服務器數取模,得到一個數字,該數字代表了將要請求的服務器,從而實現負載均衡。這種策略優點在於相同的客戶端IP地址,總是可以定位到同一台服務器,從而保證了用戶的會話一致性。
@Configuration public class PhoenixRibbonConfig { @Bean public IRule ribbonRule() { //使用Ribbon的默認輪詢規則 return new RoundRobinRule(); } }
十、Gateway負載均衡策略有哪些選取
在實際使用中,Gateway負載均衡策略選擇需要根據負載均衡的實際情況進行調整。不同的負載均衡策略對應不同的場景。如Round Robin策略適用於後端服務器具有相同配置和功能,且沒有地理位置差異的場景;Least Connection策略適用於後端服務器計算能力差異明顯且服務請求吞吐量不均等的場景。綜上,我們需要根據實際的情況,選擇最適合自己場景的負載均衡策略。
原創文章,作者:PHBZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/144803.html