方式一(繼承):給消費者的FeignClient和提供者的Controller定義統一的父接口作為标準。
缺點
- 服務緊耦合
- 父接口參數清單中的映射不會被繼承
方式二(抽取):将FeignClient抽取為獨立子產品,并且把接口有關的POJO、預設的Feign配置都放到這個子產品中,提供給所有消費者使用
總結
Feign的最佳實踐:
① 讓controller和FeignClient繼承同一接口
② 将FeignClient、POJO、Feign的預設配置都定義到一個項目中,供所有消費者使用
抽取FeignClient
實作最佳實踐方式二的步驟如下:
- 首先建立一個module,命名為feign-api,然後引入feign的starter依賴
- 将order-service中編寫的UserClient、User、DefaultFeignConfiguration都複制到feign-api項目中
- 在order-service中引入feign-api的依賴
- 修改order-service中的所有與上述三個元件有關的import部分,改成導入feign-api中的包
- 重新開機測試
1.建立module,并導入依賴
2.将order-service中編寫的UserClient、User、DefaultFeignConfiguration都複制到feign-api項目中,并将order-service中相同的檔案删除掉
- 在order-service中引入feign-api的依賴
- 修改order-service中的所有與上述三個元件有關的import部分,改成導入feign-api中的包
- 重新開機測試
重新開機之後報錯,因為無法掃描到cn.itcast.feign的包
解決方法
當定義的FeignClient不在SpringBootApplication的掃描包範圍時,這些FeignClient無法使用。
有兩種方式解決:
方式一:指定FeignClient所在包
方式二:指定FeignClient位元組碼
第一種
第二種(推薦)
總結
不同包的FeignClient的導入有兩種方式:
① 在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包
② 在@EnableFeignClients注解中添加clients,指定具體FeignClient的位元組碼