Springcloud(二) feign
- 2021 年 12 月 23 日
- 筆記
- JAVA, SpringCloud, fegin
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(); } }
-



