前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springcloud系列之-快速上手hystrix

springcloud系列之-快速上手hystrix

作者头像
AI码师
发布2020-11-19 16:06:38
3420
发布2020-11-19 16:06:38
举报

什么是hystrix?

hystrix是netflix针对微服务分布式系统采用的熔断保护中间件,hystrix提供了在服务不可达或请求超时之后,优雅的给客户端返回响应结果。

为什么用hystrix?

在微服务场景下,很多服务相互依赖,如果不能对依赖的服务进行隔离,那么服务本身也有可能发生故障,hystrix可以是服务间实现隔离,当某一服务出现故障后,他能够优雅的回退并进行降级,避免出现连锁反应

hystrix快速上手

关注公众号“乐哉码农”,回复“hystrix”获取本节基础项目

在consumer服务上进行操作,添加maven依赖

代码语言:javascript
复制
代码语言:javascript
复制
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

在userConsumerService类上添加注解@HystrixCommand(fallbackMethod = "getUserFallback")

getUserFallback是当方法执行超时或失败的时候,就会去调用这个方法,给出优雅的响应

添加对应的方法

代码语言:javascript
复制
代码语言:javascript
复制
//失败回调
    public User getUserFallback(@RequestParam("name") String name){
        User user=new User();
        user.setName(name);
        user.setEmail("调用失败");        return user;
    }

为了验证效果,这次我们之启动eurek和consumer两个项目,让product服务直接调不通,来模拟请求超时,这是单独使用hystrix进行熔断降级,接下来给大家介绍的是hystrix与feign结合,实现熔断降级

注意:因为我这个是单独将feign作为一个独立的项目,用jar包的形式引入到服务中的,在整合过程中会出现很多问题,不过在文章中都给出了解决办法

打开feign项目

修改UserFeign的注解,如下

代码语言:javascript
复制
@FeignClient(value = "eureka-client-order-service",configuration = FeignConfig.class,fallback = UserFeignFallBack.class)public interface UserFeign {    @GetMapping("/user/get")    User getUser(@RequestParam("name") String name);    @PostMapping("/user/getMap")    User getUser(@RequestParam Map<String, String> param);    @PostMapping("/user/add")    User addUser(@RequestParam("name") String name, @RequestParam("email") String email);    @PostMapping("/user/addBody")    User addUser(@RequestBody User user);
}

FeignClient注解上添加了fallback = UserFeignFallBack.class,UserFeignFallBack是UserFeign的实现类,当feign接口调用失败的时候会自动去调用UserFeignFallBack里面对应的方法,返回给调用方,UserFeignFallBack内容如下

代码语言:javascript
复制
@Componentpublic class UserFeignFallBack implements UserFeign {    @Override
    public User getUser(String name) {
        User user=new User();
        user.setName(name);
        user.setEmail("接口请求失败");        return user;
    }    @Override
    public User getUser(@RequestParam Map<String, String> param) {
        User user=new User();
        user.setName(param.get("name"));
        user.setEmail("接口请求失败");        return user;
    }    @Override
    public User addUser(String name, String email) {
        User user=new User();
        user.setName(name);
        user.setEmail("接口请求失败");        return user;
    }    @Override
    public User addUser(@RequestBody User user) {        return user;
    }
}

feign项目里面的工作已经完成,现在我们在consumer项目里面开启feign的熔断功能

代码语言:javascript
复制
feign:
  hystrix:
    enabled: true
代码语言:javascript
复制
现在重启consumer项目,发现项目启动不了,报了一个这样的错误
代码语言:javascript
复制
No fallback instance of type class com.yangle.feign.UserFeignFallBack found for feign client eureka-client-order-service

没找到UserFeignFallBack这个实例。

现在分析下出现这个的原因,没找到这个实例,说明扫包的时候没扫到他,因为feign是作为jar被引入的,是有可能没被扫到,但是为什么没有报FeignConfig.class实例不存在呢,这个很好解释,还记得我们在整合feign的时候,在启动类上面添加了这样一个东西么,

,,但是

这个好像只扫描了他关注的,并没有去扫描被component注解的实例,所以问题找到了,现在要做的就是能够让UserFeignFallBack能被扫描到

第一种解决办法,在启动类上,加上扫描UserFeignFallBack所在的包路径,前面一个是项目基础包

代码语言:javascript
复制
@SpringBootApplication(scanBasePackages = {"com.yangle.feign","com.yangle.eurekaclientproducter"})
第二种解决办法,因为FeignConfig能够被扫描到,所以可以手动在FeignConfig里面添加bean,去进行实例化
@Configurationpublic class FeignConfig { 
   @Bean
    Logger.Level feignLoggerLevel() {    
        return Logger.Level.FULL;
    }   
     @Bean
    public FeignBasicAuthRequestInterceptor basicAuthRequestInterceptor(){        return new FeignBasicAuthRequestInterceptor();
    }    class FeignBasicAuthRequestInterceptor implements RequestInterceptor{        @Override
        public void apply(RequestTemplate requestTemplate) {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String token = request.getHeader("token");
            requestTemplate.header("token",token);
            Map<String, Collection<String>> headers= requestTemplate.headers();
        }
    }  
      @Bean
    public UserFeignFallBack userFeignFallBack(){        return new UserFeignFallBack();
    }
}

现在重新启动应该就可以了,项目启动成功访问http://localhost:8082/consumer/user/get,返回

说明服务熔断降级成功。

虽然熔断降级完成了,但是好像并不是很完美,因为我们虽然能够优雅的给用户响应,但是作为管理员,我们需要找出这次调用不成功的原因,所以必须将出错信息或异常记录下来,其实feign也给我们提供了另外一种方法fallbackFactory

修改feign注解

代码语言:javascript
复制
@FeignClient(value = "eureka-client-order-service",configuration = FeignConfig.class,fallbackFactory =UserFeignFallBackFactory.class)public interface UserFeign {    @GetMapping("/user/get")    User getUser(@RequestParam("name") String name);    @PostMapping("/user/getMap")    User getUser(@RequestParam Map<String, String> param);    @PostMapping("/user/add")    User addUser(@RequestParam("name") String name, @RequestParam("email") String email);    @PostMapping("/user/addBody")    User addUser(@RequestBody User user);
}@Componentpublic class UserFeignFallBackFactory implements FallbackFactory<UserFeign> {    @Override
    public UserFeign create(Throwable throwable) {        return new UserFeign() {            @Override
            public User getUser(String name) {
                User user=new User();
                user.setName(throwable.getMessage());
                user.setEmail("接口调用失败");                return user;
            }            @Override
            public User getUser(Map<String, String> param) {                return null;
            }            @Override
            public User addUser(String name, String email) {                return null;
            }            @Override
            public User addUser(User user) {                return null;
            }
        };
    }
}

所有的处理操作都是在create方法里面进行降级操作,在这里能拿到异常对象,将异常信息记录下来,并且优雅的给用户返回错误信息。

总结

本章学习了hystrix,并且通过hystrix实现了服务的保护功能,下一节带领大家学习API网关zuul

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐哉开讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档