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:记录所有请求与响应的明细,包括头信息,请求体,元数据等。
相关推荐
├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最新版本的教程或资料,可能涵盖了一些最新的特性和最佳实践。 1. **服务发现**:SpringCloud使用Eureka作为默认的服务注册与发现组件。服务提供者向...
- 掌握创建第一个 Spring Cloud 项目的步骤。 2. **Eureka 服务注册与发现**: - Eureka 作为服务注册中心的角色,如何实现服务提供者和服务消费者之间的通信。 - 学习服务实例的注册、心跳机制、服务健康检查等...
第二课: 服务消费者(rest+ribbon) ... 第十一课:docker部署spring cloud项目 第十二课: 断路器监控(Hystrix Dashboard) 第十三课: 断路器聚合监控(Hystrix Turbine) 第十四课: 服务注册(consul)
【标题】"SpringCloud-B2C电子商务平台服务端"是一个基于SpringCloud框架构建的电子商务系统后端项目。SpringCloud是一个微服务开发工具集,它利用SpringBoot的开发便利性,快速构建分布式系统中的配置管理、服务...
11.硅谷学习_SpringCloud_SpringCloud_VS_SpringBoot区别对比 12.硅谷学习_SpringCloud_SpringCloud_VS_Dubbo区别对比 13.硅谷学习_SpringCloud_SpringCloud功能域和官网资料介绍 14.硅谷学习_SpringCloud_Spring...
Spring Cloud由多个模块组成,包括Spring Cloud Context, Spring Cloud Commons, Spring Cloud LoadBalancer, Spring Cloud CircuitBreaker, ConfigurationProperties, Spring Cloud Config, Spring Cloud Netflix, ...
史上最简单的SpringCloud教程 | 第十一篇:docker部署spring cloud项目 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard) 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix ...
11.尚硅谷_SpringCloud_SpringCloud_VS_SpringBoot区别对比 12.尚硅谷_SpringCloud_SpringCloud_VS_Dubbo区别对比 13.尚硅谷_SpringCloud_SpringCloud功能域和官网资料介绍 14.尚硅谷_SpringCloud_SpringCloud...
11. **Spring Cloud Netflix Eureka 的工作原理**: - **原理**:Eureka 是一种基于 REST 的服务,用于服务注册和服务发现。微服务在启动时向 Eureka 注册中心注册自己,并定期发送心跳消息来表明其存活状态。...
Spring Cloud是基于Spring Boot的一系列框架的集合,它利用Spring Boot的开发便利性简化了分布式系统基础设施的开发,如服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Cloud的开发...
标题中的“毕业设计-基于springboot,springcloud的在线教育.zip”表明这是一个关于毕业设计的项目,使用了SpringBoot和SpringCloud技术,旨在构建一个在线教育平台。SpringBoot是Spring框架的一个轻量级衍生版,它...
11. **Spring Cloud Bus** - Spring Cloud Bus 为分布式系统中的服务间通信提供了一种简单的方式。 - 它可以用来刷新配置信息、发布消息等。 12. **Zipkin** - Zipkin 是一个分布式追踪系统,用于收集服务调用的...
Spring Cloud Demo Project 博客园 (教程) ...第一节: 服务的注册与发现(Eureka) 标签: 1-0, 1-1 第二节: 服务消费者(Ribbon) 标签: 2-1 第三节: 服务消费者(Feign) ...第十篇: 高可用的服务注册中心 标签
lamp-cloud微服务脚手架是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的SaaS微服务脚手架,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API、分布式事务、大文件...
**Spring Cloud Bus** 作为一种轻量级的消息总线,可以在集群中传播状态变化(例如配置更改),并支持与 **Spring Cloud Config** 联合使用以实现自动部署更新。它能够帮助简化集群中的通信,并确保各个服务实例能够...
lamp-cloud是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的SaaS微服务脚手架,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API、分布式事务、大文件断点分片续传...
8. **负载均衡**:SpringCloud的Ribbon或Feign组件实现了客户端的负载均衡,可以将请求分发到不同的服务实例上,提高系统的可用性。 9. **API Gateway**:Zuul或Spring Cloud Gateway作为微服务的入口,可以实现...
第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 新建...