您当前的位置: 首页 >  spring

墨家巨子@俏如来

暂无认证

  • 1浏览

    0关注

    188博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

九.SpringCloud极简入门-Feign开启Hystrix

墨家巨子@俏如来 发布时间:2020-03-25 14:52:31 ,浏览量:1

老鸟飞过,学习使用,欢迎交流

九.Feign开启Hystrix

在学习Feign的那一章节我们了解到Feign已经集成了Hystrix,但是在高版本关闭了Hystrix功能,我们这一章节就来学习在Feign里面如何使用Hystrix。

1.支付服务集成Hystrix

官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/single/spring-cloud.html#spring-cloud-feign-hystrix

支付服务 springcloud-pay-server-1040 之前集成了Feign,修改该工程集成Hystrix。我们除了要给Feign开启Hystrix以外还需要为Feign接口编写托底类。

1.1.开启Hystrix

通过feign.hystrix.enabled=true开启Hystrix

feign:
  hystrix:
    enabled: true #开启熔断支持
ribbon:
  ReadTimeout: 3000
  SocketTimeout: 3000
  ConnectTimeout: 3000
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10300
2.2.Fiegn接口熔断-fallback方式

服务通过Feign接口调用异常或超时需要触发降级,返回托底数据。这里有两种方式,分别是通过@FeignClient(fallback=…) ,以及@FeignClient(fallbackFactory=…) 来指定托底类,区别在于通过fallback的方式编写的托底是没办法打印出异常日志的 ,而fallbackFactory方式是可以打印出异常日志, 我们先来看第一种写法:

@FeignClient(value = "user-server",fallback = UserFeignClientFallback.class)
public interface UserFeignClient {

    //订单服务来调用这个方法      http://localhost:1020/user/10
    // @GetMapping(value = "/user/{id}" )
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    User getById(@PathVariable("id")Long id);
}

提示: fallback = UserFeignClientFallback.class : 该类是当前接口的实现类 ,也是托底数据所在的处理类

托底实现类:

//让Spring扫描到该托底类
@Component
public class UserFeignClientFallback implements UserFeignClient {

    //日志打印器
    private Logger log = LoggerFactory.getLogger(UserFeignClientFallback.class);

    @Override
    public User getById(Long id) {
        log.info("用户服务不可用");
        //托底数据
        return new User(-1l,"无此用户","用户服务不可用");
    }
}

提示:注意,这里托底类需要交给Spirng管理,类上需要打 @Component 注解 , 拖地类需要实现 Feign接口,复写接口中的方法作为托底方法返回拖地数据。当Fiegn调用失败就会以拖地方法返回的结果返回给用户

启动测试

依次启动 springcloud-eureka-server-1010 , springcloud-user-server-1020, springcloud-pay-server-1030 , 访问:http://localhost:1040/pay/1 观察浏览器是否正常拿到结果,然后关闭 springcloud-user-server-1020工程观察浏览器是否返回托底数据。

这种方式及时触发托底了也看不到异常日志。

2.3.Fiegn接口熔断-fallbackFactory方式

使用fallbackFactory属性,使用工厂方式指定托底

//@FeignClient(value = "user-server",fallback = UserFeignClientFallback.class)
@FeignClient(value = "user-server",fallbackFactory = UserFeignClientFallbackFactory.class)
public interface UserFeignClient {

    //订单服务来调用这个方法      http://localhost:1020/user/10
    // @GetMapping(value = "/user/{id}" )
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    User getById(@PathVariable("id")Long id);
}

编写托底类 工程方式的托底类需要去实现 FallbackFactory接口 ,并指定泛型为“”Feign客户端接口(UserFeignClient )。FallbackFactory的create方法返回了Feign客户端接口的实例,该方法的throwable是参数是Feign调用失败的异常信息,如下:

//工厂方式的 , 托底类
@Component
public class UserFeignClientFallbackFactory implements FallbackFactory{

    //拖地方法 : throwable,异常
    @Override
    public UserFeignClient create(Throwable throwable) {
		//返回UserFeignClient 接口的实例
        return new UserFeignClient() {
            @Override
            public User getById(Long id) {
                //把异常信息打印到控制台
                throwable.printStackTrace();

                //真正拖地方法 , 这里的数据是托底数据
                return new User(-1L,"无此用户","用户服务不可用");
            }
        };
    }
}

启动测试

测试方式同上 ,只是这种方式触发托底是可以在控制台看到异常信息,方便我们调试。

关注
打赏
1651329177
查看更多评论
立即登录/注册

微信扫码登录

0.0380s