一、Feign是什么?
OpenFeign是Spring Cloud提供的一個(gè)聲明式的偽Hltp客戶(hù)端,它使得調(diào)用遠(yuǎn)程服務(wù)就像調(diào)用本地服務(wù)一樣簡(jiǎn)單,只需要?jiǎng)?chuàng)建一個(gè)接口并添加一個(gè)注解即可,Nacos很好的兼容了OpenFeign,OpenFeign默認(rèn)集成了Ribbon,
所以在Nacos下使用OpenFeign默認(rèn)就實(shí)現(xiàn)了負(fù)載均衡的效果。
二、使用步驟
1.消費(fèi)方導(dǎo)入依賴(lài)
???c
org.springframework.cloud
spring-cloud-starter-openfeign
???
2.服務(wù)消費(fèi)方的主程序啟動(dòng)類(lèi)添加注解,開(kāi)啟@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.服務(wù)消費(fèi)方 創(chuàng)建遠(yuǎn)程調(diào)用接口
@Service @FeignClient("user-6001") public interface UserFeignService { @GetMapping("/api/user/{id}") public R getUserNameById(@PathVariable("id") Integer id); }
代碼如下(示例):
4.更改代碼后測(cè)試
@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); } }
補(bǔ)充
1.重試機(jī)制
1:如果所有的重試完成 還是失敗 要拋出 feign.RetryableException 異常 2: 重試 會(huì)產(chǎn)生接口的冪等性問(wèn)題: 1:查詢(xún)的接口 天生是冪等的 2: 增刪改的處理 非冪等的
配置 | 說(shuō)明 |
---|---|
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds | 斷路器的超時(shí)時(shí)間需要大于ribbon的超時(shí)時(shí)間,不然不會(huì)觸發(fā)重試。 |
hello-service.ribbon.ConnectTimeout | 請(qǐng)求連接的超時(shí)時(shí)間 |
hello-service.ribbon.ReadTimeout | 請(qǐng)求處理的超時(shí)時(shí)間 |
hello-service.ribbon.OkToRetryOnAllOperations | 是否對(duì)所有操作請(qǐng)求都進(jìn)行重試 |
hello-service.ribbon.MaxAutoRetriesNextServer | 重試負(fù)載均衡其他的實(shí)例最大重試次數(shù),不包括首次server |
2 遠(yuǎn)程調(diào)用的時(shí)候出現(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的傳遞參數(shù)方式注意事項(xiàng)
如果你傳遞的參數(shù),比較復(fù)雜時(shí),默認(rèn)會(huì)采用POST的請(qǐng)求方式。
- 傳遞單個(gè)參數(shù)時(shí),推薦使用@PathVariable,如果傳遞的單個(gè)參數(shù)比較多,這里也可以采用@RequestParam,不要省略value屬性
- 傳遞對(duì)象信息時(shí),統(tǒng)一采用json的方式,添加@RequestBody。Client接口必須采用@RequestMapping
spring cloud項(xiàng)目使用feign的時(shí)候都會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,就是get方式無(wú)法解析對(duì)象參數(shù)。其實(shí)feign是支持對(duì)象傳遞的,但是得是Map形式,而且不能為空,與spring在機(jī)制上不兼容,因此無(wú)法使用。
spring cloud在2.1.x版本中提供了@SpringQueryMap注解,可以傳遞對(duì)象參數(shù),框架自動(dòng)解析。
調(diào)用方feign接口只能是 | 被調(diào)用方接口 |
---|---|
public R f1(User user) 或 public R f1(@RequestBoby User user) | 參數(shù) @RequstBoby 對(duì)象 |
public R f1(@SpringQueryMap User user) | 參數(shù) 對(duì)象 |
總結(jié)
FEIGN 集成ribbon 和 resttemplate,簡(jiǎn)化 服務(wù)之間的調(diào)用
Feign是通過(guò)內(nèi)置的Ribbon進(jìn)行負(fù)載均衡,并通過(guò)HTTP去訪問(wèn)被調(diào)用方,所以Feign的重試,其實(shí)就是Ribbon的重試。另外,我們?cè)趯?shí)際工作中使用Feign,用到Hystrix,在這里就順便說(shuō)一下Hystrix的原理。舉例說(shuō)明下,假如在沒(méi)有Hystrix的情況下,用戶(hù)一個(gè)下單操作需要調(diào)用訂單、支付、物流三個(gè)服務(wù),如果其中物流Service因?yàn)榉N種問(wèn)題不能提供服務(wù),即便另外兩個(gè)服務(wù)都好好的,整個(gè)下單操作也會(huì)因?yàn)槲锪鱏ervice而阻塞住,導(dǎo)致下單服務(wù)崩潰。而Hystrix為每個(gè)依賴(lài)的服務(wù)配置獨(dú)立的線程池并進(jìn)行隔離,假設(shè)下單服務(wù)有90個(gè)線程,沒(méi)有Hystrix,則因?yàn)槲锪鱏ervice不能提供服務(wù),不停地重試直到90個(gè)線程全卡死。而有了Hystrix,三個(gè)依賴(lài)的服務(wù),每個(gè)30個(gè)線程,即便物流的30個(gè)全部阻塞了,也不影響另外兩個(gè)服務(wù)的線程。
到此這篇關(guān)于Java之Springcloud Feign組件詳解的文章就介紹到這了,更多相關(guān)Java之Springcloud Feign內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/weixin_56219549/article/details/119512946