1.基本概念
- OpenFeign 可以將提供者提供的 Restful 服務僞裝爲接口進行消費,
消費者只需使用“feign 接口 + 註解”的方式即可直接調用提供者提供的 Restful 服務,而無需再使用 RestTemplate 了。 - OpenFeign 與提供者沒有任何關係,是消費者調用提供者的一種方式。
- Ribbon 是 Netflix公司的一個開源的負載均衡項目,是一個客戶端負載均衡器,運行在消費者端。OpenFeign 直接內置了 Ribbon。即在導入 OpenFeign 依賴後,無需再專門導入 Ribbon 依賴了。
2.消費者工程 配置OpenFeign
2.1 pom引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 定義 Feign 接口
@FeignClient("abcmsc-provider-depart")
@RequestMapping("/provider/depart")
public interface DepartService {
@PostMapping("/save")
boolean saveDepart(@RequestBody Depart depart);
@DeleteMapping("/del/{id}")
boolean removeDepartById(@PathVariable("id") int id);
@PutMapping("/update")
boolean modifyDepart(@RequestBody Depart depart);
@GetMapping("/get/{id}")
Depart getDepartById(@PathVariable("id") int id);
@GetMapping("/list")
List<Depart> listAllDeparts();
}
2.3 刪除原來RestTemplate的配置文件
2.4 修改控制器,移除原來的resTemplate
@RestController
@RequestMapping("/consumer/depart")
public class DepartController {
@Autowired
private DepartService departService;
@PostMapping("/save")
public boolean saveHandle(@RequestBody Depart depart) {
return departService.saveDepart(depart);
}
@DeleteMapping("/del/{id}")
public void deleteHandle(@PathVariable("id") int id) {
departService.removeDepartById(id);
}
@PutMapping("/update")
public void updateHandle(@RequestBody Depart depart) {
departService.modifyDepart(depart);
}
@GetMapping("/get/{id}")
public Depart getHandle(@PathVariable("id") int id) {
return departService.getDepartById(id);
}
@GetMapping("/list")
public List<Depart> listHandle() {
return departService.listAllDeparts();
}
}
2.5 啓動類添加註解
@EnableFeignClients(basePackages = "com.demo.consumer018082.service")
2.6 修改配置文件
2.6.1 設置請求超時
feign:
client:
config:
default:
#指定Feign連接提供者的超時時限,其取決於網絡環境
connectTimeout: 5000
#指定Feign從請求到最終獲取到提供者的響應的超時時限,其取決於提供者的業務複雜性
readTimeout: 5000
2.6.2 第一次請求失敗
原因:由於spring的懶加載機制導致大量的類只有在真正使用的纔會真正創建,由於默認的熔斷超時時間(1秒)過短,導致第一次請求很容易失敗,特別互相依賴複雜的時候。
解決方法:提升熔斷超時時間和ribbon超時時間,配置如下:
#設置hystrix超時時間
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=60000
#請求處理的超時時間
ribbon.ReadTimeout=10000
2.6.3 Feign的Http Client
Feign在默認情況下使用的是JDK原生URLConnection發送HTTP請求,沒有連接池,但是對每個地址會保持一個長連接,即利用HTTP的persistence connection。
我們可以用Apache的HTTP Client替換Feign原始的http client,從而獲取連接池、超時時間等與性能息息相關的控制能力。
Spring Cloud從Brixtion.SR5版本開始支持這種替換,首先在項目中聲明Apcahe HTTP Client和feign-httpclient依賴,然後在application.properties中添加:
feign.httpclient.enabled=true
2.6.4 請求響應壓縮
Spring Cloud Feign支持對請求和響應進行GZIP壓縮,以減少通信過程中的性能損耗。我們只需通過下面兩個參數設置,就能開啓請求與響應的壓縮功能:
feign:
compression:
request:
#開啓對請求的壓縮
enable: true
#指定要壓縮的文件類型
mime-type: ["text/xml","application/xml","application/json"]
#啓動壓縮的最小文件大小,單位字節
min -request-size: 2048
response:
#開啓對客戶端響應的壓縮
enable: true
2.6.5 日誌配置
logging.level.com.kyle.client.feign.inter.HelloServiceFeign=DEBUG
只是添加了如上配置,還無法實現對DEBUG日誌的輸出。這時由於Feign客戶端默認對Logger.Level對象定義爲NONE級別,該界別不會記錄任何Feign調用過程中對信息,所以我們需要調整它對級別,針對全局對日誌級別,可以在應用主類中直接假如Logger.Level的Bean創建,具體如下:
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
對於Feign的Logger級別主要有下面4類,可根據實際需要進行調整使用。
NONE:不記錄任何信息。
BASIC:僅記錄請求方法、URL以及響應狀態碼和執行時間。
HEADERS:出了記錄BASIC級別的信息之外,還會記錄請求和響應的頭信息。
FULL:記錄所有請求與響應的細節,包括頭信息、請求體、元數據等。