Feign:SpringCloud的官網對它的定義是這樣的:
是一個聲明式的Web服務客戶端。它支持Feign本身的注解、JAX-RS注解以及SpringMVC的注解。Spring Cloud集成Ribbon和Eureka以在使用Feign時提供負載均衡的http客戶端。
Feign的使用
我們先來看一看如何在項目中使用Feign
1. 首先呢 ,我們把原先的cloud-demo-consumer項目復制一份,artifactId改為cloud-demo-consumer-feign,然后添加依賴 (溫馨提醒,沒有看過前幾篇文章的朋友,建議先從第一篇文章開始學習效果更佳哦 每天學點SpringCloud(一):使用SpringBoot2.0.3整合SpringCloud)
<dependency> <groupId>org.springframework.cloud</groupId> <!--注意此處的依賴是SpringBoot2.0以后專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-feign--> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.CloudDemoConsumerApplication啟動類改名為CloudDemoConsumerFeignApplication,刪除上次使用的RestTemplate,並在類上添加注解@EnableFeignClients,標示此項目為Feign客戶端
@SpringBootApplication
@EnableEurekaClient @EnableFeignClients public class CloudDemoConsumerFeignApplication { public static void main(String[] args) { SpringApplication.run(CloudDemoConsumerFeignApplication.class, args); } }
3.在cn.org.zhixiang包下增加feign包 然后添加UserFeignClient接口:
@FeignClient("provider-demo") public interface UserFeignClient { @GetMapping (value = "/user/getUser/{id}") public User getUser(@PathVariable("id")Long id); }
這個接口呢,就是我們使用Feign的關鍵了,我們先來看一下@FeignClient("provider-demo")注解,它括號里的內容 看着是不是很熟悉,這不就是我們的服務提供者的名稱么,對其實它就是我們需要調用的服務的spring.application.name。
接着是@RequestMapping(value = "/user/getUser/{id}", method = RequestMethod.GET)
@PathVariable("id"),這個注解咋還寫上value了呢,我記得沒寫過呀,其實這就是一個坑了,如果不寫的話是啟動不起來滴。
4.接着我們看UserController類,剛才我們已經把RestTemple的Bean給干掉了,那么在這斷然沒有在使用它的道理。
我們現在要使用的就是我們剛才定義的UserFeignClient 接口
@RestController
@RequestMapping("/user") public class UserController { @Autowired private UserFeignClient userFeignClient; @GetMapping("/getUser/{id}") public User getUser(@PathVariable Long id){ return userFeignClient.getUser(id); } }
5現在我們就可以測試了,先啟動Eureka服務,然后隨便啟動我們定義的兩個服務提供者中的其中一個,最后啟動我們的這個項目。
瀏覽器訪問http://localhost:8089/user/getUser/1,不知道你獲取到數據了么?
修改Feign的默認配置
修改Feign的默認配置其實也存在包掃描的問題,因為上一篇文章(自定義Eureka集群負載均衡策略)已經講過了,這里就不浪費時間了,沒有看過的同學可以先去參考一下。
這里我們就簡單省事,把配置文件放到ComponentScan掃描不到的地方吧:cn.org.config,在這里呢,我們新建了Configuration配置類
@org.springframework.context.annotation.Configuration public class Configuration { @Bean public Contract feignContract() { return new Contract.Default(); } }
然后在UserFeignClient類中指定configuration
@FeignClient(value = "provider-demo",configuration = Configuration.class)
注意,我們在此類中修改了Feign的Contract ,那么Contract 是什么呢。它叫做契約。因為Feign一開始使用的契約是SpringMVC,所以剛才我們SpringMVC的注解的時候直接成功了,但是你如果現在啟動項目你就會發現已經啟動不了了。因為Contract.Default()使用的契約是Feign自己的,也就是說我們要把SpringMVC的注解修改為Feign的注解
SpringMVC版本
@GetMapping (value = "/user/getUser/{id}") public User getUser(@PathVariable("id")Long id);
Feign版本
@RequestLine("GET /user/getUser/{id}") public User getUser(@Param("id") Long id);
當你學會修改Feign的契約時修改別的默認同樣不在話下了已經。
GitHub:https://github.com/shiyujun/spring-cloud-demo
如果對您有所幫助,請記得幫忙點一個star哦

本文出自https://zhixiang.org.cn/#/blog/read/9886acc8-96fa-4af0-9ab4-a99721474f51,轉載請保留。
