1:概述

因为Spring Cloud Feign的客户端负载平衡是通过Spring Cloud Ribbon实现的,所以能够间接通过配置Ribbon客户端的形式来自定义各个服务客户端调用的参数

2:全局配置

ribbon.ConnectTimeout=500 ribbon.ReadTimeOut=5000

3:指定服务配置

userService.ribbon.ConnectTimeout=500 userService.ribbon.ReadTimeout=2000

4:重试机制

userService.ribbon.ConnectTimeout=500userService.ribbon.ReadTimeout=2000userService.ribbon.OkToRetryOnAllOperations=trueuserService.ribbon.MaxAutoRetriesNextServer=2userService.ribbon.MaxAutoRetries=1
Ribbon的超时与Hystrix的超时是两个概念。个别须要让hystrix的超时工夫大于Ribbon的超时工夫,否则Hystrix命令超时后,间接熔断,重试机制就没有任何意义了

5:参数绑定

罕用绑定参数的形式

  • @RequestParam 绑定单个申请参数值
  • @PathVariable 绑定URI模板变量值;
  • @RequestHeader 绑定申请头数据;
  • @RequestBody 绑定申请的内容区数据并能进行主动类型转换等
留神在定义各参数绑定的时候,@RequestParam和@RequestHeader等能够指定参数名称的注解,它们的value值千万不能少。在spring mvc程序中,这些注解会依据指定参数名来作为默认值,然而在fegin中绑定参数必须通过value属性来指明具体的参数名,不然会抛出IllegalStateException异样,value属性不能为空。

6:Feign的默认配置

  • 概述

Spring Cloud的Feign的一个核心概念就是客户端。 每个Feign客户端都是组合的组件的一部分,它们一起工作以按需调用近程服务器,并且该汇合具备将其作为应用@FeignClient正文的参数名称。
SpringCloud应用FeignClientsConfiguration创立一个新的汇合,作为每个命名客户端的ApplicationContext(利用上下文),这蕴含feign.Decoder,feign.Encoder和feign.Contract。

  • Spring Cloud Netflix默认为Feign提供以下bean:

Decoder feignDecoder:ResponseEntityDecoder(其中蕴含SpringDecoder)
Encoder feignEncoder:SpringEncoder
Logger feignLogger:Slf4jLogger
Contract feignContract:SpringMvcContract
Feign.Builder feignBuilder:HystrixFeign.Builder
Client feignClient:如果Ribbon启用,则为LoadBalancerFeignClient,否则将应用默认的feign客户端。
能够自定义FeignClientsConfiguration以齐全管制这一系列的配置。

7:自定义配置

写一个自定义配置类,留神不要放到以后ComponentScan的范畴下,示例如:

@Configurationpublic class MyConf {    @Bean    public Contract feignContract() {        return new feign.Contract.Default();    }}
定义的是new feign.Contract.Default(),所有在UserService接口中只能应用Feign本人的注解url形式,应用Spring MVC的注解就会报错
写好配置后,通过设置@FeignClient的configuration来应用,如下:
@FeignClient(value = "userService",configuration=MyConf.class)
能够为每个Feign客户端都配置本人的默认配置

8: @FeignClient

@FeignClient标签的罕用属性如下:

  • name(value):指定FeignClient的名称,如果我的项目应用了Ribbon,name属性会作为微服务的名称,用于服务发现
  • url: url个别用于调试,能够手动指定@FeignClient调用的地址
  • configuration: Feign配置类,能够自定义Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定义容错的解决类,当调用近程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口,并应用@Component注解
  • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性咱们能够实现每个接口通用的容错逻辑,缩小反复的代码
  • path: 定义以后FeignClient的对立前缀,增加到Feign拜访服务的拜访门路上

decode404:当产生http 404谬误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException

  • serviceId属性当初已被弃用,有利于name属性。

以前,应用url属性,不须要name属性。当初须要应用name

9:Feign和@Primary

9.1:概述

