<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Spring cloud ribbon 和 Eureka – 客戶端負載均衡器示例 > 原文: [https://howtodoinjava.com/spring-cloud/spring-boot-ribbon-eureka/](https://howtodoinjava.com/spring-cloud/spring-boot-ribbon-eureka/) 在此 Spring 云教程中,學習在 Spring Boot / Cloud 項目中使用 Netflix Ribbon 使用**客戶端負載平衡**。 學習構建基于微服務的應用程序,這些應用程序使用 **Ribbon** 作為客戶端負載平衡器,并使用 **eureka** 作為注冊表服務。 了解如何在負載均衡器下動態添加微服務的新實例。 ## 1\. 傳統的服務器端負載均衡 服務器端負載平衡涉及單片應用程序,在這些應用程序中,負載平衡器后面的應用程序實例數量有限。 我們將 war / ear 文件部署到多個服務器實例中,這些實例基本上是已部署了相同應用程序的服務器池,并在其前面放置了負載均衡器。 負載平衡器具有公共 IP 和 DNS。 客戶端使用該公共 IP / DNS 發出請求。 負載平衡器決定將內部應用程序服務器請求轉發到哪個請求。 它主要使用輪詢或粘性會話算法。 我們稱其為服務器端負載平衡。 #### 1.1. 微服務架構中的問題 通常,服務器端負載平衡是一項手動工作,我們需要手動將實例添加/刪除到負載平衡器才能工作。 因此,理想情況下,我們要失去當今隨需應變的可伸縮性,以自動發現和配置何時分拆任何新實例。 另一個問題是制定故障轉移策略以為客戶提供無縫的體驗。 最后,我們需要一個單獨的服務器來承載負載均衡器實例,這會對成本和維護產生影響。 ## 2\. 客戶端負載平衡 為了克服傳統負載平衡的問題,客戶端負載平衡成為了現實。 它們作為內置組件駐留在應用程序中,并與應用程序捆綁在一起,因此我們不必將它們部署在單獨的服務器中。 現在,讓我們可視化全局。 在微服務架構中,我們將不得不開發許多微服務,并且每個微服務在生態系統中可能具有多個實例。 為了克服這種復雜性,我們已經有了使用**服務發現模式**的流行解決方案。 在 SpringBoot 應用程序中,我們在服務發現空間中提供了兩個選項,例如 Eureka,Consul,動物園管理員等。 現在,如果一個微服務想要與另一個微服務進行通信,則通常會使用發現客戶端來查找服務注冊表,并且 Eureka 服務器會將該目標微服務的所有實例返回給調用者服務。 然后,調用者服務負責選擇要發送請求的實例。 在這里,客戶端負載平衡成為現實,它會自動處理這種情況下的復雜性,并以負載平衡的方式委派給適當的實例。 注意,我們可以指定要使用的負載平衡算法。 ## 3\. Netflix Ribbon – 客戶端負載平衡器 Spring Cloud 系列的 Netflix Ribbon 提供了這種功能來設置客戶端負載平衡以及服務注冊表組件。 Spring Boot 具有非常好的配置 Ribbon 客戶端負載平衡器的簡便方法。 它提供以下功能 1. 負載均衡 2. 容錯能力 3. 異步和響應模型中的多種協議(HTTP,TCP,UDP)支持 4. 緩存和批處理 要獲取 Ribbon 二進制文件,請轉到 [maven 中心](https://search.maven.org/#search%7Cga%7C1%7Cribbon)。 這是在 Maven 中添加依賴項的示例: `pom.xml` ```java <dependency> <groupId>com.netflix.ribbon</groupId> <artifactId>ribbon</artifactId> <version>2.2.2</version> </dependency> ``` ## 4\. Netflix Ribbon 示例 #### 4.1. 技術棧 * Java,Eclipse,Maven 作為開發環境 * Spring-boot 和 Cloud 作為應用程序框架 * Eureka 即服務注冊表服務器 * Ribbon 作為客戶端負載均衡器 我們將創建以下組件,并查看整個生態系統如何在分布式環境中進行協調。 * 使用 Spring 運行的兩個微服務。 一個需要根據業務需求調用另一個 * Eureka 服務注冊服務器 * 調用微服務中的 Ribbon 通過服務發現以負載平衡的方式調用其他服務 * 以負載平衡的方式調用服務,而無需發現服務 #### 4.2. 創建后端微服務 我們將使用 Spring boot 創建一個簡單的微服務,并將公開簡單的 REST 端點。 使用`spring-boot-web`和**服務發現客戶端**依賴關系創建一個名為`ribbon-server`的簡單 Spring Boot 項目,以將其托管在 Web 服務器中,并公開一個 Rest 控制器進行測試。 為此,我們需要轉到 https://start.spring.io/ 并提供 Maven 坐標并選擇依賴項。 下載包含框架項目的 zip 文件。 然后,一旦解壓縮到合適的文件夾中,我們就需要將其導入 eclipse 中。 ![](https://img.kancloud.cn/2a/ea/2aea6bc6c4f6ac15a38d1161aa0a2d20_1354x626.jpg) 從 Spring Initializer 生成的項目 ###### 4.2.1. 創建 REST 端點 編寫一個 Rest 控制器,并如下所示公開一個 Rest 端點。 `MyRestController.java` ```java package com.example.ribbonserver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyRestController { @Autowired Environment environment; @GetMapping("/") public String health() { return "I am Ok"; } @GetMapping("/backend") public String backend() { System.out.println("Inside MyRestController::backend..."); String serverPort = environment.getProperty("local.server.port"); System.out.println("Port : " + serverPort); return "Hello form Backend!!! " + " Host : localhost " + " :: Port : " + serverPort; } } ``` ###### 4.2.2 啟用發現客戶端 注冊此服務到 eureka,我們需要在應用程序類中添加`@EnableDiscoveryClient`。 另外,我們需要在應用程序屬性文件中添加以下條目。 `RibbonServerApplication.java` ```java package com.example.ribbonserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class RibbonServerApplication { public static void main(String[] args) { SpringApplication.run(RibbonServerApplication.class, args); } } ``` `application.properties` ```java spring.application.name=server server.port = 9090 eureka.client.serviceUrl.defaultZone= http://${registry.host:localhost}:${registry.port:8761}/eureka/ eureka.client.healthcheck.enabled= true eureka.instance.leaseRenewalIntervalInSeconds= 1 eureka.instance.leaseExpirationDurationInSeconds= 2 ``` #### 4.3. Eureka 服務注冊表服務器 創建服務發現服務器。 這也很容易。 只是我們需要使用 Eureka 服務器作為依賴項來創建上述的 spring boot 項目,并執行以下配置。 ###### 4.3.1. Eureka 服務器配置 準備好 Spring Boot 服務并將其導入 Eclipse 后,在 Spring Boot 應用程序類中添加`@EnableEurekaServer`注解,并在應用程序屬性文件中添加以下配置。 `RibbonEurekaServerApplication.java` ```java package com.example.ribboneurekaserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class RibbonEurekaServerApplication { public static void main(String[] args) { SpringApplication.run(RibbonEurekaServerApplication.class, args); } } ``` `application.properties` ```java spring.application.name= ${springboot.app.name:eureka-serviceregistry} server.port = ${server-port:8761} eureka.instance.hostname= ${springboot.app.name:eureka-serviceregistry} eureka.client.registerWithEureka= false eureka.client.fetchRegistry= false eureka.client.serviceUrl.defaultZone: http://${registry.host:localhost}:${server.port}/eureka/ ``` #### 4.4. 創建另一個微服務 遵循上一節的內容,創建另一個名為`ribbon-client`的服務,并增加了權限`spring-cloud-starter-netflix-ribbon`。 下載后,將項目導入 eclipse 中并執行以下配置。 ###### 4.4.1. 碳帶配置 在應用程序類中,添加兩個注解`@RibbonClient`和`@EnableDiscoveryClient`,以啟用 Ribbon 和 Eureka 客戶端進行服務注冊。 `RibbonClientApplication.java` ```java package com.example.ribbonclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; @EnableDiscoveryClient @SpringBootApplication @RibbonClient(name = "server", configuration = RibbonConfiguration.class) public class RibbonClientApplication { public static void main(String[] args) { SpringApplication.run(RibbonClientApplication.class, args); } } ``` 在`application.properties`中,我們需要進行以下配置。 在這里`server.ribbon.listOfServers`被禁用,我們可以啟用它以手動將服務器添加到此負載均衡器。 我們將在“測試”部分中對此進行檢查。 其他屬性不言自明。 `application.properties` ```java spring.application.name=client server.port=8888 eureka.client.serviceUrl.defaultZone= http://${registry.host:localhost}:${registry.port:8761}/eureka/ eureka.client.healthcheck.enabled= true eureka.instance.leaseRenewalIntervalInSeconds= 1 eureka.instance.leaseExpirationDurationInSeconds= 2 server.ribbon.eureka.enabled=true #server.ribbon.listOfServers=localhost:9090,localhost:9091,localhost:9092 server.ribbon.ServerListRefreshInterval=1000 #logging.level.root=TRACE ``` 現在,我們需要為 Ribbon 創建另一個配置類,以提及**負載平衡算法和運行狀況檢查**。 現在,我們將使用 Ribbon 所提供的默認值,但是在此類中,我們可以很好地覆蓋它們并添加我們的自定義邏輯。 `RibbonConfiguration.java` ```java package com.example.ribbonclient; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.AvailabilityFilteringRule; import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.PingUrl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; public class RibbonConfiguration { @Autowired IClientConfig config; @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } @Bean public IRule ribbonRule(IClientConfig config) { return new AvailabilityFilteringRule(); } } ``` ## 5\. 測試應用程序 #### 5.1. 啟動組件 執行最終的構建使用命令`mvn clean install`,并檢查構建是否成功。 如果有任何錯誤,則需要進行修復。 一旦成功完成所有 Maven 項目的構建,我們將一個接一個地啟動服務。 首先是 Eureka,然后是后端微服務,最后是前端微服務。 要啟動每個微服務,我們將使用`'java -jar -Dserver.port=XXXX target/YYYYY.jar'`命令。 #### 5.2. 部署后端微服務的多個實例 為此,我們需要為此使用不同的端口,以在特定端口中啟動服務,我們需要以這種方式傳遞該端口。 `java -jar -Dserver.port=XXXX target/YYYYY.jar`。 我們將在端口 9090、9091 和 9092 端口中創建此服務的 3 個實例。 #### 5.3. 驗證 Eureka 服務器 現在,在瀏覽器中轉到`http://localhost:8761/`,并檢查 eureka 服務器正在運行,并且所有微服務都已注冊了所需數量的實例。 #### 5.4. 檢查客戶端負載平衡是否正常 在前端微服務中,我們使用`RestTemplate`調用后端微服務。 使用`@LoadBalanced`注解,將剩余溫度作為客戶端負載平衡器啟用。 現在轉到瀏覽器,打開客戶端微服務 REST 端點`http://localhost:8888/client/frontend`,看看響應來自任何后端實例。 要了解此后端服務器正在返回其運行端口,我們也在客戶端微服務響應中也顯示了該端口。 嘗試刷新此 URL 幾次,然后注意到后端服務器的端口不斷變化,這意味著客戶端負載平衡正在工作。 現在嘗試添加更多后端服務器實例,并檢查是否也在 eureka 服務器中注冊并最終在 Ribbon 中考慮,因為一旦將在 eureka 中注冊,Ribbon 也會自動將請求發送到新實例。 #### 5.5. 使用硬編碼后端進行測試,而無需發現服務 轉到前端微服務`application.properties`文件并啟用它。 `application.properties` ```java server.ribbon.listOfServers=localhost:9090,localhost:9091,localhost:9092 server.ribbon.eureka.enabled=false ``` 現在測試客戶端網址。 您將僅從注冊的實例獲得響應。 現在,如果您在其他端口中啟動后端微服務的新實例,Ribbon 將不會向新實例發送請求,除非我們在 Ribbon 中手動注冊。 如果您在測試時遇到困難,我也建議您從所有應用程序中刪除所有與 eureka 相關的配置,并停止 eureka 服務器。 希望您也不會在測試中遇到任何困難。 ## 6\. 總結 因此,我們已經看到了在 SpringBoot 微服務開發中可以輕松地將 Ribbon 和 Eureka 一起使用。 因此,下次如果您需要這種要求,則可以使用這種方法。 如果您對此有任何疑問,請在下面評論。 [下載源碼](https://howtodoinjava.com/wp-content/uploads/2018/10/spring-boot-ribbon.zip) 學習愉快! 參考文獻: [Spring Cloud Ribbon 文檔](https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html)
                  <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>

                              哎呀哎呀视频在线观看