• Feign (配合Hystrix) +文件传输


    由于spingcloud  版本更新比较快,此处重新整理一版:

    版本:  Java 8 

       spring boot  <version>  2.1.15.RELEASE </version>

       <spring-cloud.version>Greenwich.SR6</spring-cloud.version>

    1. Feign的使用(配合Hystrix)

    准备:在 service  MICRO-CLENT2-USER 写一个接口:

    like:

     @RequestMapping(value = "/hello/{word}",method = RequestMethod.GET)
        public String hello(@PathVariable("word") String word){
            return feignService.hello(word);
        }
        @RequestMapping(value = "/order/queryOrderbyXXNoIn",method = RequestMethod.POST)
        public List<Order> queryOrderbyXXNoIn(@RequestParam(value = "xxName") String xxName ,@RequestParam(value = "xxNos",required = true) List<String> xxNos);

     文件下载。

        @GetMapping(value = "/booking/downloadOrderExcel",consumes = MediaType.APPLICATION_PROBLEM_JSON_VALUE)
        Response downloadOrderExcel (@RequestParam("s3key") String s3key);
        @PostMapping("/bagId/downLoadBagIdExcel")
        public void  genBagIdExcel (HttpServletResponse response, String status, MultipartFile multipartFile){
            try {
                Response responses = monitorClient.genBagIdExcel(status,multipartFile);
                InputStream inputStream = responses.body().asInputStream();
                OutputStream outputStream = response.getOutputStream();
                response.setContentType("application/force-download");
                response.addHeader("Content-Disposition", "attachment;filename=" + "result_BagIdData"+".xlsx");
                response.addHeader("Cache-Control", "no-cache");
                IOUtils.copy(inputStream, outputStream);
                outputStream.flush();
                inputStream.close();
            } catch (Exception e) {
                log.error("downloadBagIdExcel exception :{}",e);
            }
    
        }
    View Code

    文件上传:

        @RequestMapping(value = "/m/createOrUpdateWithExcel",method = RequestMethod.POST,consumes = MediaType.MULTIPART_FORM_DATA_VALUE,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
        public ResponseEntity<JSONObject> createOrUpdateMilestone(@RequestPart("excelFile") MultipartFile excelFile,
                @RequestParam("action") String  action,@RequestParam("userName") String  userName) ;

    使用:

    在service  MICRO-CLENT2-USER  中使用Feign 调用  MICRO-CLENT1-USER 的接口

     

    依赖:

            <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>

    主类:

    @EnableDiscoveryClient
    @EnableFeignClients
    @EnableCircuitBreaker 
    @SpringBootApplication
    public class EurekaServceApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServceApplication.class, args);
        }
    }

    配置文件:

    server:
      port: 9002
    spring:
      application:
        name: MICRO-CLENT2-USER
    management:
      endpoint:
        health: #健康检测 查看 http://localhost:8761/actuator/health
          show-details: always
    eureka:
      client:
        service-url:
          defaultZone: http://root:root@127.0.0.1:8761/eureka/
      instance:
       # 是否显示ip,如果不设置那么就会显示主机名,默认false
        prefer-ip-address: true
    feign:
      hystrix:
        enabled: true
      client:
        config:
          default:
            connectTimeout: 7000
            readTimeout: 700

    定义Feign调用接口:

    /**
     @param: name :被调用服务的服务名
     @param: configuration :Feign的配置,可以不配,建议配置,解决连接超时,retry
     @param: fallback :Feign 默认支持hystrix, 自定义一个类,然后实现方法即可,如果链路失败,自调用备胎,返回默认值(做异常提示)
     */
    @FeignClient(name = "MICRO-CLENT1-USER",configuration = FeignConfig.class,fallback = FeignServiceHystrxFall.class)
    public interface FeignService {
    
             @RequestMapping(value = "/hello/{word}",method = RequestMethod.GET)
            public String hello(@PathVariable("word") String word);
        
    }

    定义Feign 的Config

    @Configuration
    public class FeignConfig {
    
          @Autowired
            private ObjectFactory<HttpMessageConverters> messageConverters;
            
            @Bean
            public Retryer feignRetryer(){
                return new Retryer.Default(100,TimeUnit.SECONDS.toMillis(1),5);
            }
            
            @Bean
            public Encoder feignFormEncoder() {
                return new SpringFormEncoder(new SpringEncoder(messageConverters));
            }
            
            @Bean
            public Request.Options options() {
                return new Request.Options(60000, 60000);}
        
    }
    @Component
    public class FeignServiceHystrxFall implements FeignService{
        @Override
        public String hello(String word) {
            //调用服务异常,断路
            //dosomething();
            return "上游服务异常";
        }
    }

    关于hystrix 的相关配置:

    hystrix:
      # === === === == 默认Command === === === ==
      command:
        default:
          execution:
            isolation:
              # 调用隔离方式, 默认: 采用线程隔离, ExecutionIsolationStrategy:THREAD
              strategy: THREAD
              # 调用超时时间, 默认: 5 秒
              thread:
                timeoutInMilliseconds: 8000
              # 使用信号量隔离时, 命令调用最大的并发数
              semaphore:
                maxConcurrentRequests: 10
          #使用信号量隔离时, 命令fallback调用最大的并发数
          fallback:
            isolation:
              semaphore:
                maxConcurrentRequests: 10
          # === === === == 熔断器 === === === ==
          circuitBreaker:
            # 熔断器在整个统计时间内是否开启的阀值, 默认20个请求
            requestVolumeThreshold: 8
            # 熔断器默认工作时间, 默认: 5 秒
            sleepWindowInMilliseconds: 5
            # 默认: 50%, 当出错率超过50% 后熔断器启动
            errorThresholdPercentage: 50
            # 是否强制开启熔断器阻断所有请求, 默认: false, 不开启
            forceOpen: false
            # 是否允许熔断器忽略错误, 默认false, 不开启
            forceClosed: false
  • 相关阅读:
    VMWare相关知识
    QTP中的DataTable操作
    解决Access的sql语句join两次出错的问题
    .net环境用GDI+绘制倾斜文字
    用JS读取XML文件
    再认识asp.net的postback机制:探索__doPostBack的来龙去脉
    用Jquery读取Json内容
    JS取URL参数值的一个方法
    WinForm在窗体里面添加窗体
    ASP.NET2.0Theme回顾总结
  • 原文地址:https://www.cnblogs.com/lshan/p/13165194.html
Copyright © 2020-2023  润新知