Spring Cloud 之 feign 笔记

Ribbon配置:

由于SpringCloud Feign的客户端负载均衡是通过SpringCloud Ribbon实现的,所以我们可以直接通过配置RIbbon客户端的方式来自定义各个服务客户端调用的参数

1.1 全局配置

全局配置的方法非常简单, 我们可以直接使用ribbon.<key>=<value>的方式来设置ribbon的各项默认参数。比如, 修改默认的客户端调用超时时间:

ribbon.ConnectionTimeout=500
ribbon.ReadTimeout=5000

1.2 指定服务配置

大多数情况下,我们对于服务调用的超时时间可能会根据实际服务的特性做一些调整,所以仅仅依靠默认的全局配置是不行的。在使用SpringCloud Feign的时候,针对各个服务客户端进行个性化配置的方式与使用SpringCloud Ribbon时的配置方式是一样的, 都采用<client>. ribbon.key=value 的格式进行设置。但是, 这里就有一个疑问了,<client>所指代的Ribbon客户端在哪里呢

在定义Feign客户端的时候, 我们使用了@FeignClient注解。在初始化过程中,SpringCloud Feign会根据该注解的name属性或value属性指定的服务名, 自动创建一个同名的Ribbon客户端。也就是说,如果我们使用@FeignClient(value= "HELLO-SERVICE")来创建Feign客户端,同时也创建了一个名为HELLO-SERVICE的Ribbon客户端。既然如此,我们就可以使用@FeignClient注解中的name或value属性值来设置对应的Ribbon参数, 比如:

HELLO-SERVICE.ribbon.Connection=500
HELLO-SERVICE.ribbon.ReadTimeout=5000
HELLO-SERVICE.ribbon.MaxAutoRetriesNextServer=2
HELLO-SERVICE.ribbon.MaxAutoRetries=l

在Spring Cloud Feign 中默认实现了请求的重试机制, 而上面我们对于HELLO-SERVICE 客户端的配置内容就是对于请求超时以及重试机制配置的详情

Hystrix配置:

在Spring Cloud Feign中,除了引入了用千客户端负载均衡的Spring Cloud Ribbon之外,还引入了服务保护与容错的工具Hystrix。默认情况下,Spring Cloud Feign会为将所有Feign客户端的方法都封装到Hystrix命令中进行服务保护

2.1 全局配置

对于Hystrix的全局配置同Spring Cloud Ribbon的全局配置一样,直接使用它的默认配置前缀hystrix.command.default就可以进行设置, 比如设置全局的超时时间:

扫描二维码关注公众号,回复: 2379222 查看本文章
hystrix.command.default.execution.isolation.thread.timeoutinMilliseconds=5OOO

在对Hystrix进行配置之前,我们需要确认feign.hystrix.enabled参数没有被设置为false, 否则该参数设置会关闭Feign客户端的Hystrix支持。

2.2 禁用hystrix

可以通过feign.hystrix.enabled=false来关闭Hystrix功能。另外, 如果不想全局地关闭Hystrix支持, 而只想针对某个服务客户端关闭Hystrix支待时, 需要通过使用@Scope ("prototype")注解为指定的客户端配置Feign.Builder实例, 详细实现步骤如下所示:

public class DisableHystrixConfiguration{
    @Bean
    @Scope("prototype")
    public Feign.Builder feignBuilder(){
        return Feign.builder();
    }
}

在HelloService的@ FeignClient注解中,通过configuration参数引入上面实现的配置:

@FeignClient(name="HELLO-SERVICE",configuration=DisableHystrixConfiguration.class)
public interface HelloService{
}

2.3 指令命令配置

对于Hystrix命令的配置,在实际应用时往往也会根据实际业务情况制定出不同的配置方案。配置方法也跟传统的Hystrix 命令的参数配置相似,采用hystrix.command.<commandKey>作为前缀,而<commandKey>默认情况下会采用Feign客户端中的方法名作为标识,比如, 针对hello接口的熔断超时时间的配置可以通过其方法名作为<commandKey>来进行配置, 具体如下:

hystrix.command.hello.execution.isolation.thread.timeoutinMilliseconds=5OOO

在使用指定命令配置的时候, 需要注意, 由于方法名很有可能重复, 这个时候相同方法名的Hystrix配置会共用,所以在进行方法定义与配置的时候需要做好一定的规划。当然,也可以重写Feign.Builder的实现,并在应用主类中创建它的实例来覆盖自动化配置的HystrixFeign.Builder实现

2.4 服务降级配置

Hystrix提供的服务降级是服务容错的重要功能,由于Spring Cloud Feign在定义服务客户端的时候与Spring Cloud Ribbon有很大差别,HystrixCommand定义被封装了起来, 我们无法像之前介绍Spring Cloud Hystrix时, 通过@HystrixCommand注解的fallback参数那样来指定具体的服务降级处理方法。但是, Spring Cloud Feign提供了另外一种简单的定义方式,如下:

@Component
public class ServiceFallback implements Service{
    @Override
    public String hello(){
        return "error";
    }
    @Override
    public String hello(@RequestParam("param") param){
        return "error";
    }
}

@FeignClient(name="HELLO-SERVICE",fallback=ServiceFallback.class)
public interface Service{
    @RequestMapping("/hello")
    String hello();
    @RequestMapping("/hello2")
    String hello(@RequestParam("param") param); 
}

日志配置:

Spring Cloud Feign 在构建被@FeignClient 注解修饰的服务客户端时,会为每一个客户端都创建一个feign.Logger 实例,我们可以利用该日志对象的DEBUG 模式来帮助分析Feign的请求细节。

可以在application.properties 文件中使用logging.level.<FeignClient>的参数配置格式来开启指定Feign 客户端的DEBUG日志, 其中<FeignClient>为Feign 客户端定义接口的完整路径。比如针对com.myservice下的Service接口做配置:

logging.level.com.myservice.Service=DEBUG

但是, 只是添加了如上配置, 还无法实现对DEBUG 日志的输出。这时由于Feign 客户端默认的Logger.Level 对象定义为NONE 级别, 该级别不会记录任何Feign 调用过程中的信息, 所以我们需要调整它的级别, 针对全局的日志级别, 可以在应用主类中直接加入Logger.Level 的Bean 创建, 具体如下:

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

当然也可以通过实现配置类, 然后在具体的Feign 客户端来指定配置类以实现是否要调整不同的日志级别, 比如下面的实现:

@Configuration
public class FullLogConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

@FeignClient(name= "HELLO-SERVICE", configuration = FullLogConfiguration.class)
public interface HelloService {
}

猜你喜欢

转载自blog.csdn.net/weixin_39032575/article/details/81172123