Feign makes writing java http clients easier(聲明式http客戶端)官方文檔java
<!--version由父工程定義-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
複製代碼
@EnableFeignClients
複製代碼
無
複製代碼
package com.virgo.user.feignclient;
import com.virgo.entity.TblCar;
import com.virgo.user.configuration.GlobalFeignConfiguration;
import com.virgo.user.feignclient.fallbackFactory.LockCenterFeignClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author zhaozha
* @date 2019/10/11 下午12:52
*/
@FeignClient(name = "lock-center", configuration = GlobalFeignConfiguration.class,fallbackFactory = LockCenterFeignClientFallbackFactory.class)
public interface LockCenterFeignClient {
// 自動構建http://lock-center/lock/test/{id}
@GetMapping("/lock/test/{id}")
TblCar findById(@PathVariable(value="id") Long id);
}
// Controller
...
private final LockCenterFeignClient lockCenterFeignClient;
...
TblCar tblCar = lockCenterFeignClient.findById(4000002L);
...
複製代碼
接口 | 做用 | 默認值 |
---|---|---|
Feign.Builder | Feign的入口 | Feign.Builder |
Client | Feign底層用什麼去請求 | LoadBalancerFeignClient(整合Ribbon)/fengn.Client.Default(不整合Ribbon) |
Contract | 契約,註解支持 | SpringMvcContract |
Encoder | 編碼器,用於將對象轉換成HTTP請求消息體 | SpringEncoder |
Decoder | 解碼器,將響應消息體轉換成對象 | ResponseEntityDecoder |
Logger | 日誌管理器 | Slf4jLogger |
RequestInterceptor | 用於爲每一個請求添加通用邏輯 | 無 |
級別 | 打印內容 |
---|---|
NONE(默認值) | 不記錄任何日誌 |
BASIC | 僅記錄請求的方法/URL/響應狀態碼/執行時間 |
HEADERS | BASIC+請求和響應的header |
FULL | 記錄請求和響應的header/body/元數據 |
細粒度代碼git
Feign日誌級別設置(代碼)
logging:
level:
com.virgo.user.feignclient.LockCenterFeignClient: debug
複製代碼
package com.virgo.user.feignclient;
import com.virgo.entity.TblCar;
import com.virgo.user.configuration.GlobalFeignConfiguration;
import com.virgo.user.feignclient.fallbackFactory.LockCenterFeignClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author zhaozha
* @date 2019/10/11 下午12:52
*/
@FeignClient(name = "lock-center", configuration = GlobalFeignConfiguration.class,fallbackFactory = LockCenterFeignClientFallbackFactory.class)
public interface LockCenterFeignClient {
@GetMapping("/lock/test/{id}")
TblCar findById(@PathVariable(value="id") Long id);
}
GlobalFeignConfiguration.class
package com.virgo.user.configuration;
import feign.Logger;
import org.springframework.context.annotation.Bean;
/**
* @author zhaozha
* @date 2019/10/11 下午1:18
*/
public class GlobalFeignConfiguration {
@Bean
public Logger.Level level(){
// 讓feign打印全部請求的細節
return Logger.Level.FULL;
}
}
複製代碼
細粒度配置github
feign:
client:
config:
lock-center:
loggerLevel: FULL
複製代碼
@EnableFeignClients(defaultConfiguration = GlobalFeignConfiguration.class)
複製代碼
feign:
client:
config:
default:
loggerLevel: FULL
複製代碼
代碼web
配置項 | 做用 |
---|---|
Logger.Level | 指定日誌級別 |
Retryer | 指定重試策略 |
ErrorDecoder | 指定錯誤解碼器 |
Request.Options | 超時時間 |
Collection | 攔截器 |
SetterFactory | Hystrix相關 |
配置spring
feign:
client:
config:
# 全局
default:
# 日誌級別
loggerLevel:
# 鏈接超時時間
connectTimeout:
# 讀取超時時間
readTimeout:
# 錯誤解碼器
errorDecoder:
# 重試策略
retryer:
# 攔截器
requestInterceptors:
# 404錯誤碼解碼
decode404:
# 編碼器
encoder:
# 解碼器
decoder:
# 契約
contract:
複製代碼
todoapache
@GetMapping("/lock/car/{carId}/user/{userId}")
TblCar findById(@PathVariable(value="carId") Long carId,@PathVariable(value="userId") Long userId);
複製代碼
@FeignClient(name="",url="")
複製代碼
feign:
httpclient:
# 讓feign使用apache httpclient作請求;而不是默認的urlconnection
enabled: true
# feign的最大鏈接數
max-connections: 200
# feign單個路徑的最大鏈接數
max-connections-per-route: 50
複製代碼
// 1註解
@FeignClient(....,fallback=xxx.class)
// 2代碼
package com.virgo.user.feignclient.fallback;
import com.virgo.entity.TblCar;
import com.virgo.user.feignclient.LockCenterFeignClient;
import org.springframework.stereotype.Component;
/**
* @author zhaozha
* @date 2019/10/16 下午3:36
*/
@Component
public class LockCenterFeignClientFallback implements LockCenterFeignClient {
@Override
public TblCar findById(Long id,Long userId) {
return TblCar.builder().level(1).build();
}
@Override
public TblCar testPost(String params) {
return null;
}
}
複製代碼
// 1註解
@FeignClient(....,fallbackFactory=xxx.class)
// 2代碼
package com.virgo.user.feignclient.fallbackFactory;
import com.virgo.entity.TblCar;
import com.virgo.user.feignclient.LockCenterFeignClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author zhaozha
* @date 2019/10/16 下午4:02
*/
@Component
@Slf4j
public class LockCenterFeignClientFallbackFactory implements FallbackFactory<LockCenterFeignClient> {
@Override
public LockCenterFeignClient create(Throwable throwable) {
return new LockCenterFeignClient() {
@Override
public TblCar findById(Long id,Long userId) {
log.info("限流/降級",throwable);
return TblCar.builder().level(1).build();
}
@Override
public TblCar testPost(String params) {
return null;
}
};
}
}
複製代碼