本篇內容介紹了“怎么理解Spring Cloud的負載均衡策略+重試機制+Hystrix 熔斷器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
專注于為中小企業提供網站制作、網站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業朝陽免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了上1000+企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。
負載均衡策略 初體驗:
步驟一:修改pom文件,修改服務調用方的pom文件,添加test依賴
<!--測試--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
步驟二:編寫測試類,在服務調用方編寫Junit測試類
package com.czxy; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; @SpringBootTest(classes=Client4Application.class) //Junit和Spring boot整合,將所有實例加載到spring容器。 @RunWith(SpringRunner.class) //JUnit和Spring整合,將spring容器中的數據注入當前類 public class TestRibbon { @Resource private RibbonLoadBalancerClient client; @Test public void testDemo(){ // 通過“服務名”獲得對應服務實例 for (int i = 0; i < 10; i++) { ServiceInstance instance = client.choose("service4"); System.out.println(instance.getHost() + ":">
步驟三:修改提供方yml文件,支持顯示IP地址,并重啟8081和8082
#服務名 spring: application: name: service4 #注冊地址 eureka: client: service-url: defaultZone: http://localhost:10086/eureka instance: prefer-ip-address: true #顯示IP地址
修改策略
給指定的“服務”設置策略
服務名.ribbon.NFLoadBalancerRuleClassName=策略實現類
service4: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #隨機 #NFLoadBalancerRuleClassName : com.netflix.loadbalancer.BestAvailableRule #并發最少 #NFLoadBalancerRuleClassName : com.netflix.loadbalancer.WeightedResponseTimeRule #請求時間權重
重試機制
重試機制:服務B訪問集群環境下的服務A,某一個服務A宕機,服務B將嘗試訪問其他可以使用的服務A。
9090訪問 8081和8082
如果8082宕機了
9090將嘗試訪問8081
步驟一:修改pom文件,添加重試retry依賴
<!--重試機制--> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
步驟二:修改yml文件,開啟cloud重試機制
spring: cloud: loadbalancer: retry: enabled: true #開啟重試機制
步驟三:修改yml文件,配置當前服務的重試參數
service4: ribbon: ConnectTimeout: 250 # Ribbon的連接超時時間 ReadTimeout: 1000 # Ribbon的數據讀取超時時間 OkToRetryOnAllOperations: true # 是否對所有操作都進行重試 MaxAutoRetriesNextServer: 1 # 切換實例的重試次數 MaxAutoRetries: 1 # 對當前實例的重試次數
Hystix熔斷器
Hystrix是Netflix開源的一個延遲和容錯庫,用于隔離訪問遠程服務、第三方庫,防止出現級聯失敗。
Hystrix 入門
步驟一:修改pom,添加熔斷器依賴
步驟二:修改啟動類,添加開啟熔斷器注解 @EnableHystrix
步驟三:改造dao,遠程調用添加 熔斷器的備選方案,添加注解 + 備用方法
步驟四:改變服務提供方法,添加線程sleep,0~2000隨機 (測試方便)
步驟一:修改pom,添加熔斷器依賴
<!--熔斷器--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
步驟二:修改啟動類,添加開啟熔斷器注解 @EnableHystrix
package com.czxy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; @SpringBootApplication @EnableEurekaClient @EnableHystrix //開啟熔斷器 public class Client4Application { public static void main(String[] args) { SpringApplication.run(Client4Application.class,args); } }
步驟三:改造dao,遠程調用添加 熔斷器的備選方案,添加注解 + 備用方法
package com.czxy.dao; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @Component public class DataDao { @Resource private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "dataFallback") public ResponseEntity<String> data(){ String url = "http://service4/test"; return restTemplate.getForEntity(url,String.class); } /** * 熔斷器超時處理方法 * @return */ public ResponseEntity<String> dataFallback(){ return ResponseEntity.ok("臨時數據"); } }
步驟四:改變服務提供方法,添加線程sleep,0~~2000隨機 (測試方便)
package com.czxy.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.Random; @RestController @RequestMapping("/test") public class TestController { @GetMapping public ResponseEntity<String> test(HttpServletRequest request) throws Exception { //模擬延遲 Thread.sleep(new Random().nextInt(2000)); return ResponseEntity.ok("測試數據" + request.getServerPort()); } }
步驟五:優化dao,打印耗時時間
package com.czxy.dao; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @Component public class DataDao { @Resource private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "dataFallback") public ResponseEntity<String> data(){ //1 記錄開始時間 long start = System.currentTimeMillis(); //2 調用 String url = "http://service4/test"; ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class); //3 記錄結束時間 long end = System.currentTimeMillis(); //4 統計耗時 System.out.println("耗時時間:" + (end - start)); return entity; } /** * 熔斷器超時處理方法 * @return */ public ResponseEntity<String> dataFallback(){ return ResponseEntity.ok("臨時數據"); } }
(面試題)如果項目中同時使用熔斷器和Ribbon重試機制,誰先執行?
如果時間不相同,超時時間小的,先執行。
如果時間相同,只執行熔斷器
結論:如果兩個都需要配置,重試機制的超時時間 小于 熔斷器
“怎么理解Spring Cloud的負載均衡策略+重試機制+Hystrix 熔斷器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!
網頁題目:怎么理解SpringCloud的負載均衡策略+重試機制+Hystrix熔斷器
標題路徑:http://vcdvsql.cn/article36/pocdsg.html
成都網站建設公司_創新互聯,為您提供外貿網站建設、云服務器、Google、用戶體驗、ChatGPT、品牌網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