💖 Spring家族及微服务系列文章
✨【微服务】SpringCloud轮询拉取注册表及服务发现源码解析
✨ 【微服务】SpringCloud微服务续约源码解析
✨【微服务】SpringCloud微服务注册源码解析
✨【微服务】Nacos2.x服务发现?RPC调用?重试机制?
✨【微服务】Nacos通知客户端服务变更以及重试机制
✨【微服务】Nacos服务发现源码分析
✨【微服务】SpringBoot监听器机制以及在Nacos中的应用
✨【微服务】Nacos服务端完成微服务注册以及健康检查流程
✨【微服务】Nacos客户端微服务注册原理流程
✨【微服务】SpringCloud中使用Ribbon实现负载均衡的原理
✨【微服务】SpringBoot启动流程注册FeignClient
✨【微服务】SpringBoot启动流程初始化OpenFeign的入口
✨Spring Bean的生命周期
✨Spring事务原理
✨SpringBoot自动装配原理机制及过程
✨SpringBoot获取处理器流程
✨SpringBoot中处理器映射关系注册流程
✨Spring5.x中Bean初始化流程
✨Spring中Bean定义的注册流程
✨Spring的处理器映射器与适配器的架构设计
✨SpringMVC执行流程图解及源码
目录
💖 Spring家族及微服务系列文章
一、前言
二、OpenFeign与Ribbon配置
1、OpenFeign默认处理请求超时时间
1.1、模拟处理请求0.5秒
1.2、模拟处理请求1秒
2、Ribbon配置
2.1、配置请求处理超时5秒
2.2、模拟请求处理5秒
3、OpenFeign配置
3.1、配置请求处理超时6秒
3.2、OpenFeign配置对全部服务有效
3.3、针对某个服务
💖SpringCloud Alibaba实战搭建系列:
一、前言
OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。但是如果请求连接超时、处理请求超时怎么办,如果我们放任不管听之任之势必造成服务雪崩,客户电话打爆投诉,背锅的又会是谁呢?所以本篇文章我们来探究一下超时处理:
二、OpenFeign与Ribbon配置
这里的例子可以在本专栏里面找到,也可以自己手动试试。
1、OpenFeign默认处理请求超时时间
1.1、模拟处理请求0.5秒
@Override
public String feign(String str) {
try {
// 模拟处理请求超时
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello " + str + ":";
}
用postman请求看下feign调用结果:
可以看到正常执行并返回了结果。 我们继续看下面的一组实验:
1.2、模拟处理请求1秒
@Override
public String feign(String str) {
try {
// 模拟处理请求超时熔断
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello " + str + ":";
}
用postman请求看下feign调用结果:
响应结果是“网络繁忙,请稍后再试试!!!” ,可见请求超时了会降级处理。所以OpenFeign默认处理请求操作超时时间为1秒。这个时间确实是快了点!
2、Ribbon配置
2.1、配置请求处理超时5秒
ribbon:
eureka:
enabled: false #由于使用Nacos,而不是Eureka
eager-load:
enabled: true #饥饿加载,系统启动时创建好ribbon客户端而不是在使用时去创建
ConnectTimeout: 5000 #单位ms,请求连接超时时间 那这里1分钟
ReadTimeout: 5000 #单位ms,请求处理的超时时间
OkToRetryOnAllOperations: false #对所有操作请求都进行重试
MaxAutoRetriesNextServer: 0 #切换实例的重试次数
MaxAutoRetries: 0 #对当前实例的重试次数
ServerListRefreshInterval: 2000 #从源刷新服务器列表的间隔
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
用postman请求看下feign调用结果:
可见Ribbon中配置的超时时间5秒相对于模拟睡眠时间1秒较长,睡眠时间过了处理完请求,返回正常结果。
2.2、模拟请求处理5秒
@Override
public String feign(String str) {
try {
// 模拟处理请求超时熔断
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello " + str + ":";
}
用postman请求看下feign调用结果:
响应结果是“网络繁忙,请稍后再试试!!!” ,可见请求超时了会降级处理。所以处理请求操作不能时间不能超过Ribbon配置的处理请求超时时间,否则会被降级处理(自己定义降级处理)!
3、OpenFeign配置
3.1、配置请求处理超时6秒
feign:
sentinel:
enabled: true
# 设置 feign 超时时间,优先级高于ribbon配置
client:
config:
# default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
default:
connectTimeout: 6000
readTimeout: 6000
用postman请求看下feign调用结果:
可见虽然Ribbon中配置的超时时间5秒,但是feign配置的处理请求超时时间为6秒,相对于模拟睡眠时间5秒大于ribbon配置时间小于feign配置时间并且处理完请求,返回正常结果。那么feign的配置覆盖了ribbon配置的超时时间,feign的配置优先级高于ribbon的。
3.2、OpenFeign配置对全部服务有效
feign:
hystrix:
# Feign启用断路器,默认为FALSE
enabled: true
client:
config:
# 针对所有的服务
default:
# Feign的连接建立超时时间,默认为10秒
connectTimeout: 5000
# Feign的请求处理超时时间,默认为60秒
readTimeout: 5000
# 日志级别
loggerLevel: full
# 错误解码器
errorDecoder: com.example.SimpleErrorDecoder
# 重试策略
retryer: com.example.SimpleRetryer
# 拦截器配置(和@Bean的方式二选一)
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否对404错误码解码
# 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
decode404: false
# 编码器
encoder: com.example.SimpleEncoder
# 解码器
decoder: com.example.SimpleDecoder
# 契约
contract: com.example.SimpleContract
注意config下的default。
3.3、针对某个服务
feign:
hystrix:
# Feign启用断路器,默认为FALSE
enabled: true
client:
config:
# 针对某个服务
ceam-wx:
# Feign的连接建立超时时间,默认为10秒
connectTimeout: 5000
# Feign的请求处理超时时间,默认为60秒
readTimeout: 5000
# 日志级别
loggerLevel: full
# 错误解码器
errorDecoder: com.example.SimpleErrorDecoder
# 重试策略
retryer: com.example.SimpleRetryer
# 拦截器配置(和@Bean的方式二选一)
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否对404错误码解码
# 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
decode404: false
# 编码器
encoder: com.example.SimpleEncoder
# 解码器
decoder: com.example.SimpleDecoder
# 契约
contract: com.example.SimpleContract
注意config下的ceam-wx(服务名)。
💖SpringCloud Alibaba实战搭建系列:
✨《SpringCloud Alibaba微服务第1章》
✨《SpringCloud Alibaba微服务第2章之Nacos》
✨《SpringCloud Alibaba微服务第3章之Nacos》
✨《SpringCloud Alibaba微服务第4章之Nacos》
✨《SpringCloud Alibaba微服务第5章之Gateway》
✨《SpringCloud Alibaba微服务第6章之Gateway》
✨《Spring Cloud Alibaba微服务第7章之负载均衡Ribbon》
✨《Spring Cloud Alibaba微服务第8章之OpenFeign》
✨《Spring Cloud Alibaba微服务第9章之MyBatis-plus》
✨《Spring Cloud Alibaba微服务第10章之MyBatis-plus》
✨《Spring Cloud Alibaba微服务第11章之MyBatis-plus》
✨《Spring Cloud Alibaba微服务第13章之分库分表》
✨《Spring Cloud Alibaba微服务第14章之分库分表》
✨《Spring Cloud Alibaba微服务第15章之服务容错》
✨《Spring Cloud Alibaba微服务第16章之服务容错》
✨《Spring Cloud Alibaba微服务第17章之消息服务》
✨《Spring Cloud Alibaba微服务第18章之消息服务》
✨《Spring Cloud Alibaba微服务第19章之分布式事务》
✨《Spring Cloud Alibaba微服务第20章之分布式事务》
✨《Spring Cloud Alibaba微服务第21章之分布式事务》
✨《Spring Cloud Alibaba微服务第22章之Oauth2》
✨《Spring Cloud Alibaba微服务第23章之Oauth2授权码模式》
✨《Spring Cloud Alibaba微服务第24章之Docker部署》
✨《Spring Cloud Alibaba微服务第25章之Jenkins》
✨《Spring Cloud Alibaba微服务第26章之Jenkins》
✨《Spring Cloud Alibaba微服务第27章之Jenkins》