述
之前有说过,Fegin是整合了Ribbon和Hystrix的,下面就看一下在Feign中是如何配置Ribbon和Hystrix的
Ribbon配置
在application.yml中的配置如下:1
2
3
4
5
6
7
8
9
10
11ribbon:
# 连接超时时间
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
12eureka-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
15hystrix:
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
11hystrix:
command:
hello:
execution:
isolation:
thread:
# 设置熔断超时时间
timeoutInMilliseconds: 10000
# 开启熔断功能
timeout:
enabled: true
如果接口名称重复的话,同名的接口会共用这条配置
服务降级配置
下面再来看一下用Feign如何实现服务降级
首先需要在配置中启用Hystrix,如下:1
2
3feign:
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以后,启动服务注册中心,再启动消费者, 不启动服务提供者,然后去访问接口,结果如下:
其他配置
Spring Cloud Feign支持对请求和响应进行GZIP压缩,以提高通信效率,配置方式如下:
1 | feign: |
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;
}
}
配置完成之后,控制台就会输出请求的详细日志.