概述
boot版本:2.0.6
cloud版本:Finchley.SR2
openfeign(支持负载均衡,底层是httpClient调用,并非RPC)是一个声明式的RESTful客户端,
openfeign在我的理解中,由于RestTemplate用起来比较麻烦,于是在这个基础上进行了封装,使调用更加简单,更加清晰。
hystrix是一种保证服务稳定的组件,使服务不会因为某个服务崩溃导致整个应用崩溃。可以简单的理解为通用的异常处理。
hystrix用起来非常的简单,openfeign默认支持hystrix,只不过需要开启才行。
Feign 其实是一种包装,把复杂的 Http 请求包装成我们只需写一两个注解就可以搞定的地步。他底层使用的还是 Ribbon。
使用上个版本的代码
pom.xml引入依赖
<!-- openfeign/hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
服务调用 user 调用 third
user服务 启动类新增注解
@SpringBootApplication
@EnableFeignClients(basePackages = "com.crayon.*") //激活feign
@EnableCircuitBreaker//激活 hystrix
public class YuUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(YuUserServiceApplication.class, args);
}
}
新增调用接口
@FeignClient(value = "yu-third-service-conusl", fallback = UserFallBack.class) // value为被调用方 consul中注册的服务,fallback 为熔断后指定的异常处理
public interface UserInvokeService {
@GetMapping(value = "third/{name}")
Message getUser(@PathVariable("name") String name);
@PutMapping(value = "third/{name}")
Message putUser(@PathVariable("name") String name);
@PostMapping(value = "third/{name}")
Message postUser(@PathVariable("name") String name);
@DeleteMapping(value = "third/{name}")
Message deleteUser(@PathVariable("name") String name);
}
@Component
public class UserFallBack implements UserInvokeService {
private Message getError(String name) {
Message message = new Message();
message.setMsg("请求出错" + name);
message.setResult(99);
return message;
}
@Override
public Message getUser(String name) {
return getError(name);
}
@Override
public Message putUser(String name) {
return getError(name);
}
@Override
public Message postUser(String name) {
return getError(name);
}
@Override
public Message deleteUser(String name) {
return getError(name);
}
}
配置中心新增配置(激活熔断,并设置超时 单位毫秒)
third服务 新增接口(对应的4个接口)
启动服务(consul必须启动的)
调用user接口 返回的是从 third拿到的结果
关闭third服务 然后再次调用
third服务 接口Thread.sleep(1分钟) 然后再次调用--测试ribbon超时
然后发现 不管怎么设置超时间,都是超过1秒都返回异常
原因:
Feign 的调用,总共分为两层,即 Ribbon 的调用和 Hystrix(熔断处理) 的调用,高版本的 Hystrix 默认是关闭的。
为了避免超时,我们可以根据业务情况来配置自己的超时时间,此处配置熔断时间为:5000/毫秒。
注意:建议 Ribbon 的超时时间不要大于 Hystrix 的超时时间
在配置中心新增配置
### Hystrix 配置
hystrix:
# 这样将会自动配置一个 Hystrix 并发策略插件的 hook,这个 hook 会将 SecurityContext 从主线程传输到 Hystrix 的命令。
# 因为 Hystrix 不允许注册多个 Hystrix 策略,所以可以声明 HystrixConcurrencyStrategy
# 为一个 Spring bean 来实现扩展。Spring Cloud 会在 Spring 的上下文中查找你的实现,并将其包装在自己的插件中。
shareSecurityContext: true
command:
default:
circuitBreaker:
# 当在配置时间窗口内达到此数量的失败后,进行短路。默认20个
requestVolumeThreshold: 1
# 触发短路的时间值,当该值设为5000时,则当触发 circuit break 后的5000毫秒内都会拒绝request
# 也就是5000毫秒后才会关闭circuit。默认5000
sleepWindowInMilliseconds: 15000
# 强制打开熔断器,如果打开这个开关,那么拒绝所有request,默认false
forceOpen: false
# 强制关闭熔断器 如果这个开关打开,circuit将一直关闭且忽略,默认false
forceClosed: false
execution:
isolation:
thread:
# 熔断器超时时间,默认:1000/毫秒
timeoutInMilliseconds: 5000
再次执行 可见 5秒熔断了
最终配置文件
spring:
datasource:
druid:
username: root
password: root
url: jdbc:mysql://localhost:3306/yq?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
initial-size: 10
max-active: 50
min-idle: 10
validation-query: select 1 from dual
test-while-idle: true
validation-query-timeout: 10000
redis:
host: localhost
port: 6379
password: redis
management:
endpoints:
web:
exposure:
include: '*'
mybatis:
type-aliases-package: com.crayon
mapper-locations: classpath:mapper/*.xml
configuration:
cache-enabled: true
lazy-loading-enabled: true
multiple-result-sets-enabled: true
default-executor-type: simple
default-statement-timeout: 25000
feign:
hystrix:
enabled: true
hystrix:
shareSecurityContext: true
command:
default:
circuitBreaker:
requestVolumeThreshold: 1
sleepWindowInMilliseconds: 15000
forceOpen: false
forceClosed: false
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
ribbon:
ConnectTimeout: 4000
ReadTimeout: 4000
ps:感谢大漠知秋 Feign Client超时设置 给我提供了解决超时的问题
最后
以上就是害羞钥匙为你收集整理的SpringCloud-Feign/Hystrix 调用/熔断的全部内容,希望文章能够帮你解决SpringCloud-Feign/Hystrix 调用/熔断所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复