問題
在SpringBoot中簡單內建Feign,不想使用Rest Temple了。
步驟
Maven
<properties>
<spring.cloud-version>2022.0.1</spring.cloud-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.yml
logging:
level:
com:
xxx:
xxx:
xxx:
xxxxClient: DEBUG
spring:
cloud:
openfeign:
autoconfiguration:
jackson:
enabled: true
okhttp:
enabled: true
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
xxxxClient:
url: https://api.xxxx.xxxx.com
這裡啟用了jackson,作為feign的序列化和反序列化解析器;啟用了okhttp,預設是沒有啟用的;連接配接等待逾時時間5秒;讀取連接配接逾時時間5秒;日志全部記錄下來。xxxxClient為feign中被定義用戶端名稱。
注意:OpenFeign
loggerLevel
值,依賴Spring的日志配置,即
logging.level.com.xxx.xxx.xxx.xxxxClient
。
Spring
Application.java
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
xxxxClient.java
@FeignClient("xxxxClient")
public interface xxxxClient {
@GetMapping(path = "/demo/${xxx.id}")
ResVo demoEndpoint();
}
這裡主要就是一個Get請求,調用遠端服務。注意:
@FeignClient("xxxxClient")
裡面的用戶端名稱,必須與application.yml檔案中儲存一緻;還有一個點值得關注就是請求路徑中的
${xxx.id}
是讀取配置檔案中的配置的相關值,類似如下:
xxx:
id: 你的配置值
測試
下面是在Spring中嘗試使用feign的日志輸出:
總結
OpenFeign相比RestTemplate,還是少關心一些事情,例如:不太操心逾時的實作,而且,更加容易解決Service的概念。OpenFeign與RestTemplate的對比有點像JdbcTemplate與MyBaits的對比。
參考:
- 1.3. Timeout Handling
- Appendix A: Common application properties
- Feign Logging Configuration