`
wang94777600
  • 浏览: 11556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SpringCloud- 第十一篇 Feign+Ribbon

 
阅读更多

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(方法参数映射不被继承)。
image.png
image.png

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:记录所有请求与响应的明细,包括头信息,请求体,元数据等。
分享到:
评论

相关推荐

    spring boot+spring cloud视频教学下载全套

    ├15 4.11 Fegion-4解决Fegion第一次请求timeout的问题.avi ├16 4.12 Eureka深入理解.avi ├17 4.13 Eureka常用配置详解.avi ├18 4.14 Eurek Ribbon Feign常见问题及解决.avi ├19 5.1超时机制,断路器模式简介....

    SpringCloud第3季2024.7z

    本资源"SpringCloud第3季2024.7z"很可能包含的是关于SpringCloud最新版本的教程或资料,可能涵盖了一些最新的特性和最佳实践。 1. **服务发现**:SpringCloud使用Eureka作为默认的服务注册与发现组件。服务提供者向...

    spring cloud视频教程

    - 掌握创建第一个 Spring Cloud 项目的步骤。 2. **Eureka 服务注册与发现**: - Eureka 作为服务注册中心的角色,如何实现服务提供者和服务消费者之间的通信。 - 学习服务实例的注册、心跳机制、服务健康检查等...

    springCloud项目练习

    第二课: 服务消费者(rest+ribbon) ... 第十一课:docker部署spring cloud项目 第十二课: 断路器监控(Hystrix Dashboard) 第十三课: 断路器聚合监控(Hystrix Turbine) 第十四课: 服务注册(consul)

    毕业设计之SpringCloud-B2C电子商务平台服务端.zip

    【标题】"SpringCloud-B2C电子商务平台服务端"是一个基于SpringCloud框架构建的电子商务系统后端项目。SpringCloud是一个微服务开发工具集,它利用SpringBoot的开发便利性,快速构建分布式系统中的配置管理、服务...

    想学习的看过来了spring4.0、springboot、springcloud详细视频课程(硅谷)

    11.硅谷学习_SpringCloud_SpringCloud_VS_SpringBoot区别对比 12.硅谷学习_SpringCloud_SpringCloud_VS_Dubbo区别对比 13.硅谷学习_SpringCloud_SpringCloud功能域和官网资料介绍 14.硅谷学习_SpringCloud_Spring...

    spring-cloud.pdf

    Spring Cloud由多个模块组成,包括Spring Cloud Context, Spring Cloud Commons, Spring Cloud LoadBalancer, Spring Cloud CircuitBreaker, ConfigurationProperties, Spring Cloud Config, Spring Cloud Netflix, ...

    SpringCloudLearning_forezp.tar.gz

    史上最简单的SpringCloud教程 | 第十一篇:docker部署spring cloud项目 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard) 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix ...

    尚硅谷Java视频教程_SpringCloud视频教程

    11.尚硅谷_SpringCloud_SpringCloud_VS_SpringBoot区别对比 12.尚硅谷_SpringCloud_SpringCloud_VS_Dubbo区别对比 13.尚硅谷_SpringCloud_SpringCloud功能域和官网资料介绍 14.尚硅谷_SpringCloud_SpringCloud...

    SpringCloud相关面试题.pdf

    11. **Spring Cloud Netflix Eureka 的工作原理**: - **原理**:Eureka 是一种基于 REST 的服务,用于服务注册和服务发现。微服务在启动时向 Eureka 注册中心注册自己,并定期发送心跳消息来表明其存活状态。...

    Spring Cloud Dalston 中文文档 参考手册 中文版 非扫描 完整版

    Spring Cloud是基于Spring Boot的一系列框架的集合,它利用Spring Boot的开发便利性简化了分布式系统基础设施的开发,如服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Cloud的开发...

    毕业设计-基于springboot,springcloud的在线教育.zip

    标题中的“毕业设计-基于springboot,springcloud的在线教育.zip”表明这是一个关于毕业设计的项目,使用了SpringBoot和SpringCloud技术,旨在构建一个在线教育平台。SpringBoot是Spring框架的一个轻量级衍生版,它...

    cloud技术点

    11. **Spring Cloud Bus** - Spring Cloud Bus 为分布式系统中的服务间通信提供了一种简单的方式。 - 它可以用来刷新配置信息、发布消息等。 12. **Zipkin** - Zipkin 是一个分布式追踪系统,用于收集服务调用的...

    SpringCloudDemo:Spring云演示项目

    Spring Cloud Demo Project 博客园 (教程) ...第一节: 服务的注册与发现(Eureka) 标签: 1-0, 1-1 第二节: 服务消费者(Ribbon) 标签: 2-1 第三节: 服务消费者(Feign) ...第十篇: 高可用的服务注册中心 标签

    lamp-cloud微服务脚手架

    lamp-cloud微服务脚手架是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的SaaS微服务脚手架,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API、分布式事务、大文件...

    Cloud分布式

    **Spring Cloud Bus** 作为一种轻量级的消息总线,可以在集群中传播状态变化(例如配置更改),并支持与 **Spring Cloud Config** 联合使用以实现自动部署更新。它能够帮助简化集群中的通信,并确保各个服务实例能够...

    lamp-cloud微服务脚手架-其他

    lamp-cloud是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的SaaS微服务脚手架,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API、分布式事务、大文件断点分片续传...

    SpringBoot微服务架构应用.zip

    8. **负载均衡**:SpringCloud的Ribbon或Feign组件实现了客户端的负载均衡,可以将请求分发到不同的服务实例上,提高系统的可用性。 9. **API Gateway**:Zuul或Spring Cloud Gateway作为微服务的入口,可以实现...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    第11 章 应用监控 431 11.1 http 431 11.1.1 新建Spring Boot 项目 432 11.1.2 测试端点 432 11.1.3 定制端点 439 11.1.4 自定义端点 440 11.1.5 自定义HealthIndicator 444 11.2 JMX 447 11.3 SSH 449 11.3.1 新建...

Global site tag (gtag.js) - Google Analytics