Feign
Spring Cloud Feign對 Ribbon 負載均衡、Hystrix 服務熔斷進行簡化,在其基礎上進行了進一步的封裝,不僅在配置上大大簡化了開發工作,同時還提供了一種宣告式的 Web 服務客戶端定義方式。
使用 Feign 實現消費者
-
建立spring boot工程,並匯入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.5.RELEASE</version> </dependency>
-
在專案入口類上新增@EnableFeignClients 註解表示開啟 Spring Cloud Feign
@SpringBootApplication @EnableEurekaClient @EnableFeignClients public class SpringcloudConsumerApplication { …… }
-
定義一個 HelloService 介面,通過@FeignClient 註解來指定服務名稱,進而繫結服務,然後再通過 SpringMVC 中提供的註解來繫結服務提供者提供的介面。
@FeignClient(name="springcloud-client") public interface HelloService { /** * 宣告一個方法,這個方法就是遠端的服務提供者提供的那個方法 * * @return */ @RequestMapping("/service/hello") String hello(); }
服務提供者:
@RestController public class HelloController { @GetMapping("/service/hello") public String hello() { System.out.println("服務提供者1。。。。。。。"); return "Hello, Spring Cloud,Provider 1"; } }
-
在服務消費者模組中建立一個controller,
@RestController public class FeignController { @Autowired private HelloService helloService; @RequestMapping("/web/hello") public String hello () { //呼叫宣告式的介面方法,實現對遠端服務的呼叫 return helloService.hello(); } }
-
啟動服務消費者,訪問localhost:8764/web/hello
使用 Feign 實現負載均衡和服務熔斷
-
負載均衡:@FeignClient 註解的介面,然後使用@RequestMapping 註解到方法上對映遠端的 REST 服務,此方法是做好負責均衡配置的。
-
服務熔斷
-
匯入 hystrix 依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
在 application.yml 檔案中新增:
feign: hystrix: enabled: true
-
指定熔斷回撥邏輯,自定義回撥類實現介面,並實現對應的方法,即為對應方法的熔斷回撥邏輯。
@FeignClient(name="springcloud-client", fallback = MyFallback.class)
@Component public class MyFallback implements HelloService { @Override public String hello() { return "發生異常了"; } }
-
啟動:
-
為@FeignClient 修飾的介面加上 fallback 方法可以實現遠端服務發生異常後進行服務的熔斷,但是不能獲取到遠端服務的異常資訊,如果要獲取遠端服務的異常資訊,此時可以使用 fallbackFactory:
@FeignClient(name="springcloud-client", fallbackFactory = MyFallbackFactory.class)
@Component public class MyFallbackFactory implements FallbackFactory<HelloService> { @Override public HelloService create(Throwable throwable) { return () -> throwable.getMessage(); } }
-