zoukankan      html  css  js  c++  java
  • SpringCloud(五)之Spring Cloud 中 Feign结合Hystrix断路器开发实战

    1.先讲hystrx(断路器) 在springcloub 中的使用

    1.1  加入依赖

     注意:网上新旧版本问题,所以要以官网为主,不然部分注解会丢失
    最新版本 2.0

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

    1.2 增加注解
    启动类里面增加注解
    @EnableCircuitBreaker

    @SpringBootApplication
    @EnableFeignClients
    @EnableCircuitBreaker
    @EnableHystrixDashboard
    public class OrderServiceApplication {

    public static void main(String[] args) {
    SpringApplication.run(OrderServiceApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
    return new RestTemplate();
    }

    }

    1.3 API接口编码实战(下面就是熔断降级服务异常报警通知实战)
    熔断-》降级

    1)最外层api使用(比如:controller上面),好比异常处理(网络异常,参数或者内部调用问题,报警)
    api方法上增加 @HystrixCommand(fallbackMethod = "saveOrderFail")

    编写fallback方法实现,方法签名一定要和api方法签名一致(注意点!!!)

    @RestController
    @RequestMapping("api/v1/order")
    public class OrderController {

    @Autowired
    private ProductOrderService productOrderService;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping("save")
    @HystrixCommand(fallbackMethod = "saveFallback")
    public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId,HttpServletRequest request){
    if (userId==1){
    return "123";
    }
    Map<String, Object> msg = new HashMap<>();
    msg.put("code", -1);
    msg.put("msg", productOrderService.save(userId, productId));
    return msg;
    }
    /***
    * @Description: save 方法出现异常,Hystrix 熔断之后回调方法
    * 该参数的参数要和目标方法参数一致
    * @Param: [userId, productId]
    * @return: java.lang.Object
    * @author: wangbs
    * @create: 2019/2/19 9:07
    */
    public Object saveFallback(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId,HttpServletRequest request){
    //模拟发短信信息进行提醒发生了错误信息
    String saveOrderKye = stringRedisTemplate.opsForValue().get("saveOrderKye");
    //进行报警告诉相关人,对应的api出错
    new Thread(()->{
    if(StringUtils.isBlank(saveOrderKye)){
    stringRedisTemplate.opsForValue().set("saveOrderKye","save-order-fail",20, TimeUnit.SECONDS);
    //模拟发短信功能
    System.out.println("发送短信:productService 接口报错了"+request.getRemoteAddr());
    }
    }).start();
    Map<String, Object> msg = new HashMap<>();
    msg.put("code", -1);
    msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试");
    return msg;
    }
    }
    2.Feign结合Hystrix断路器开发实战 在springcloub 中的使用
      Feign结合Hystrix断路器开发实战,其实是为了把异常跟精确的定位到某个接口,而上面标题一我说的 ystrx(断路器) 在springcloub 中的使用 主要是在controller 中使用 目的是可以更好的控制异常处理,或者报警通知,
    所以开发标题二时,标题一上面的所有配置全需要保留,不然没有意义。
    2.1开启feign支持hystrix  (注意,一定要开启,旧版本默认支持,新版本默认关闭)#开启feign支持hystrix
     hystrix:
    enabled: true

    2.2 ProductClient(name="
    product-service", fallback=ProductClientFallback.class ), class需要继承当前ProductClient的类
    至于下面的 ProductClient  讲的是Feign 的使用可以看看我的博客 feign 的讲解 
    https://www.cnblogs.com/xiaowangbangzhu/p/10397037.html
    //服务的生成者(被调用者)在注册中心注册的名字
    @FeignClient(name = "product-service",fallback = ProductClientFallback.class)
    public interface ProductClient {
    //被调用者对应方法的路由(类和方法上的@RequestMapping)
    /**
    * 这里需要注意的两个地方
    * <p>
    * 1、在这里使用的GetMapping注解要和被调用发一致,如果还有问题就用@RequestMapping
    * 2、@PathVariable需要设置value,如果不设置也不能成功启动
    *
    * @param id
    * @return
    */
    @GetMapping("/api/v1/product/find")
    String findById(@RequestParam(value = "id") int id);
    }

    @Component
    public class ProductClientFallback implements ProductClient {

    @Override
    public String findById(int id) {
    //在这里可以得到具体的某一个接口api出现的错误,然后返回信息
    System.out.println("feign 调用product-service findbyid 异常");
    return null;
    }
    }

     


    下面的配置不建议加上,如果有需要可以加上
     s设置feign 的连接时间和读取时间(不建议开启)
    #默认optons readtimeout是60,但是由于hystrix默认是1秒超时
    #feign:
    # client:
    # config:
    # default:
    # connectTimeout: 40000
    # readTimeout: 4000

    # 默认是一秒(不建议开启)
    #hystrix:
    # command:
    # default:
    # execution:
    # isolation:
    # thread:
    # timeoutInMilliseconds: 4000
     
     
  • 相关阅读:
    大数据集群迁移的那一夜是怎么过的
    什么是Lambda架构
    从0到1搭建自助分析平台
    业务重要?还是技术重要?
    如何从0到1搭建大数据平台
    从0到1搭建大数据平台之数据采集系统
    高频面试题:秒杀场景设计
    面试官:面对千万级、亿级流量怎么处理?
    来自朋友最近阿里、腾讯、美团等P7岗位面试题
    《我想进大厂》之JVM夺命连环10问
  • 原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/10401702.html
Copyright © 2011-2022 走看看