一 前言
前文我們使用過了使用restTemplate結合Ribbon實現了HTTP遠程過程調用消費服務,由於使用直接使用RestTenplate進行服務調用不是很理想,所以我們選擇更好方式使用Feign進行Web Service 調用;之前文章的學習jdk版本都是基於javaSE8.0,Feign也是如此,不支持8.0以下,如果是初學者,請看知識追尋者cloud系列文章從頭開始看,否則會一頭霧水;
本篇文章的Feign只是入門級別,主要講解feign的工作流程,基本TTTP遠程調用,相關基本配置等,后續會出主流高級配置;
二 Feign 簡介
Feign的由來是基於retrofit , jax-rs,JSR 356, Java API for WebSocket;其內部對RestTemplate進行了封裝,在使用過程中簡化了HTTP遠程過程調用過程,使開發人員使用更加簡便;
Feign特色如下:
- 響應緩存支持,可多中類型選擇;支持擴展的緩存,如EhCache, Google, Spring;
- 完整的URI 模板表達式語言支持;
- 類SLF4J 日志支持;
三 Feign的工作流
@EnableFeignClients 表示開啟Feign功能,然后掃描 注解@FeignClient,程序啟動后,會將這些類掃描進IOC容器;Feign會 對 RestTemplate 進行 封裝,簡化HTTP遠程過程調用;RestTemplate使用Request 模板生成新的Requst 發送請求,其底層通常是基於URLConnection;
四 Eureka-Client
在之前的Eureka-Clinet 工程的表現層包創建新的controller層API用於服務提供;
/**
* @Author lsc
* <p> 知識追尋者 Feign 服務消費</p>
*/
@RestController
public class FeignProvoderController {
@GetMapping("zszxz/feign")
public String getFeign(){
return "the get method of feign test";
}
}
五 Feign-client
在父工程中創建新的 子工程 Feign-client;
5.1 pom.xml
添加openfeign 依賴;
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
5.2 application.yml
這邊我們使用新的端口8093,應用名稱是 feign-client; 同樣將服務注入peer1,peer2,peer3;並且設置feign的客戶端屬性,比如連接時間,讀取時間,日志級別;
server:
port: 8093
spring:
application:
name: feign-client # 應用名稱
eureka:
client:
service-url:
# 服務注冊地址
defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
feign:
client:
config:
default:
connectTimeout: 5000 # 連接超時時間
readTimeout: 5000 # 讀超時時間
loggerLevel: full # 日志級別
5.3 service
在service 接口 上標明注解 @FeignClient表示 是 一個Feign的客戶端類; 屬性 name 表示 Feign客戶端名稱;value表示服務提供者的應用名稱;由於 eureka-client 中 提供了表現層API,我們 在service接口中定義相應的方法並且使用@GetMapping注解,里面配上需要調用的path,表示我們具體要消費的服務;
/**
* @Author lsc
* <p> </p>
*/
@FeignClient( name = "eureka-client", value = "eureka-client")
public interface FeignService {
@GetMapping("zszxz/feign")
public String getFeign();
}
5.4 controller
controller層也就是平常的表現層,沒什么特別之處,直接調用service接口提供的API;
/**
* @Author lsc
* <p> feign 表現層 </p>
*/
@RestController
public class FeignController {
@Autowired
FeignService feignService;
@GetMapping("zszxz/feign")
public String getFeign(){
// 調用 getFeign方法
return feignService.getFeign();
}
}
5.5 啟動類
在啟動類上方標明@EnableFeignClients,其表示啟用feign功能,掃描@FeignClient 標明的類入IOC容器;
/**
* @Author lsc
* <p> feign啟動類</p>
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients//表示啟用feign
public class FeignApp {
public static void main(String[] args) {
SpringApplication.run(FeignApp.class,args);
}
}
六 調用結果
6.1 工程結構如下
6.2 結果
啟動工程,訪問地址 http://localhost:8093/zszxz/feign ; 結果如下如,表示使用Feign調用HTTP服務消費成功;
七 @FeignClient注解說明
當 IOC容器中有相同的實例,@Autowired 會不起作用,此時會報錯,使用@Primary 標明哪一個實例是首要實例,會優先被IOC掃描注入;
屬性 | 說明 |
---|---|
name | Feign Client的名稱 支持占位符${} |
serviceId | 服務id |
value | 指定 serviceId |
url | 指定調用的URl, 支持占位符${} |
decode404 | 404錯誤時,設置為true,會進行decode解碼,否則FeignException |
fallback | 容錯處理 |
fallbackFactory | 生成fallback模板示例,減少重復代碼 |
path | Path統一前綴 |
primary | 設置為 primary Bean |
qualifier | 為Feign Client 新增注解@Qualifier |
八 日志設置
每個 Feign client 都會創建日志,默認是接口的全類名作為日志名稱,日志響應僅支持debug模式;日志的配置方式有兩步驟,一是通過配置文件,二是通過JAVA注解配置類;
日志級別 | 說明 |
---|---|
NONE | 沒有日志(默認) |
BASIC | 請求和響應的狀態碼,時間 |
HEADERS | 基於Basic加上請求和響應頭 |
FULL | 請求和響應的 head ,body 和元數據 |
8.1 application.yml
在 application.yml 中添加如下配置
logging:
level:
com.zszxz.feign.service: Debug
8.2 config
配置類如下
/**
* @Author lsc
* <p> </p>
*/
@Configuration
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
8.3 指定Config
在 @FeignClien 中可以指定具體使用Feign的配置類,此時會覆蓋feign的默認配置;
@FeignClient( name = "eureka-client", value = "eureka-client",configuration = FeignConfiguration.class)
九參考文檔
https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html