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/