<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] Spring Cloud Ribbon是基于Netflix Ribbon實現的一套客戶端負載均衡的工具。它是一個基于HTTP和TCP的客戶端負載均衡器。它可以通過在客戶端中配置ribbonServerList來設置服務端列表去輪詢訪問以達到均衡負載的作用。 # Ribbon是什么? Ribbon是Netflix發布的開源項目,主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)后面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,隨即連接等)去連接這些機器。我們也很容易使用Ribbon實現自定義的負載均衡算法。 # LB方案分類 目前主流的LB方案可分成兩類:一種是集中式LB, 即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬件,如F5, 也可以是軟件,如nginx), 由該設施負責把訪問請求通過某種策略轉發至服務的提供方;另一種是進程內LB,將LB邏輯集成到消費方,消費方從服務注冊中心獲知有哪些地址可用,然后自己再從這些地址中選擇出一個合適的服務器。Ribbon就屬于后者,它只是一個類庫,集成于消費方進程,消費方通過它來獲取到服務提供方的地址。 # Ribbon的主要組件與工作流程 微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務運行在自己的進程中,開發和發布都沒有依賴。 不同服務通過一些輕量級交互機制來通信,例如 RPC、HTTP 等,服務可獨立擴展伸縮,每個服務定義了明確的邊界,不同的服務甚至可以采用不同的編程語言來實現,由獨立的團隊來維護。 簡單的來說,一個系統的不同模塊轉變成不同的服務!而且服務可以使用不同的技術加以實現! # Ribbon的核心組件 **均為接口類型,有以下幾個** **ServerList** - 用于獲取地址列表。它既可以是靜態的(提供一組固定的地址),也可以是動態的(從注冊中心中定期查詢地址列表)。 **ServerListFilter** - 僅當使用動態ServerList時使用,用于在原始的服務列表中使用一定策略過慮掉一部分地址。 **IRule** - 選擇一個最終的服務地址作為LB結果。選擇策略有輪詢、根據響應時間加權、斷路器(當Hystrix可用時)等。 Ribbon在工作時首選會通過ServerList來獲取所有可用的服務列表,然后通過ServerListFilter過慮掉一部分地址,最后在剩下的地址中通過IRule選擇出一臺服務器作為最終結果。 # Ribbon提供的主要負載均衡策略介紹 **簡單輪詢負載均衡(RoundRobin)** 以輪詢的方式依次將請求調度不同的服務器,即每次調度執行i = (i + 1) mod n,并選出第i臺服務器。 **隨機負載均衡 (Random)** 隨機選擇狀態為UP的Server **加權響應時間負載均衡 (WeightedResponseTime)** 根據相應時間分配一個weight,相應時間越長,weight越小,被選中的可能性越低。 **區域感知輪詢負載均衡(ZoneAvoidanceRule)** 復合判斷server所在區域的性能和server的可用性選擇server # 準備工作 本次項目示例,改造第一篇文章中的項目,使用`spring-cloud-eureka-service`作為服務注冊中心,`spring-cloud-eureka-provider`,復制三分,項目名稱依次修改為`spring-cloud-eureka-provider-1` `[1-3]` ## 改造 Provider **服務提供者** 在項目:`spring-cloud-eureka-provider-1`,`spring-cloud-eureka-provider-2`,`spring-cloud-eureka-provider-3` 的啟動類,都加入` @Value("${server.port}")`,修改`home()`方法, 來區分不同端口的`Controller` 響應,因為接下來,使用`ribbon`做均衡需要測試需要使用到 ```java package io.ymq.example.eureka.provider; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @EnableEurekaClient @RestController public class EurekaProviderApplication { @Value("${server.port}") String port; @RequestMapping("/") public String home() { return "Hello world ,port:" + port; } public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } } ``` ## 修改配置 在項目:`spring-cloud-eureka-provider-1`,`spring-cloud-eureka-provider-2`,`spring-cloud-eureka-provider-3`,修改`server: port:`端口依次為`8081`,`8082`,`8083` ```sh eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ spring: application: name: eureka-provider server: port: 8081 ``` # Ribbon Consumer **服務消費者** ## 添加依賴 新建 `spring-cloud-ribbon-consumer` ```xml <!-- 客戶端負載均衡 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <!-- eureka客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> ``` ## 開啟服務負載均衡 在工程的啟動類中,通過`@EnableDiscoveryClient`向服務注冊中心注冊;并且向程序的`ioc`注入一個`bean: restTemplate`并通過`@LoadBalanced`注解表明這個`restRemplate`開啟負載均衡的功能。 ```java package io.ymq.example.ribbon.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient @SpringBootApplication public class RibbonConsumerApplication { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonConsumerApplication.class, args); } } ``` ## 消費提供者方法 新建 `ConsumerController` 類,調用提供者的 `hello` 方法 ```java package io.ymq.example.ribbon.consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * 描述:調用提供者的 `home` 方法 * * @author yanpenglei * @create 2017-12-05 18:53 **/ @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping(value = "/hello") public String hello() { return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody(); } } ``` ## 添加配置 完整配置 `application.yml` 指定服務的注冊中心地址,配置自己的服務端口,服務名稱 ```sh eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ spring: application: name: ribbon-consumer server: port: 9000 ``` # 測試服務 ## 啟動服務 依次啟動項目: `spring-cloud-eureka-service` `spring-cloud-eureka-provider-1` `spring-cloud-eureka-provider-2` `spring-cloud-eureka-provider-3` `spring-cloud-ribbon-consumer` 啟動該工程后,訪問服務注冊中心,查看服務是否都已注冊成功:[http://localhost:8761/](http://localhost:8761/) ![查看服務注冊狀態][1] ## 負載均衡 **在命令窗口`curl http://localhost:9000/hello`,發現Ribbon已經實現負載均衡** 或者瀏覽器`get` 請求`http://localhost:9000/hello` F5 刷新 ![測試Ribbon,負載均衡響應][2] [1]: https://www.souyunku.com/images/2017/SpringCloud/ribbon/11.png [2]: https://www.souyunku.com/images/2017/SpringCloud/ribbon/22.png ## 源碼下載 **GitHub:**[https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-ribbon](https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-ribbon) **碼云:**[https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-ribbon](https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-ribbon)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看