咱們以前調用遠程服務的方式以下代碼:html
String url="http://lagou-service-resume/resume/openstate/"+userId; Integer forObject =restTemplate.getForObject(url,Integer.class);
這種方式存在兩個問題:java
由此,Feign運用而生。git
Feign是Netflix開發的⼀個輕量級RESTful的HTTP服務客戶端(⽤它來發起請求,遠程調⽤的) ,是以Java接⼝註解的⽅式調⽤Http請求,⽽不⽤像Java中經過封裝HTTP請求報⽂的⽅式直接調⽤, Feign被⼴泛應⽤在Spring Cloud 的解決⽅案中。
相似於Dubbo,服務消費者拿到服務提供者的接⼝,而後像調⽤本地接⼝⽅法⼀樣去調⽤,實際發出的是遠程的請求。
SpringCloud對Feign進⾏了加強,使Feign⽀持了SpringMVC註解(也即OpenFeign)spring
新建服務消費者模塊lagou-service-autodeliver-8092,在服務消費者模塊中引入feign的jar:json
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
注意: Feign = RestTemplate+Ribbon+Hystrix, 因此咱們不須要引入ribbon及Hystrix相關的jar。
在服務消費者的啓動類上添加@EnableFeignClients註解。app
接口ResumeServiceFeginClient:dom
//value是調用的服務名稱,和服務提供者yml文件中的spring.application.name保持一致 @FeignClient(value = "lagou-service-resume") @RequestMapping("/resume") public interface ResumeServiceFeginClient { @GetMapping("/openstate/{userId}") Integer findDefaultResumeState(@PathVariable(value = "userId") Long userId) ; }
說明:ide
1)@FeignClient註解的name屬性⽤於指定要調⽤的服務提供者名稱,和服務提供者yml⽂件中spring.application.name保持⼀致微服務
2)接⼝中的接⼝⽅法,就好⽐是遠程服務提供者Controller中的Hander⽅法(只不過如同本地調⽤了),那麼在進⾏參數綁定的時,可使⽤@PathVariable、 @RequestParam、@RequestHeader等,這也是OpenFeign對SpringMVC註解的⽀持,可是須要注意value必須設置,不然會拋出異常性能
在controller中實現調用:
@RestController public class AutoDeliverController { @Autowired private ResumeServiceFeginClient resumeServiceFeginClient; @GetMapping("/checkState/{userId}") public Integer checkStateTimeout(@PathVariable Long userId) { return resumeServiceFeginClient.findDefaultResumeState(userId); } }
啓動調用效果:
在服務消費者模塊lagou-service-autodeliver-8092的application.yml文件中配置相關參數,介紹以下:
#針對的被調⽤⽅微服務名稱,不加就是全局⽣效 lagou-service-resume: ribbon: #請求鏈接超時時間 #ConnectTimeout: 2000 #請求處理超時時間 #ReadTimeout: 5000 #對全部操做都進⾏重試 OkToRetryOnAllOperations: true ####根據如上配置,當訪問到故障請求的時候,它會再嘗試訪問⼀次當前實例(次數由MaxAutoRetries配置), ####若是不⾏,就換⼀個實例進⾏訪問,若是還不⾏,再換⼀次實例訪問(更換次數由MaxAutoRetriesNextServer配置), ####若是依然不⾏,返回失敗信息。 MaxAutoRetries: 0 #對當前選中實例重試次數,不包括第⼀次調⽤ MaxAutoRetriesNextServer: 0 #切換實例的重試次數 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #負載策略調整
feign共有下面四種日誌級別:
NONE:默認的,不顯示任何⽇志----性能最好
BASIC:僅記錄請求⽅法、 URL、響應狀態碼以及執⾏時間----⽣產問題追蹤
HEADERS:在BASIC級別的基礎上,記錄請求和響應的header
FULL:記錄請求和響應的header、 body和元數據----適⽤於開發及測試環境定位問題
@Configuration public class FeignConfig { @Bean Logger.Level feignLevel() { return Logger.Level.FULL; } }
在application.yml中配置對於接口的日誌級別爲debug:
logging: level: #Feign⽇志只會對⽇志級別爲debug的作出響應 com.lagou.edu.service.ResumeServiceFeginClient: debug
調用測試:
能夠看到輸出了詳細的日誌信息,包含響應時長,返回結果等信息。
application.yml:
#開啓feign的熔斷功能 feign: hystrix: enabled: true
自定義服務回退處理類,須要實現ResumeServiceFeignClient接口,並加上@Component註解被spring管理,實現須要降級的處理邏輯:
@Component public class ResumeFallback implements ResumeServiceFeginClient{ @Override public Integer findDefaultResumeState(Long userId) { return -100; } }
在ResumeServiceFeginClient接口中也須要稍做修改,添加fallback屬性指向回退的服務類,還有以前的@RequestMapping註解改寫到path屬性當中去:
//value是調用的服務名稱,和服務提供者yml文件中的spring.application.name保持一致 @FeignClient(value = "lagou-service-resume",fallback = ResumeFallback.class,path = "/resume") public interface ResumeServiceFeginClient { @GetMapping("/openstate/{userId}") Integer findDefaultResumeState(@PathVariable(value = "userId") Long userId) ; }
application.yml中配置hystrix的超時時長:
hystrix: command: default: execution: isolation: thread: #####################Hystrix的超時時⻓設置 timeoutInMilliseconds: 15000
以前咱們配置文件中配置的feign的超時時長:
注意:
這兩個超時時長,不管哪個超時都會進行熔斷,服務降級。也就是根據這兩個時間的最小值來進行熔斷,進入自定義的回退降級邏輯。
測試服務降級效果:
Feign ⽀持對請求和響應進⾏GZIP壓縮,以減小通訊過程當中的性能損耗。經過下⾯的參數便可開啓請求與響應的壓縮功能:
feign: compression: request: enabled: true # 開啓請求壓縮 mime-types: text/html,application/xml,application/json # 設置壓縮的數據類型,此處也是默認值 min-request-size: 2048 # 設置觸發壓縮的⼤⼩下限,此處也是默認值 response: enabled: true # 開啓響應壓縮
feign-demo源碼:feign-demo案例源碼
歡迎訪問個人博客:https://www.liuyj.top