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=500
userService.ribbon.ReadTimeout=2000
userService.ribbon.OkToRetryOnAllOperations=true
userService.ribbon.MaxAutoRetriesNextServer=2
userService.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 的范畴下,示例如:
@Configuration
public 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 实例,如:
@Configuration
public 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=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.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 调用过程中的信息,所以须要调整它的级别,针对全局的日志级别,能够在利用主类中退出:
@Bean
Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}
也能够实现配置类,而后在 Feign 客户端来指定配置类以实现不同的日志级别。
对于 Feign 的 Logger 级别次要有上面 4 类,可依据理论须要进行调整应用:
- none:不记录任何信息
- basic:仅记录申请办法,url 以及响应状态码和执行工夫
- headers:除了记录 basic 级别的信息之外,还会记录申请和响应的头信息。
- FULL:记录所有申请与响应的明细,包含头信息,申请体,元数据等。