当应用Feign与Hystrix回退时,在同一类型的ApplicationContext中有多个bean。这将导致@Autowired不起作用,因为没有一个bean标记为主。
为了解决这个问题,Spring Cloud Netflix将所有Feign实例标记为@Primary,所以Spring Framework将晓得要注入哪个bean。在某些状况下,这可能是不可取的。要敞开此行为,将@FeignClient的primary属性设置为false,如:
   @FeignClient(name = "hello", primary = false)

10:Feign的HTTP Client

Feign在默认状况下应用的是JDK原生的URLConnection发送HTTP申请,没有连接池,然而对每个地址会放弃一个长连贯,即利用HTTP的persistence connection 。
能够用Apache的HTTP Client替换Feign原始的http client, 从而获取连接池、超时工夫等与性能非亲非故的控制能力。Spring Cloud从Brixtion.SR5版本开始反对这种替换,首先在我的项目中申明Apache HTTP Client和feign-httpclient依赖: 
<dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpclient</artifactId></dependency><dependency>    <groupId>com.netflix.feign</groupId>    <artifactId>feign-httpclient</artifactId>    <version>8.18.0</version></dependency>

而后在application.properties中增加: 

 feign.httpclient.enabled=true

11: 自定义的Encode、Decode、ErrorDecode

  • Feign将办法签名中办法参数对象序列化为申请参数放到HTTP申请中的过程,是由编码器(Encoder)实现的。同理,将HTTP响应数据反序列化为java对象是由解码器(Decoder)实现的。
  • 默认状况下,Feign会将标有@RequestParam注解的参数转换成字符串增加到URL中,将没有注解的参数通过Jackson转换成json放到申请体中。
  • 在Spring Cloud环境下,Feign的Encoder只会用来编码没有增加注解的参数。如果你自定义了Encoder, 那么只有在编码没有注解的参数时才会调用你的Encoder。
  • 对于Decoder, 默认会委托给SpringMVC中的MappingJackson2HttpMessageConverter类进行解码。只有当状态码不在200 ~ 300之间时ErrorDecoder才会被调用。ErrorDecoder的作用是能够依据HTTP响应信息返回一个异样,该异样能够在调用Feign接口的中央被捕捉到。咱们目前就通过ErrorDecoder来使Feign接口抛出业务异样以供调用者解决。

12: FeignClient工作过程

FeignClient相当于Spring Cloud中的RPC,大抵实现的过程如下:

1:首先通过@EnableFeignCleints注解开启FeignCleint
2:依据Feign的规定实现接口,并加@FeignCleint注解
3:程序启动后,会进行包扫描,扫描所有的@FeignCleint的注解的类,并将这些信息注入到IoC容器中
4:当接口的办法被调用,通过JDK的代理,来生成具体的RequestTemplate
5:RequestTemplate再生成调用的Request
6:Request交给Client去解决,其中Client能够是HttpUrlConnection、HttpClient也能够是Okhttp
7:最初Client被封装到LoadBalanceClient类,这个类联合类Ribbon做到了负载平衡,真正发送申请进来

13:个性继承

13.1:概述

当应用SpringMVC的注解来绑定服务接口时候,简直能够齐全从服务提供方的Controller中复制操作,构建出相应的服务客户端绑定接口。既然存在这么多复制操作,咱们天然须要思考这部分内容是否能够失去进一步的形象。Spring Cloud Feign中,针对该问题提供了继承个性来帮忙解决这些复制操作,以进一步缩小编码量。

13.2:根本办法

  • 就是把接口提出来,把model提出来,而后provider和client都应用这个工程
  • Provider这边在Controller中不再蕴含以往会定义的映射注解@RequestMapping,而参数的注解定义在重写的时候主动带过去了,这个类中,除了要实现接口逻辑之外,只须要减少了@RestController注解使该类成为一个REST接口类。
  • Consumer这边间接注入Feign标注的接口,齐全像调用本地接口一样。

