springcloud學習(四)之Feign

前言

咱們以前調用遠程服務的方式以下代碼:html

String url="http://lagou-service-resume/resume/openstate/"+userId;
Integer forObject =restTemplate.getForObject(url,Integer.class);

這種方式存在兩個問題:java

  • 須要拼接url
  • 調用方式比較模板化

由此,Feign運用而生。git

Feign簡介

Feign是Netflix開發的⼀個輕量級RESTful的HTTP服務客戶端(⽤它來發起請求,遠程調⽤的) ,是以Java接⼝註解的⽅式調⽤Http請求,⽽不⽤像Java中經過封裝HTTP請求報⽂的⽅式直接調⽤, Feign被⼴泛應⽤在Spring Cloud 的解決⽅案中。
相似於Dubbo,服務消費者拿到服務提供者的接⼝,而後像調⽤本地接⼝⽅法⼀樣去調⽤,實際發出的是遠程的請求。
SpringCloud對Feign進⾏了加強,使Feign⽀持了SpringMVC註解(也即OpenFeignspring

Feign的使用

新建服務消費者模塊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

建立feign接口

接口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必須設置,不然會拋出異常性能

feign接口的調用

在controller中實現調用:

@RestController
public class AutoDeliverController {

    @Autowired
    private ResumeServiceFeginClient resumeServiceFeginClient;

    @GetMapping("/checkState/{userId}")
    public Integer checkStateTimeout(@PathVariable Long userId) {
        return resumeServiceFeginClient.findDefaultResumeState(userId);
    }

}

啓動調用效果:


Feign對Ribbon的支持

在服務消費者模塊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的日誌級別

配置Feign的⽇志級別(Feign請求過程信息)

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

調用測試:

能夠看到輸出了詳細的日誌信息,包含響應時長,返回結果等信息。


Feign對熔斷器的支持

開啓feign的熔斷功能

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對請求及響應壓縮的支持

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

相關文章
相關標籤/搜索