• java 微服务通过 设置超时时间或者捕捉异常 的方式处理 微服务挂掉或者其他异常问题


      废话不多说直接上代码

      服务端:

      我们可以看出来服务端的方法里面 10/0 是必报错的

      

        @Resource
        private PaymentService paymentService;
    
    @GetMapping("/payment/hystrix/paymentInfo_Error")
        public CommonResult paymentInfo_Error() {
            String result= paymentService.paymentInfo_Error();
            log.info("*******result:"+result);
            if(result.equals("服务异常"))
            {
                return  new CommonResult(301,"服务异常",null);
            }
            return  new CommonResult(200,"服务成功",null);
        }
    package com.aty.springcloud.service;
    
    import cn.hutool.core.util.IdUtil;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
    import org.springframework.stereotype.Service;
    import org.springframework.web.bind.annotation.PathVariable;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * Created by vcyber
     */
    @Service
    public class PaymentService {
         
        /**
        * @Description: 模拟服务异常
        * @Param:  * @param null
        * @return:
        * @Author: 杨金旺
        * @Date: 2020/7/9
        */
        public  String paymentInfo_Error()
        {
           try{
                int timeNumder=10/0;
             
            }catch (Exception e)
            {
                 e.printStackTrace();
                 return  "服务异常";
            }
            return  "服务成功";
        }
    }

      消费端代码:

      PAYMENT_URL 是服务端的服务名

     // 通过捕捉 异常 解决 微服务异常
        @GetMapping("/consumer/payment/paymentInfo_Error")
        public  CommonResult paymentInfo_Error()
        {
            try {
                ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/hystrix/paymentInfo_Error", null, CommonResult.class);
    
                if (entity.getStatusCode().is2xxSuccessful()) {
                    log.info("响应状态码:" + entity.getStatusCode() + ",headers:" + entity.getHeaders());
                    return new CommonResult<>(200, "操作结果:" + entity.getBody()); //entity.getBody();
                } else {
                    return new CommonResult<>(444, "操作失败");
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return new CommonResult<>(555, "调用服务出现异常");
            }
        }
    
        private static ExecutorService executorService = Executors.newSingleThreadExecutor();
        // 通过设置超时 解决 微服务异常
        @GetMapping("/consumer/payment/timeout")
        public  CommonResult timeout()
        {
            try {
                /*
                ExecutorService executor = Executors.newSingleThreadExecutor();
                FutureTask<CommonResult> future = new FutureTask<CommonResult>(new Callable<List<Object[]>>()*/
    
                FutureTask<ResponseEntity<CommonResult>> futureTask = new FutureTask<>(new Callable<ResponseEntity<CommonResult>>() {
    
                    @Override
                    public ResponseEntity<CommonResult> call() throws Exception {
                        ResponseEntity<CommonResult> c=  restTemplate.getForEntity(PAYMENT_URL + "/payment/hystrix/paymentInfo_Error", null, CommonResult.class);
                        return c;
                    }
                });
                executorService.execute(futureTask);
                try {
                    ResponseEntity<CommonResult>  result = futureTask.get(1, TimeUnit.MILLISECONDS);
                    return new CommonResult<>(200, "操作结果:" + result.getBody()); //entity.getBody();
                } catch (InterruptedException | ExecutionException | TimeoutException e) {
                    //e.printStackTrace();
                    futureTask.cancel(true);
                    return new CommonResult<>(666, "调用服务超时");
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return new CommonResult<>(555, "调用服务出现异常");
            }
        }

      Template 类

      

    @Configuration
    public class ApplicationContextConfig {
        @Bean
        @LoadBalanced   // 默认轮询
        public RestTemplate getRestTemplate()
        {
            return new RestTemplate();
    
        }
    }

    服务端启用 捕捉异常的 调用结果:

    服务端未启用 通过超时设置的 调用结果:

     

  • 相关阅读:
    通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD
    Solr5.5.1 IK中文分词配置与使用
    windows环境tomcat8配置Solr5.5.1
    初谈SQL Server逻辑读、物理读、预读
    C#6新特性,让你的代码更干净
    PJAX初体验(主要是利用HTML5 新增API pushState和replaceState+AJAX)
    js实现String.Fomat
    iOS 画虚线
    UIFont字体大全
    iOS 里RGB 配色 UIColor colorWithRed
  • 原文地址:https://www.cnblogs.com/yangjinwang/p/13274490.html
Copyright © 2020-2023  润新知