<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringCloud Alibaba 負(fù)載均衡你還不懂?

          共 4888字,需瀏覽 10分鐘

           ·

          2021-05-14 12:25

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          概述

          負(fù)載均衡是分布式架構(gòu)的重點(diǎn),負(fù)載均衡機(jī)制決定著整個(gè)服務(wù)集群的性能與穩(wěn)定。

          負(fù)載均衡,英文名稱(chēng)為L(zhǎng)oad Balance,其含義就是指將負(fù)載(工作任務(wù))進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行。

          負(fù)載均衡解決的是將一個(gè)客戶(hù)端的流量以某種符合最大化資源利用率的方式均攤到服務(wù)端所提供的所有實(shí)例上的問(wèn)題。在這個(gè)問(wèn)題的場(chǎng)景中,后端服務(wù)的實(shí)例是通過(guò)水平擴(kuò)展的方式來(lái)提供高可用的。

          負(fù)載均衡分類(lèi)

          在微服務(wù)架構(gòu)中,負(fù)載均衡是必須使用的技術(shù),通過(guò)它來(lái)實(shí)現(xiàn)系統(tǒng)的高可用、集群擴(kuò)容等功能。負(fù)載均衡可以分為兩種:服務(wù)端負(fù)載均衡和客戶(hù)端負(fù)載均衡。

          1、服務(wù)器負(fù)載均衡

          通常所說(shuō)的負(fù)載均衡指服務(wù)器負(fù)載均衡,由服務(wù)端來(lái)決定調(diào)用哪個(gè)節(jié)點(diǎn),可通過(guò)硬件設(shè)備或軟件來(lái)實(shí)現(xiàn),硬件比如:F5、Array等,軟件比如:LVS、Nginx等,類(lèi)似的架構(gòu)圖如下:

          原理:

          通過(guò)硬件或軟件實(shí)現(xiàn)負(fù)載均衡均會(huì)維護(hù)一個(gè)服務(wù)端清單,利用心跳檢測(cè)等手段進(jìn)行清單維護(hù),保證清單中都是可以正常訪(fǎng)問(wèn)的服務(wù)節(jié)點(diǎn)。當(dāng)用戶(hù)發(fā)送請(qǐng)求時(shí),會(huì)先到達(dá)負(fù)載均衡器(也相當(dāng)于一個(gè)服務(wù)),負(fù)載均衡器根據(jù)負(fù)載均衡算法(輪訓(xùn)、隨機(jī)、加權(quán)輪訓(xùn))從可用的服務(wù)端列表中取出一臺(tái)服務(wù)端的地址,接著進(jìn)行轉(zhuǎn)發(fā),降低系統(tǒng)的壓力。

          2、客戶(hù)端負(fù)載均衡

          客戶(hù)端實(shí)際上是指服務(wù)調(diào)用者。在 SpringCloud 中調(diào)用者本身集成負(fù)載均衡,由調(diào)用者決定來(lái)調(diào)用哪個(gè)節(jié)點(diǎn)的服務(wù),這就是客戶(hù)端負(fù)載均衡。

          SpringCloud Ribbon是基于客戶(hù)端的負(fù)載均衡工具,它可以將面向服務(wù)的 REST 模板請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶(hù)端負(fù)載均衡的服務(wù)調(diào)用。

          原理:

          Ribbon 維護(hù)了一個(gè)服務(wù)列表,如果服務(wù)實(shí)例注銷(xiāo)或死掉,Ribbon 能夠自行將其剔除。Ribbon 提供了客戶(hù)端負(fù)載均衡的功能,Ribbon 利用從注冊(cè)中心中讀取到的服務(wù)信息列表(存儲(chǔ)在本地即客戶(hù)端中),在調(diào)用某個(gè)服務(wù)時(shí),根據(jù)負(fù)載均衡算法直接請(qǐng)求到具體的微服務(wù)實(shí)例,常用的負(fù)載均衡算法有:輪循、隨機(jī)、加權(quán)輪循、加權(quán)隨機(jī)、地址哈希等方法。如下圖是Ribbon負(fù)載均衡的流程圖:

          3、客戶(hù)端和服務(wù)端負(fù)載均衡的區(qū)別

          兩者主要區(qū)分點(diǎn)在于服務(wù)清單的存放位置:在客戶(hù)端負(fù)載均衡中,客戶(hù)端會(huì)存儲(chǔ)一份服務(wù)端清單,它是通過(guò)從注冊(cè)中心進(jìn)行抓取得到的,同時(shí)也需要對(duì)此進(jìn)行維護(hù);而在服務(wù)端負(fù)載均衡中,服務(wù)端自己會(huì)維護(hù)一份服務(wù)端清單

          Ribbon 簡(jiǎn)介

          Spring Cloud Ribbon是一個(gè)基于 HTTP 和 TCP 協(xié)議客戶(hù)端負(fù)載均衡工具,它基于Netflix Ribbon實(shí)現(xiàn)。通過(guò) Spring Cloud 的封裝,可以讓我們輕松地將面向服務(wù)的 REST 模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶(hù)端負(fù)載均衡的服務(wù)調(diào)用。Spring Cloud Ribbon 雖然只是一個(gè)工具類(lèi)框架,它不像服務(wù)注冊(cè)中心、配置中心、API網(wǎng)關(guān)那樣需要獨(dú)立部署,但是它幾乎存在于每一個(gè)Spring Cloud構(gòu)建的微服務(wù)和基礎(chǔ)設(shè)施中。因?yàn)槲⒎?wù)間的調(diào)用,API網(wǎng)關(guān)的請(qǐng)求轉(zhuǎn)發(fā)等內(nèi)容,實(shí)際上都是通過(guò)Ribbon來(lái)實(shí)現(xiàn)的,包括Feign,它也是基于Ribbon實(shí)現(xiàn)的工具。所以,對(duì)Spring Cloud Ribbon的理解和使用,對(duì)于我們使用Spring Cloud來(lái)構(gòu)建微服務(wù)非常重要。

          1、負(fù)載均衡的策略
          2、負(fù)載均衡策略的設(shè)置
          3、負(fù)載均衡的常用接口

          Ribbon 負(fù)載均衡的類(lèi)型

          在spring cloud微服務(wù)架構(gòu)中,基本上每個(gè)拆分的微服務(wù)都會(huì)部署多個(gè)運(yùn)行實(shí)例。每個(gè)服務(wù)多個(gè)實(shí)例,能夠提高吞吐量和可用性,使得流量均勻分布,防止單臺(tái)瓶頸,也避免單點(diǎn)故障。

          Ribbon 維護(hù)了一個(gè)服務(wù)列表,服務(wù)列表以服務(wù)的應(yīng)用名為區(qū)分,當(dāng)調(diào)用某個(gè)服務(wù)名的服務(wù)時(shí),Ribbon
          會(huì)根據(jù)負(fù)載均衡算法直接請(qǐng)求到該服務(wù)名下某個(gè)具體的微服務(wù)實(shí)例。

          因此負(fù)載均衡適用的同一微服務(wù)名下的微服務(wù)實(shí)例有兩種類(lèi)型:

          1、不同工程具有同一服務(wù)名


          上述兩個(gè)不同的工程,因?yàn)榫哂邢嗤姆?wù)名 alibaba-server-hello,因此是屬于同一服務(wù)名下的不同實(shí)例。
          除了應(yīng)用名一樣外,
          被調(diào)用的服務(wù)名對(duì)應(yīng)的各個(gè)工程實(shí)例的同一接口的訪(fǎng)問(wèn)地址應(yīng)該也要相同。
          服務(wù)名在配置文件application.yml 以及Nacos配置文件中聲明。

          application.yml

          Nacos 配置文件

          2、同一工程部署在不同端口上

          將某個(gè)工程部署在不同端口上,這種情況下不同服務(wù)實(shí)例除了端口不同外其他的配置都相同,因此具有相同的服務(wù)名,屬于同一服務(wù)名下的不同實(shí)例。
          同一工程部署不同實(shí)例的做法如下:

          給 alibaba-server-helloworld 工程添加第2個(gè)實(shí)例的流程如下:

          (1)alibaba-server-helloworld 服務(wù)的配置文件中不能設(shè)置端口號(hào)

          application.yml 文件

          Nacos配置文件

          因?yàn)?alibaba-server-helloworld 服務(wù)的每個(gè)實(shí)例只有端口號(hào)不同,所以在配置文件中不能設(shè)置端口號(hào),否則每個(gè)實(shí)例的端口號(hào)將會(huì)相同,因而不能創(chuàng)建部署于不同端口的多實(shí)例。(配置文件的端口號(hào)設(shè)置優(yōu)先于在 VM Options 中通過(guò) -Dserver.port = xxxx 設(shè)置端口號(hào))

          (2)打開(kāi)Edit Configurations

          (3)點(diǎn)擊“ + ”號(hào),選擇Spring Boot,添加實(shí)例
          (4)填寫(xiě)實(shí)例名稱(chēng)、實(shí)例的主類(lèi)以及實(shí)例的端口號(hào)

          主類(lèi)選擇 alibaba-server-helloworld 服務(wù)的主類(lèi) WorldApplication;
          在 VM options 中設(shè)置實(shí)例的端口號(hào) 
          -Dserver.port = 8005

          (5)點(diǎn)擊 Apply 后,新的實(shí)例即可創(chuàng)建完成

          能夠看到 alibaba-server-helloworld 服務(wù)有兩個(gè)分別運(yùn)行在 8005 和 8006 端口的實(shí)例

          (6)查看 Nacos 服務(wù)列表

          能夠看到在服務(wù)列表中 alibaba-server-helloworld 服務(wù)有兩個(gè)實(shí)例

          客戶(hù)端負(fù)載均衡Ribbon使用

          1、RestTemplate + Ribbon (使用同一工程不同端口類(lèi)型)

          (1)在 RestTemplate 配置類(lèi)里面在注入 RestTemplate 的方法上面添加注解 @LoadBalanced 即可實(shí)現(xiàn)負(fù)載均衡

          @LoadBalanced 原理:
          RestTemplate在發(fā)送請(qǐng)求的時(shí)候會(huì)被ClientHttpRequestInterceptor攔截,LoadBalancerInterceptor是ClientHttpRequestInterceptor的實(shí)現(xiàn)類(lèi),它的作用就是用于RestTemplate的負(fù)載均衡,LoadBalancerInterceptor將負(fù)載均衡的核心邏輯交給了loadBalancer。
          @LoadBalanced注解是屬于Spring,而不是Ribbon的,Spring在初始化容器的時(shí)候,如果檢測(cè)到Bean被@LoadBalanced注解,Spring會(huì)為其設(shè)置LoadBalancerInterceptor的攔截器。

          @Component
          public class RestTemplateConfig {
              @Bean
              @LoadBalanced  // 負(fù)載均衡注解
              public RestTemplate restTemplate(){
                  return new RestTemplate();
              }
          }

          注:我們這里不需要添加Ribbon的依賴(lài),因?yàn)?nbsp;Nacos Client 包里面幫我們引入 Ribbon 相關(guān)的依賴(lài)

          (2)controller 中多次調(diào)用 alibaba-server-helloworld 服務(wù)

          @RestController
          @Slf4j
          public class ConsumerController {

              @Autowired
              private RestTemplate restTemplate;
              @Autowired
              private DiscoveryClient discoveryClient;

              @GetMapping("/diaoyong")
              public  String msg(){
                  System.out.println("服務(wù)列表");
                  List<ServiceInstance> list=discoveryClient.getInstances("alibaba-server-helloworld");
                  System.out.println(list);
                  String response = restTemplate.getForObject("http://alibaba-server-helloworld/hello/lhj/hello", String.class);
                  return response;
              }
          }

          (3)調(diào)用 4 次 alibaba-server-helloworld 服務(wù)查看效果

          可以發(fā)現(xiàn)兩個(gè)實(shí)例分別調(diào)用兩次,而且是輪流調(diào)用,也就是說(shuō) Ribbon 的默認(rèn)負(fù)載均衡策略是輪循。

          2、Feign(默認(rèn)繼承了Ribbon)

          Feign 是一個(gè)聲明式的偽 Http 客戶(hù)端,它使得寫(xiě) Http 客戶(hù)端變得更簡(jiǎn)單。使用 Feign,只需要?jiǎng)?chuàng)建一個(gè)接口并注解。它具有可插拔的注解特性,可使用 Feign 注解和 JAX-RS 注解。Feign 支持可插拔的編碼器和解碼器。Feign 默認(rèn)集成了 Ribbon,默認(rèn)實(shí)現(xiàn)了負(fù)載均衡的效果。所以使用Feign無(wú)需任何操作就已經(jīng)附帶了Ribbon負(fù)載均衡。




          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/IT__learning/article/details/116540399





          鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒





          感謝點(diǎn)贊支持下哈 

          瀏覽 30
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲男人的天堂再线观看 | 日本中文字幕中出在线 | 亚洲成人第一页 | 91精品国产91热久久久做人人 | 在线观看高清无码视频 |