SpringCloud OpenFeign使用和配置,Java OpenFeign 使用教程


SpringCloud OpenFeign使用和配置,Java OpenFeign 使用教程

SpringCloud  feign日志控制打印配置,SpringCloud feign超時配置

 

================================

©Copyright 蕃薯耀 2021-03-11

https://www.cnblogs.com/fanshuyao/

 

一、SpringCloud OpenFeign概述
spring-cloud-openfeign
聲明式REST客戶端:Feign創建一個用JAX-RS或Spring MVC批注裝飾的接口的動態實現。

官方文檔:

https://docs.spring.io/spring-cloud-openfeign/docs/2.2.7.RELEASE/reference/html/

 

Feign是聲明性的Web服務客戶端。 它使編寫Web服務客戶端更加容易。 要使用Feign,請創建一個接口並對其進行注釋。 它具有可插入注釋支持,包括Feign注釋和JAX-RS注釋。 Feign還支持可插拔編碼器和解碼器。 Spring Cloud添加了對Spring MVC注釋的支持,並支持使用Spring Web中默認使用的相同HttpMessageConverters。 Spring Cloud集成了Ribbon和Eureka以及Spring Cloud LoadBalancer,以在使用Feign時提供負載平衡的http客戶端。

Java版本相容性
Feign 10.x及更高版本基於Java 8構建,並且應可在Java 9、10和11上運行。對於那些需要JDK 6兼容性的應用程序,請使用Feign9.x。

Feign集成了Ribbon,默認是輪詢的負載均衡。

 

二、SpringCloud OpenFeign使用和配置

使用Eureka實現服務注冊和和發現


1、pom.xml引入依賴:spring-cloud-starter-openfeign

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.7.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.2.7.RELEASE</version>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.4</version>
</dependency>

 


2、application.properties配置

server.port=8645

spring.application.name=SPRINGCLOUD-EUREKA-FEIGN-WEB

#eureka服務端的實例名稱
eureka.instance.hostname=eureka8701.com

#eureka實例名稱
eureka.instance.instance-id=eureka-feign-8645
#路徑顯示IP地址
eureka.instance.prefer-ip-address=true
#eureka客戶端向服務端發送心跳的時間間隔,單元為秒,默認為30秒
eureka.instance.lease-renewal-interval-in-seconds=2
#eureka服務端收到最后一次心跳等待的時間上限,超時將移除服務,單元為秒,默認為90秒
eureka.instance.lease-expiration-duration-in-seconds=5

#false表示向注冊中心注冊自己
eureka.client.register-with-eureka=false
#是否從Eureka抓取已有的注冊信息,默認為true。單節點不用設置,集群必須設置為true,才能配置ribbon使用負載均衡
eureka.client.fetch-registry=true
#設置與Eureka server交互的地址查詢服務和注冊服務都需要依賴這個地址
eureka.client.service-url.defaultZone=http://eureka8501.com:8501/eureka

 

3、啟動類

@EnableFeignClients申明該項目是Feign客戶端,不然聲明式接口服務注入失敗

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
//@EnableFeignClients申明該項目是Feign客戶端,不然聲明式接口服務注入失敗
@EnableFeignClients
public class SpringCloudFeignWeb8645Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudFeignWeb8645Application.class, args);
    }

}

 

4、接口服務類

@FeignClient:name和value是一個東西,值為Eureka注冊的服務名稱

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

import com.lqy.springCloud.feign.web.controller.Result;

/**
 * OpenFeign是一種聲明式、接口化的HTTP客戶端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP請求訪問遠程服務,就像調用本地方法一樣的,開發者完全感知不到這是在調用遠程方法,更感知不到在訪問HTTP請求。
 *
 */
//不要@Component也可以
//@FeignClient:name和value是一個東西,值為Eureka注冊的服務名稱
@FeignClient(value="SPRINGCLOUD-EUREKA-SERVER")
public interface OpenFeignService {

    @RequestMapping("/test")
    public Result test();
    
    
    @RequestMapping("/timeout")
    public Result timeout();
    
}

 

5、Controller請求類

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.lqy.springCloud.feign.web.service.OpenFeignService;


