您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么理解Spring Cloud的負載均衡策略+重試機制+Hystrix 熔斷器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
負載均衡策略 初體驗:
步驟一:修改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 熔斷器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。