Java之Springcloud Feign組件詳解
一、Feign是什么?
OpenFeign是Spring Cloud提供的一個聲明式的偽Hltp客戶端,它使得調用遠程服務就像調用本地服務一樣簡單,只需要創(chuàng)建一個接口并添加一個注解即可,Nacos很好的兼容了OpenFeign,OpenFeign默認集成了Ribbon,
所以在Nacos下使用OpenFeign默認就實現(xiàn)了負載均衡的效果。
二、使用步驟

1.消費方導入依賴
···c
org.springframework.cloud
spring-cloud-starter-openfeign
···
2.服務消費方的主程序啟動類添加注解,開啟@EnableFeignClients
@SpringBootApplication
@MapperScan("com.csqf.mapper")
@Import({
Swagger2Config.class,
ControllerExceptionAdvice.class,
})
@EnableFeignClients
public class springcloud_share_6002 {
public static void main(String[] args) {
SpringApplication.run(springcloud_share_6002.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

3.服務消費方 創(chuàng)建遠程調用接口
@Service
@FeignClient("user-6001")
public interface UserFeignService {
@GetMapping("/api/user/{id}")
public R getUserNameById(@PathVariable("id") Integer id);
}
代碼如下(示例):
4.更改代碼后測試
@RestController
@RequestMapping("/api/share")
public class ShareContoller {
@Autowired
private ShareServiceImpl shareService;
// @Autowired
// private RestTemplate restTemplate;
// @Autowired
// private DiscoveryClient discoveryClient;
@Autowired
private UserFeignService userFeignService;
@GetMapping("/{id}")
public R getShareById(@PathVariable("id") Integer id) {
Share share = shareService.getShareById(id);
R r = userFeignService.getUserNameById(share.getUserId());
String s = r.getData().toString();
ShareDto shareDto = new ShareDto();
BeanUtils.copyProperties(share,shareDto);
shareDto.setUserName(s);
return new R(ResponseEnum.SUCCESS,shareDto);
}
}
補充
1.重試機制
1:如果所有的重試完成 還是失敗 要拋出 feign.RetryableException 異常 2: 重試 會產生接口的冪等性問題: 1:查詢的接口 天生是冪等的 2: 增刪改的處理 非冪等的
| 配置 | 說明 |
|---|---|
| hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds | 斷路器的超時時間需要大于ribbon的超時時間,不然不會觸發(fā)重試。 |
| hello-service.ribbon.ConnectTimeout | 請求連接的超時時間 |
| hello-service.ribbon.ReadTimeout | 請求處理的超時時間 |
| hello-service.ribbon.OkToRetryOnAllOperations | 是否對所有操作請求都進行重試 |
| hello-service.ribbon.MaxAutoRetriesNextServer | 重試負載均衡其他的實例最大重試次數,不包括首次server |
2 遠程調用的時候出現(xiàn)異常的處理(ControllerExceptionAdvice)
@ExceptionHandler(RetryableException.class)
@ResponseBody
public R doException(RetryableException ex){
ex.printStackTrace();
// System.out.println("拋出未知異常");
return new R(ResponseEnum.FEIGN_RETRY,null);
}
3.Feign的傳遞參數方式注意事項
如果你傳遞的參數,比較復雜時,默認會采用POST的請求方式。
- 傳遞單個參數時,推薦使用@PathVariable,如果傳遞的單個參數比較多,這里也可以采用@RequestParam,不要省略value屬性
- 傳遞對象信息時,統(tǒng)一采用json的方式,添加@RequestBody。Client接口必須采用@RequestMapping



spring cloud項目使用feign的時候都會發(fā)現(xiàn)一個問題,就是get方式無法解析對象參數。其實feign是支持對象傳遞的,但是得是Map形式,而且不能為空,與spring在機制上不兼容,因此無法使用。
spring cloud在2.1.x版本中提供了@SpringQueryMap注解,可以傳遞對象參數,框架自動解析。
| 調用方feign接口只能是 | 被調用方接口 |
|---|---|
| public R f1(User user) 或 public R f1(@RequestBoby User user) | 參數 @RequstBoby 對象 |
| public R f1(@SpringQueryMap User user) | 參數 對象 |

總結
FEIGN 集成ribbon 和 resttemplate,簡化 服務之間的調用
Feign是通過內置的Ribbon進行負載均衡,并通過HTTP去訪問被調用方,所以Feign的重試,其實就是Ribbon的重試。另外,我們在實際工作中使用Feign,用到Hystrix,在這里就順便說一下Hystrix的原理。舉例說明下,假如在沒有Hystrix的情況下,用戶一個下單操作需要調用訂單、支付、物流三個服務,如果其中物流Service因為種種問題不能提供服務,即便另外兩個服務都好好的,整個下單操作也會因為物流Service而阻塞住,導致下單服務崩潰。而Hystrix為每個依賴的服務配置獨立的線程池并進行隔離,假設下單服務有90個線程,沒有Hystrix,則因為物流Service不能提供服務,不停地重試直到90個線程全卡死。而有了Hystrix,三個依賴的服務,每個30個線程,即便物流的30個全部阻塞了,也不影響另外兩個服務的線程。
到此這篇關于Java之Springcloud Feign組件詳解的文章就介紹到這了,更多相關Java之Springcloud Feign內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Boot獲取resources目錄下的文件三種方式詳解
在Spring?Boot項目中,經常需要獲取resources目錄下的文件,這些文件可以包括配置文件、模板文件、靜態(tài)資源等,這篇文章主要介紹了Spring?Boot獲取resources目錄下的文件的三種方式,需要的朋友可以參考下2023-06-06
spring?boot?實現(xiàn)一個?禁止重復請求的方法
這篇文章主要介紹了spring?boot?實現(xiàn)一個?禁止重復請求,當重復請求該方法時,會返回"Duplicate?request",避免重復執(zhí)行相同的操作,需要的朋友可以參考下2024-03-03
Spring?Data?JPA框架快速入門之自定義Repository接口
Spring?Data?JPA是Spring基于JPA規(guī)范的基礎上封裝的?套?JPA?應?框架,可使開發(fā)者?極簡的代碼即可實現(xiàn)對數據庫的訪問和操作,本篇我們來了解Spring?Data?JPA框架的自定義Repository接口2022-04-04
SpringBoot淺析安全管理之Spring Security配置
安全管理是軟件系統(tǒng)必不可少的的功能。根據經典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理Spring Security基本配置2022-08-08
Spring Boot 整合 Apache Dubbo的示例代碼
Apache Dubbo是一款高性能、輕量級的開源 Java RPC 框架,這篇文章主要介紹了Spring Boot 整合 Apache Dubbo的方法,本文通過示例說明給大家講解的非常詳細,需要的朋友可以參考下2021-07-07
基于Jackson實現(xiàn)API接口數據脫敏的示例詳解
用戶的一些敏感數據,例如手機號、郵箱、身份證等信息,在數據庫以明文存儲,但在接口返回數據給瀏覽器(或三方客戶端)時,希望對這些敏感數據進行脫敏,所以本文就給大家介紹以惡如何利用Jackson實現(xiàn)API接口數據脫敏,需要的朋友可以參考下2023-08-08
java算法入門之有效的括號刪除有序數組中的重復項實現(xiàn)strStr
大家好,我是哪吒,一個熱愛編碼的Java工程師,本著"欲速則不達,欲達則欲速"的學習態(tài)度,在程序猿這條不歸路上不斷成長,所謂成長,不過是用時間慢慢擦亮你的眼睛,少時看重的,年長后卻視若鴻毛,少時看輕的,年長后卻視若泰山,成長之路,亦是漸漸放下執(zhí)念,內心歸于平靜的旅程2021-08-08

