日志
指定日志生效的包或组件
logging:
level:
com.atguigu.order.feign: debug
注入bean,注意是Feign包中的logger
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
超时控制
若被调用服务响应慢或者无法链接,那么就要配置超时服务避免一直等待浪费服务器资源并造成服务雪崩
使商品服务睡眠100秒
@Service
public class ProductServiceImpl implements ProductService {
@Override
public Product getProductById(Long productId) {
Product product = new Product();
product.setId(productId);
product.setPrice(new BigDecimal("99"));
product.setProductName("苹果-"+productId);
product.setNum(2);
try {
TimeUnit.SECONDS.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return product;
}
}
feign默认读取超时60秒,则60秒后自动断开连接
新建配置文件配置feign超时时间,以毫秒为单位
spring:
cloud:
openfeign:
client:
config:
default:
logger-level: full
connect-timeout: 1000
read-timeout: 2000
service-product:
logger-level: full
connect-timeout: 3000
read-timeout: 5000
defalut即为所有feign客户端配置,而service-product指定配置,会覆盖默认配置 @FeignClient可以使用contextId指定客户端名称,若不指定则以value的值作为名称 将此配置文件加载到主配置文件
server:
port: 8000
spring:
profiles:
# 激活的命名空间
active: prod
include: feign
重试机制
向容器中注入bean即可,也可在配置文件指定
@Bean
Retryer retryer(){
return new Retryer.Default();
}
Retryer是一个接口并提供了一个默认实现
第一次间隔100毫秒(此后每次是上次的1.5倍),最大间隔为1秒,最多尝试5次
拦截器
新建请求拦截器
package com.atguigu.order.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import java.util.UUID;
@Component
public class XTokenRequestInterceptor implements RequestInterceptor {
/**
* 请求拦截器
* @param template 请求模板
*/
@Override
public void apply(RequestTemplate template) {
System.out.println("XTokenRequestInterceptor ....... ");
//添加一个请求头
template.header("X-Token", UUID.randomUUID().toString());
}
}
发送的请求中已经设置的请求头,通过用来设置微服务调用链条中需要共享的数据。
将拦截器声明为一个组件即可生效,也可在配置文件对某个feign客户端单独生效
Fallback
使用兜底回调,当遇到超时或错误返回自定义内容
引入依赖
<!-- sentinel服务熔断-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
实现需要降级的feign客户端并重写方法
package com.atguigu.order.feign.fallback;
import com.atguigu.order.feign.ProductFeignClient;
import com.atguigu.product.bean.Product;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Component
public class ProductFeignClientFallback implements ProductFeignClient {
@Override
public Product getProductById(Long id) {
System.out.println("兜底回调....");
Product product = new Product();
product.setId(id);
product.setPrice(new BigDecimal("0"));
product.setProductName("未知商品");
product.setNum(0);
return product;
}
}
feign客户端指定降级实现
@FeignClient(value = "service-product",fallback = ProductFeignClientFallback.class)
开启降级
feign:
sentinel:
enabled: true
测试即可,返回自定义内容