SpringCloud-Feign/Hystrix 调用/熔断

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超时设置 给我提供了解决超时的问题

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值