在本博客以前的Spring Cloud系列裏,咱們講述了Feign的基本用法,這裏咱們將講述下Feign整合Ribbon實現負載均衡以及整合Hystrix實現斷路保護效果的方式。 html
這裏,咱們將重用以前博文裏講過的案例,提供的兩個(即主從)Eureka服務項目以及三個服務提供者的項目。隨後在此基礎上,在服務調用者的項目中,經過Feign以負載均衡的方式調用三個服務提供者所提供的sayHello方法。 java
在FeignDemo-ServiceCaller項目裏開發Fegin整合Ribbon,具體的步驟以下。spring
在pom.xml中,引入Ribbon依賴包,關鍵代碼以下。瀏覽器
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-ribbon</artifactId> 4 </dependency>
在ControllerForFeignRibbon.java中,編寫Feign以Ribbon負載均衡的方式調用服務的代碼。緩存
//省略必要的package和import的代碼 //這和Ribbon Provider中的applicationname一致 @FeignClient(value = "sayHelloAvoidCopy") interface FeignClientRibbonTool{ @RequestMapping(method = RequestMethod.GET, value = "/sayHello/{username}/avoidCopy") String sayHelloAsRibbon(@PathVariable("username") String username); } @RestController public class ControllerForFeignRibbon { private FeignClientRibbonTool tool; @RequestMapping(value = "/callHelloAsRibbon/{username}", method = RequestMethod.GET) public String callHelloAsRibbon(@PathVariable("username") String username) { return tool.sayHelloAsRibbon(username); } }
在上述代碼裏,,咱們定義了一個名爲FeignClientRibbonTool的接口;在第3行中,咱們經過@FeignClient註解指定了該Feign接口將會調用名爲sayHello的服務。請注意,這裏的sayHello命名須要和EurekaRibbonDemo-ServiceProviderOne等項目中application.yml中的相應配置一致。服務器
在第10行中,咱們經過@RestController註解定義了一個名爲ControllerForFeignRibbon的控制器類,在其中的第14行的callHelloAsRibbon中,咱們是經過Feign接口中的sayHelloAsRibbon方法調用服務的。架構
在application.yml中,編寫Ribbon的相關配置信息,關鍵代碼以下。app
1 sayHello: 2 ribbon: 3 listOfServer: http://localhost:1111/,http://localhost:2222/,http://localhost:3333 4 ConnectionsTimeout: 1000 5 ribbon: 6 ConnectionsTimeout: 2000
在第1~4行,咱們經過配置指定了基於ribbon的多臺服務器,它們將以負載均衡的方式承擔請求url,並且還指定了鏈接超時的時間。從第1行咱們能看到,這個配置是針對sayHello這個服務實例的。而在第5行和第6行,咱們配置了全局性的ribbon屬性,這裏也配置了鏈接超時時間。負載均衡
完成開發後,啓動定義在表6.2中的兩臺Eureka服務器、三臺服務提供者和一臺服務調用者程序後,在瀏覽器中屢次輸入http://localhost:8080/callHelloAsRibbon/Peter以調用服務,這時咱們能看到有以下輸出。從輸出結果來看,咱們以Feign的形式調用的請求確實被均衡地轉發到3臺服務提供者的機器上。框架
1 Hello Ribbon, there are Server1, my name is:Peter
2 Hello Ribbon, there are Server2, my name is:Peter
3 Hello Ribbon, there are Server3, my name is:Peter
這裏咱們來總結一下Feign整合Ribbon的要點。
第一,多個服務器提供者的實例名應當一致,好比這裏都是sayHello。
第二,在Feign的接口中,是經過@FeignClient的註解調用服務提供者的方法的。
第三,這裏咱們是在application.yml配置文件中指定Ribbon的各類參數,也能夠經過@Configuration註解在Java文件中配置Ribbon的參數。
在經過Feign調用服務時,一樣不能保證服務必定可用,爲了提高客戶體驗,這裏能夠經過引入Hystrix對訪問請求進行「容錯保護」。
在FeignDemo-ServiceCaller的pom.xml中,增長Hystrix的依賴包,關鍵代碼以下。
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-hystrix</artifactId> 4 </dependency>
仍是在FeignDemo-ServiceCaller項目的application.yml配置文件中,經過以下配置項啓動Hystrix模式,關鍵代碼以下。
1 feign: 2 hystrix: 3 enabled: true
此外,還能夠經過以下代碼配置針對sayHelloServiceProvider服務的hystrix參數。其中,第3行指定了hystrix所做用的服務名,第7行指定了請求時間一旦超過1000毫秒(也就是1秒),就會啓動熔斷模式,調用定義在回退方法中的業務動做。
1 hystrix: 2 command: 3 sayHelloServiceProvider: 4 execution: 5 isolations: 6 threads: 7 timeoutInMilliseconds: 1000
在啓動類ServiceCallerApp.java中,增長啓動hystrix斷路器的註解,如第5行所示,這個類的關鍵代碼以下。
1 //省略必要的package和import方法 2 EnableFeignClients 3 @EnableDiscoveryClient 4 @SpringBootApplication 5 @EnableCircuitBreakers 6 public class ServiceCallerApp 7 { 8 //省略其餘代碼 9 }
新建一個名爲ControllerForFeignHystrix.java的控制器類,代碼以下。
1 //省略必要的package和import代碼 2 @FeignClient(value = "sayHelloServiceProvider",fallback=FeignClientHystrixToolFallback.class) 3 interface FeignClientHystrixTool{ 4 @RequestMapping(method = RequestMethod.GET, value = "/hello/{name}") 5 String sayHelloInClient(@RequestParam("name") String name); 6 }
在第3行中,咱們定義了一個名爲FeignClientHystrixTool的接口;在第2行的註解中,咱們定義了它將以Feign的形式調用sayHelloServiceProvider中的服務,而且經過fallback配置指定一旦出現調用異常,將調用FeignClientHystrixToolFallback類中的回退方法。
7 @Component 8 class FeignClientHystrixToolFallback implements FeignClientHystrixTool{ 9 public String sayHelloInClient(String name) 10 { return "In Fallback Function."; } 11 }
在第8行的FeignClientHystrixToolFallback類中,咱們將定義針對FeignClientHystrixTool接口的回退方法。
注意該類必須和第2行中fallback指定的類同名,並且,該類須要實現(implements)FeignClientHystrixTool接口,在其中的sayHelloInClient方法中定義了回退動做,這裏的動做是打印一段話。
12 @RestController 13 public class ControllerForFeignHystrix { 14 @Autowired 15 private FeignClientHystrixTool tool; 16 @RequestMapping(value = "/callHelloAsHystrix/{username}", method = RequestMethod.GET) 17 public String callHelloAsHystrix(@PathVariable("username") String username) 18 { return tool.sayHelloInClient(username);} 19 }
在第13行中,咱們定義了一個包含@RestController註解的控制器類ControllerForFeignHystrix,在其中第17行的callHelloAsHystrix方法中,咱們是以Feign的形式調用sayHelloInClient方法的。
至此,完成代碼的編寫工做。咱們依次啓動FeignDemo-Server、FeignDemo-ServiceProvider和FeignDemo-ServiceCaller項目,隨後在瀏覽器中輸入http://localhost:8080/callHelloAsHystrix/Peter,此時能看到「hello Peter」的輸出,這個是正常的調用流程。
若是咱們關閉FeignDemo-ServiceProvider項目,也就是說sayHelloServiceProvider服務不可用了,若是再次在瀏覽器中輸入http://localhost:8080/callHelloAsHystrix/Peter,此時就會走熔斷保護的流程,觸發FeignClientHystrixToolFallback 類中的sayHelloInClient方法,在瀏覽器中輸出「In Fallback Function「的字樣。
本文謝絕轉載,若是要代碼,請和做者聯繫。Spring Cloud相關博文以下: