Spring Cloud-14-Feign配置详解

之前有说过,Fegin是整合了Ribbon和Hystrix的,下面就看一下在Feign中是如何配置Ribbon和Hystrix的

Ribbon配置

在application.yml中的配置如下:

1
2
3
4
5
6
7
8
9
10
11
ribbon:
# 连接超时时间
ConnectTimeout: 600
# 读取超时时间
ReadTimeout: 6000
# 对所有操作请求都进行重试
OkToRetryOnAllOperations: true
# 切换实例的重试次数
MaxAutoRetriesNextServer: 2
# 对当前实例的重试次数
MaxAutoRetries: 1

这样配置的话,如果访问超时了,就会对当前的实例再次请求访问一次,如果还是失败,就换实例,切换实例的次数一共可以是两次,如果两次之后还是没有拿到访问结果,就会报超时的错误

测试

这里测试可以把服务提供者的接口中加一个线程休眠,读取超时我们上面配置的是6秒,然后在服务提供者中线程休眠7s,就可以看到消费者端报Read timed out异常

不同的服务不同的配置

在上面配置中是全局配置的,就是对所有的请求都生效,如果我们想针对不同的服务做出不同的配置,那么就可以在配置属性前面,加上服务的名字,比如服务名称是eureka-client,就可以做出如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
eureka-client: 
ribbon:
# 连接超时时间
ConnectTimeout: 600
# 读取超时时间
ReadTimeout: 6000
# 对所有操作请求都进行重试
OkToRetryOnAllOperations: true
# 切换实例的重试次数
MaxAutoRetriesNextServer: 2
# 对当前实例的重试次数
MaxAutoRetries: 1

这样的话,这些配置就只针对eureka-client的所有服务了

Hystrix配置

跟Ribbon的配置类似, 基础配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
hystrix:
command:
default:
execution:
isolation:
thread:
# 设置熔断超时时间
timeoutInMilliseconds: 10000
# 开启熔断功能
timeout:
enabled: true
feign:
hystrix:
# 关闭hystrix功能(不和上面的配置一起用)
enabled: false

这样的配置也是全局的配置,如果要针对某一个接口配置,比如/hello接口,可以把上面配置中的default替换成接口名称,如下:

1
2
3
4
5
6
7
8
9
10
11
hystrix:
command:
hello:
execution:
isolation:
thread:
# 设置熔断超时时间
timeoutInMilliseconds: 10000
# 开启熔断功能
timeout:
enabled: true

如果接口名称重复的话,同名的接口会共用这条配置

服务降级配置

下面再来看一下用Feign如何实现服务降级

首先需要在配置中启用Hystrix,如下:

1
2
3
feign:
hystrix:
enabled: true

然后新建一个类,HelloServiceFallback,实现HelloService ,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Component
public class HelloServiceFallback implements HelloService {
@Override
public String hello() {
return "hello error";
}

@Override
public String hello(String name) {
return "error:" + name;
}

@Override
public User hello(String name, String job, Long id) {
return new User(1L, "error", "error");
}

@Override
public String hello(User user) {
return "error user";
}
}

这里方法的实现都是相应方法的服务降级的逻辑

然后在HelloService中通过@FeignClient注解来指定服务降级的处理类,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@FeignClient(value = "eureka-client", fallback = HelloServiceFallback.class)
public interface HelloService {

@GetMapping("/hello")
String hello();

@GetMapping("/hello1")
String hello(@RequestParam("name") String name);

@GetMapping("/hello2")
User hello(@RequestHeader("name") String name, @RequestHeader("job") String job, @RequestHeader("id") Long id);

@PostMapping("/hello3")
String hello(@RequestBody User user);
}

上面的配置都ok以后,启动服务注册中心,再启动消费者, 不启动服务提供者,然后去访问接口,结果如下:

image

image

image

image

其他配置

Spring Cloud Feign支持对请求和响应进行GZIP压缩,以提高通信效率,配置方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
feign:
compression:
request:
# 配置请求GZIP压缩
enabled: true
# 配置压缩支持的MIME TYPE
mime-types: text/xml,application/xml,application/json
# 配置压缩数据大小的下限
min-request-size: 2048
response:
# 配置响应GZIP压缩
enabled: true

Feign为每个Feign都提供了Feign.Logger实例,可以在配置中开启日志,具体步骤如下:

application.yml中配置日志输出,设置日志输出级别:

1
2
3
4
# 格式为logging.level.Feign客户端路径
logging:
level:
com.euerka.consumer.service.HelloService: debug

然后在配置类中添加以下内容:

1
2
3
4
5
6
7
8
9
@Configuration
public class CloudConfig {

@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}

}

配置完成之后,控制台就会输出请求的详细日志.