13.3:留神

  • Feign接口只能反对一层继承,而且不能多继承
  • 官网不倡议在服务器和客户端之间共享接口,因为它引入了紧耦合,并且实际上并不适用于以后模式的Spring MVC(办法参数映射不被继承)。

14:Hystrix配置

14.1: 概述

Spring Cloud Feign中集成了Hystrix,Spring Cloud Feign客户端的办法都封装到Hystrix命令中进行服务爱护。

14.2:全局配置

间接应用它的默认配置前缀hystrix.command.default就能够进行设置,比方设置全局的超时工夫, Hystrix默认的超时工夫是1秒:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000 在对hystrix进行设置之前,须要确认Feign的Hystrix性能是开启的。

14.3: 禁用hystrix

能够通过设置feign.hystrix.enabled为false,或者应用hystrix.command.default.execution.timeout.enabled=false来敞开熔断性能
如果不想全局地敞开Hystrix反对,而只想针对某个服务客户端敞开Hystrix反对时,须要通过应用@Scope(“protototype”)注解为指定的客户端配置Feign.Builder实例,如:

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

在该服务的Feign接口中引入该配置:

@FeignClient(value = "user-service",configuration = DisableHystrixConfigutation.class) ...

14.4: 指定命令配置

在理论利用中可能会依据理论业务状况制订出不同的配置计划,能够采纳hystrix.command.<commandKey>作为前缀。而<commandKey>默认状况下会采纳feign客户端中的办法名作为标识。须要留神的是,因为办法名有可能会反复,这个时候雷同的办法名的hystrix配置会共用,所以在进行办法与配置的时候须要做好肯定的布局。

14.5: 服务降级配置

Spring Cloud Feign在定义服务客户端的时候与Spring cloud Ribbon有很大的差异,因为HystrixCommand定义被封装起来,无奈通过@HystrixCommand注解的fallback参数那样来指定具体的服务降级解决办法。Spring Cloud Feign提供了另外一种简略的形式。
办法大抵是:定义一个Feign客户端的服务降级类UserServiceFallback,实现UserService接口,其中每个重写办法的实现逻辑都能够用来定义相应的服务降级逻辑;在服务绑定接口中,通过@FeignClient注解的fallback属性来指定对应的服务降级实现类。

14.6: 申请压缩

Spring Cloud Feign反对对申请与响应进行GZIP压缩,以缩小通信过程中的性能损耗,只须要通过上面的两个参数设置,就能开启申请与相应的压缩性能:

feign.compression.request.enabled=true feign.compression.response.enabled=true

同时,还能够对申请压缩做一些更粗疏的设置,比方上面的配置内容指定压缩的申请数据类型,并设置了申请压缩的大小上限,只有超过这个大小的申请才会进行压缩:

feign.compression.request.enabled=truefeign.compression.request.mime-types=text/xml,application/xml,application/jsonfeign.compression.request.min-request-size=2048

15:日志配置

Spring Cloud Feign在构建被@FeignClient注解润饰的服务客户端时,会为每一个客户端都创立一个feign.Logger实例,能够配置logging.level.<feignClient>的参数配置格局来开启指定feign客户端的debug日志,其中<feignClient>为feign客户端定义接口的残缺门路,例如:

logging.level.com.cc.springcloud_feign_api.UserService2=debug

留神,只增加该配置还无奈实现对debug日志的输入。这是因为feign客户端默认的Logger.Level对象定义为NONE级别,该级别不会记录任何Feign调用过程中的信息,所以须要调整它的级别,针对全局的日志级别,能够在利用主类中退出:

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

也能够实现配置类,而后在Feign客户端来指定配置类以实现不同的日志级别。
对于Feign的Logger级别次要有上面4类,可依据理论须要进行调整应用:

  • none:不记录任何信息
  • basic:仅记录申请办法,url以及响应状态码和执行工夫
  • headers:除了记录basic级别的信息之外,还会记录申请和响应的头信息。
  • FULL:记录所有申请与响应的明细,包含头信息,申请体,元数据等。