Feign和OpenFeign的主要區別如下圖
那我們怎麼使用OpenFeign呢?
1:OpenFeign服務調用
pom.xml
<!-- OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
PaymentService .java
public interface PaymentService {
public int create(Payment payment);
public Payment getPaymentById(@Param("id") Long id);
}
OrderFeignController .java
@RestController
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping("/consumer/feign/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
return paymentFeignService.getPaymentById(id);
}
@GetMapping("/consumer/feign/payment/timeout")
public String getPaymentById() {
// openfeign-ribbon,客戶端默認等待1秒鐘
return paymentFeignService.paymentFeignTimeout();
}
}
application.yml
server:
port: 80
spring:
application:
name: cloud-order-feign-service
eureka:
client:
# true表示將自己註冊進Eureka Server,默認爲true
register-with-eureka: true
# 是否從Eureka Server抓取以有的註冊信息,默認爲true。單節點無所謂,集羣必須設置爲true才能配合Ribbon使用負載均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka
2:OpenFeign超時控制
- 超時控制介紹·
默認Feign客戶端只等待一秒鐘,但是服務靄處理需要超過1秒,導致Feign客戶端不想等待了,直接返回報錯。爲了避免這樣的情況,有時候我們需要設置Feign客戶端的超時控制。 - 解決方法
ym|文件中開啓配置
application.yml
# 設置feign客戶端超時時間(OpenFeign默認支持Ribbon)
ribbon:
# 指的是建立連接後從服務器讀取到可用資源所用時間
ReadTimeout: 5000
# 指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間
ConnectTimeout: 5000
麼配置上面的yml文件時,如果我們調用如下的方法
會報錯
@GetMapping("/feign/timeout")
public String paymentFeignTimeout() {
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
return serverPort;
}
配置了,就會出現以下結果
3:OpenFeign日誌增強
- Feign提供了日誌打印功能,我們可以通過配置來調整日誌級別,從而瞭解Feign中Http請求的細節。說白了就是對Feign接口的調用情況進行監控和輸出
- 日誌級別
1:NONE:默認的,不顯示任何日誌;
2:BASIC:僅記錄請求方法、URL、 響應狀態碼及執行時間;
3:HEADERS:除了BASIC中定義的信息之外,還有請求和響應的頭信息;
4:FULL:除了HEADERS中定義的信息之外,還有請求和響應的正文及元數據。
怎麼使用日誌?
第一步:FeignConfig.java
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
第二步:application.yml
logging:
level:
# feign日誌已什麼級別監控哪個接口
com.atguigu.springcloud.service.PaymentFeignService: debug
第三步:測試該接口下的方法,得到如下日誌