openFeign初始入门及高级特性
openFeign集成了loadbanlance,它是声明式的web客户端,是当前微服务之间调用的事实标准,
- 支持负载均衡
- 支持sentinel和它的fallback
- 可插拔的注解支持
- 支持可插拔的HTTP编码器和解码器
- 支持HTTP请求和相应的压缩
初始入门
需导入的依赖 因为要使用openfeign 要先引入服务注册中心这里用的是consul
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--SpringCloud consul discovery-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
导入yml
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true #优先使用服务ip进行注册
service-name: ${spring.application.name}
需要在启动类
@SpringBootApplication
@EnableFeignClients //启用Feign服务
@EnableDiscoveryClient //启用consul的服务发现
public class MainOpenFeign80 {
public static void main(String[] args) {
SpringApplication.run(MainOpenFeign80.class,args);
}
}
创造一个接口 在上面声明@FeignClient(value = “提供者微服务名称”)
这里暴露出的接口 会通过consul 直接调用到 对应的提供者微服务
@FeignClient(value = "cloud-payment-service")
public interface PayFeignApi
{
/**
* 新增一条支付相关流水记录
* @param payDTO
* @return
*/
@PostMapping("/pay/add")
public ResultData addPay(@RequestBody PayDTO payDTO);
/**
* 按照主键记录查询支付流水信息
* @param id
* @return
*/
@GetMapping("/pay/get/{id}")
public ResultData getPayInfo(@PathVariable("id") Integer id);
/**
* openfeign天然支持负载均衡演示
* @return
*/
@GetMapping(value = "/pay/get/info")
public String mylb();
}
高级特性
1.超时控制
请求默认超时时间是60s就会自动返回一个结果
spring:
cloud:
openfeign:
client:
config:
#default代表全局配置 单体服务配置可以换成服务的名字
default:
#连接超时时间
connectTimeout: 5000
#读取超时时间
readTimeout: 5000
loggerLevel: basic
2.重试机制
Spring Cloud OpenFeign does not provide the following beans by default for feign
feign客户端默认重试是关闭的 所以只要一次请求失败 就会直接返回失败结果
重写这个方法 就会开启重试机制
@Configuration
public class FeignConfig {
@Bean
public Retryer myRetryer()
{
//return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的
//最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
return new Retryer.Default(100,1,3);
}
}
3.OpenFeign中http client
OpenFeign中http client
如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,
由于默认HttpURLConnection没有连接池、性能和效率比较低,如果采用默认,性能上不是最牛B的,所以加到最大。
推荐使用 httpclient5
maven 依赖
<!-- httpclient5-->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3</version>
</dependency>
<!-- feign-hc5-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hc5</artifactId>
<version>13.1</version>
</dependency>
导入yaml
# Apache HttpClient5 配置开启
spring:
cloud:
openfeign:
httpclient:
hc5:
enabled: true
4.对请求和响应进行GZIP压缩
作用是节约带宽
对请求和响应进行GZIP压缩
Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。
通过下面的两个参数设置,就能开启请求与相应的压缩功能:
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.response.enabled=true
细粒度化设置
对请求压缩做一些更细致的设置,比如下面的配置内容指定压缩的请求数据类型并设置了请求压缩的大小下限,
只有超过这个大小的请求才会进行压缩:
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json #触发压缩数据类型
spring.cloud.openfeign.compression.request.min-request-size=2048 #最小触发压缩的大小
yaml导入
# Apache HttpClient5 配置开启
spring:
cloud:
compression:
request:
enabled: true
min-request-size: 2048 #最小触发压缩的大小
mime-types: text/xml,application/xml,application/json #触发压缩数据类型
response:
enabled: true
5.日志打印功能
1.作用
对Feign接口的调用情况进行监控和输出
2.日志级别
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
3.创建FeignConfig
@Configuration
public class FeignConfig
{
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
导入yaml
logging:
level:
com:
atguigu:
cloud:
apis:
PayFeignApi: debug
com.atguigu.cloud.apis.PayFeignApi 是带@FeignClient(value = “cloud-payment-service”)注解的路径
表示对这个接口采取日志监控功能