@RestController
@RequestMapping("/web")
public class FeignController {

    @Autowired
    private OpenFeignService openFeignService;
    
    @RequestMapping(value="/get", produces = MediaType.APPLICATION_JSON_VALUE)
    public Result get() {
        Result result = openFeignService.test();
        return result;
    }
    
    /**
     * 
     * @return
     */
    @RequestMapping(value="/timeout", produces = MediaType.APPLICATION_JSON_VALUE)
    public Result timeout() {
        Result result = openFeignService.timeout();
        return result;
    }
    
}

 

6、feign超時配置(application.properties配置)
啟用Hystrix后,其超時配置默認為1000毫秒。 因此,它可能發生在我們之前配置的客戶端超時之前。 增加此超時將阻止它的發生。

#feign客戶端建立連接最大的時間
feign.client.config.default.read-timeout=3000
#建立連接后,從服務器獲取響應結果的最大時間
feign.client.config.default.connect-timeout=3000

 

openFeign超時報錯:

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Mar 10 17:10:19 CST 2021
There was an unexpected error (type=Internal Server Error, status=500).
Read timed out executing GET http://SPRINGCLOUD-EUREKA-SERVER/timeout
feign.RetryableException: Read timed out executing GET http://SPRINGCLOUD-EUREKA-SERVER/timeout
    at feign.FeignException.errorExecuting(FeignException.java:249)
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:129)
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
    at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100)
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)

 

7、feign日志控制打印配置(application.properties配置)

格式:logging.level.完整的類路徑:DEBUG

#打印日志的4個級別:none、basic、headers、full
feign.client.config.default.logger-level=full
#設置要日志打印的接口類
logging.level.com.lqy.springCloud.feign.web.service.OpenFeignService: DEBUG

打印的日志詳細:

2021-03-10 17:03:12.532 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] ---> GET http://SPRINGCLOUD-EUREKA-SERVER/test HTTP/1.1
2021-03-10 17:03:12.533 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] ---> END HTTP (0-byte body)
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] <--- HTTP/1.1 200 (4ms)
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] connection: keep-alive
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] content-type: application/json
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] date: Wed, 10 Mar 2021 09:03:12 GMT
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] keep-alive: timeout=60
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] transfer-encoding: chunked
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] 
2021-03-10 17:03:12.538 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] {"result":true,"timestamp":"2021-03-10 17:03:12","msg":"操作成功。","datas":"端口:8601"}
2021-03-10 17:03:12.539 DEBUG 6428 --- [nio-8645-exec-3] c.l.s.f.web.service.OpenFeignService     : [OpenFeignService#test] <--- END HTTP (97-byte body)

 

 feign日志4個級別

NONE:無日志記錄(默認)。

BASIC:僅記錄請求方法和URL以及響應狀態代碼和執行時間。

HEADERS:記錄基本信息以及請求和響應頭。

FULL:記錄請求和響應的標題,正文和元數據。

 

8、feign請求啟用請求或響應GZIP壓縮(application.properties配置)

#您可以考慮為您的Feign請求啟用請求或響應GZIP壓縮。通過啟用以下屬性之一來做到這一點:
feign.compression.request.enabled=true
feign.compression.response.enabled=true

 

feign.compression.request.enabled=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048
feign.compression.response.enabled=true
feign.compression.response.useGzipDecoder=true

 

 

9、@SpringQueryMap使用

OpenFeign @QueryMap批注支持將POJO用作GET參數映射。 不幸的是,默認的OpenFeign QueryMap注釋與Spring不兼容,因為它缺少value屬性。

Spring Cloud OpenFeign提供了等效的@SpringQueryMap批注,該批注用於將POJO或Map參數注釋為查詢參數映射。

例如,Params類定義參數param1和param2:

@FeignClient("demo")
public interface DemoTemplate {

    @GetMapping(path = "/demo")
    String demoEndpoint(@SpringQueryMap Params params);
}

 

 

(如果文章對您有所幫助,歡迎捐贈,^_^)

================================

©Copyright 蕃薯耀 2021-03-11

https://www.cnblogs.com/fanshuyao/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM