SpringCloud- 第十一篇 Feign+Ribbon
2021-04-15 13:29
标签:block trie primary 重复 encoder lse 模板 大小 示例 由于Spring Cloud Feign的客户端负载均衡是通过Spring Cloud Ribbon实现的,所以可以直接通过配置Ribbon客户端的方式来自定义各个服务客户端调用的参数 Ribbon的超时与Hystrix的超时是两个概念。一般需要让hystrix的超时时间大于Ribbon的超时时间,否则Hystrix命令超时后,直接熔断,重试机制就没有任何意义了 常用绑定参数的方式 注意在定义各参数绑定的时候,@RequestParam和@RequestHeader等可以指定参数名称的注解,它们的value值千万不能少。在spring mvc程序中,这些注解会根据指定参数名来作为默认值,但是在fegin中绑定参数必须通过value属性来指明具体的参数名,不然会抛出IllegalStateException异常,value属性不能为空。 写一个自定义配置类,注意不要放到当前ComponentScan的范围下,示例如: 定义的是new feign.Contract.Default(),所有在UserService接口中只能使用Feign自己的注解url方式,使用Spring MVC的注解就会报错%E5%86%99%E5%A5%BD%E9%85%8D%E7%BD%AE%E5%90%8E%EF%BC%8C%E9%80%9A%E8%BF%87%E8%AE%BE%E7%BD%AE@FeignClient%E7%9A%84configuration%E6%9D%A5%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%A6%82%E4%B8%8B%EF%BC%9A @FeignClient标签的常用属性如下: 当使用Feign与Hystrix回退时,在同一类型的ApplicationContext中有多个bean。这将导致@Autowired不起作用,因为没有一个bean标记为主。 Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connection 。 然后在application.properties中添加:? FeignClient相当于Spring Cloud中的RPC,大致实现的过程如下: 1:首先通过@EnableFeignCleints注解开启FeignCleint2%EF%BC%9A%E6%A0%B9%E6%8D%AEFeign%E7%9A%84%E8%A7%84%E5%88%99%E5%AE%9E%E7%8E%B0%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%B9%B6%E5%8A%A0@FeignCleint%E6%B3%A8%E8%A7%A3 当使用SpringMVC的注解来绑定服务接口时候,几乎可以完全从服务提供方的Controller中复制操作,构建出相应的服务客户端绑定接口。既然存在这么多复制操作,我们自然需要考虑这部分内容是否可以得到进一步的抽象。Spring Cloud Feign中,针对该问题提供了继承特性来帮助解决这些复制操作,以进一步减少编码量。 Spring Cloud Feign中集成了Hystrix,Spring Cloud Feign客户端的方法都封装到Hystrix命令中进行服务保护。 直接使用它的默认配置前缀hystrix.command.default就可以进行设置,比如设置全局的超时时间, Hystrix默认的超时时间是1秒: 可以通过设置feign.hystrix.enabled为false,或者使用hystrix.command.default.execution.timeout.enabled=false来关闭熔断功能 在该服务的Feign接口中引入该配置: 在实际应用中可能会根据实际业务情况制定出不同的配置方案,可以采用hystrix.command. Spring Cloud Feign在定义服务客户端的时候与Spring cloud Ribbon有很大的差别,由于HystrixCommand定义被封装起来,无法通过@HystrixCommand注解的fallback参数那样来指定具体的服务降级处理方法。Spring Cloud Feign提供了另外一种简单的方式。 Spring Cloud Feign支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗,只需要通过下面的两个参数设置,就能开启请求与相应的压缩功能: 同时,还可以对请求压缩做一些更细致的设置,比如下面的配置内容指定压缩的请求数据类型,并设置了请求压缩的大小下限,只有超过这个大小的请求才会进行压缩: Spring Cloud Feign在构建被@FeignClient注解修饰的服务客户端时,会为每一个客户端都创建一个feign.Logger实例,可以配置logging.level. 注意,只添加该配置还无法实现对debug日志的输出。这是因为feign客户端默认的Logger.Level对象定义为NONE级别,该级别不会记录任何Feign调用过程中的信息,所以需要调整它的级别,针对全局的日志级别,可以在应用主类中加入: 也可以实现配置类,然后在Feign客户端来指定配置类以实现不同的日志级别。 SpringCloud- 第十一篇 Feign+Ribbon 标签:block trie primary 重复 encoder lse 模板 大小 示例 原文地址:https://blog.51cto.com/14846948/2511324
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
5:参数绑定
6:Feign的默认配置
Spring Cloud的Feign的一个中心概念就是客户端。 每个Feign客户端都是组合的组件的一部分,它们一起工作以按需调用远程服务器,并且该集合具有将其作为使用@FeignClient注释的参数名称。
SpringCloud使用FeignClientsConfiguration创建一个新的集合,作为每个命名客户端的ApplicationContext(应用上下文),这包含feign.Decoder,feign.Encoder和feign.Contract。
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:自定义配置
@Configuration
public class MyConf {
? ? @Bean
? ? public Contract feignContract() {
? ? ? ? return new feign.Contract.Default();
? ? }
}
br/>写好配置后,通过设置@FeignClient的configuration来使用,如下:
@FeignClient(value = "userService",configuration=MyConf.class)
可以为每个Feign客户端都配置自己的默认配置8: @FeignClient
decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
以前,使用url属性,不需要name属性。现在需要使用name9:Feign和@Primary
9.1:概述
为了解决这个问题,Spring Cloud Netflix将所有Feign实例标记为@Primary,所以Spring Framework将知道要注入哪个bean。在某些情况下,这可能是不可取的。要关闭此行为,将@FeignClient的primary属性设置为false,如:@FeignClient(name = "hello", primary = false)
10:Feign的HTTP Client
可以用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>
feign.httpclient.enabled=true
11: 自定义的Encode、Decode、ErrorDecode
12: FeignClient工作过程
br/>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:概述
13.2:基本方法
13.3:注意
14:Hystrix配置
14.1: 概述
14.2:全局配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000 在对hystrix进行设置之前,需要确认Feign的Hystrix功能是开启的。14.3: 禁用hystrix
如果不想全局地关闭Hystrix支持,而只想针对某个服务客户端关闭Hystrix支持时,需要通过使用@Scope(“protototype”)注解为指定的客户端配置Feign.Builder实例,如:@Configuration
public class DisableHystrixConfigutation {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return Feign.builder();
}}
@FeignClient(value = "user-service",configuration = DisableHystrixConfigutation.class) ...
14.4: 指定命令配置
14.5: 服务降级配置
方法大致是:定义一个Feign客户端的服务降级类UserServiceFallback,实现UserService接口,其中每个重写方法的实现逻辑都可以用来定义相应的服务降级逻辑;在服务绑定接口中,通过@FeignClient注解的fallback属性来指定对应的服务降级实现类。14.6: 请求压缩
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:日志配置
logging.level.com.cc.springcloud_feign_api.UserService2=debug
@Bean
Logger.Level feignLoggerLevel(){
? ? return Logger.Level.FULL;
}
对于Feign的Logger级别主要有下面4类,可根据实际需要进行调整使用:
文章标题:SpringCloud- 第十一篇 Feign+Ribbon
文章链接:http://soscw.com/index.php/essay/75985.html