SpringCloud-第十一篇-FeignRibbon

22次阅读

共计 6793 个字符,预计需要花费 17 分钟才能阅读完成。

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:记录所有申请与响应的明细,包含头信息,申请体,元数据等。

正文完
 0