feign: compression: request: enabled: true #开请求压缩 mimeTypes: #媒体类型 text/xml,application/xml,application/json minRequestSize: 2048 #最小的请求大小 response: enabled: true #开启响应的压缩
@FeignClient(name = "github-client",url = "https://api.github.com",configuration = HelloFeignServiceConfig.class) public interface HelloFeignService { /* 这个返回类型如果采用了压缩,那么就是二进制的方式,就需要使用ResponseEntity<byte[]>作为返回值 */ @RequestMapping(value = "/search/repositories",method = RequestMethod.GET) ResponseEntity<byte[]> searchRepositories(@RequestParam("q")String parameter); }
@FeignClient(name = "github-client",url = "https://api.github.com",configuration = HelloFeignServiceConfig.class)
@Configuration public class HelloFeignServiceConfig { /** * * Logger.Level 的具体级别如下: NONE:不记录任何信息 BASIC:仅记录请求方法、URL以及响应状态码和执行时间 HEADERS:除了记录 BASIC级别的信息外,还会记录请求和响应的头信息 FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据 * @return */ @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
#请求处理的超时时间 ribbon.ReadTimeout: 12000 #请求链接超时时间 ribbon.ConnectionTimeout: 30000
hystrix: command: default: circuitBreaker: sleepWindowInMilliseconds: 30000 requestVolumeThreshold: 50 execution: timeout: enabled: true isolation: strategy: SEMAPHORE semaphore: maxConcurrentRequests: 50 thread: timeoutInMilliseconds: 100000
@Component public class FeignRequestInterceptor implements RequestInterceptor{ @Autowired private ObjectMapper objectMapper; @Override public void apply(RequestTemplate requestTemplate) { // feign 不支持 GET 方法传 POJO, json body转query if (requestTemplate.method().equalsIgnoreCase("GET") && requestTemplate.body()!=null){ try { JsonNode jsonNode = objectMapper.readTree(requestTemplate.body()); requestTemplate.body(null); Map<String,Collection<String>> queries = new HashMap<>(); buildQuery(jsonNode,"",queries); requestTemplate.queries(queries); } catch (IOException e) { e.printStackTrace(); } } } private void buildQuery(JsonNode jsonNode, String path, Map<String, Collection<String>> queries) { if (!jsonNode.isContainerNode()) { // 叶子节点 if (jsonNode.isNull()) { return; } Collection<String> values = queries.get(path); if (null == values) { values = new ArrayList<>(); queries.put(path, values); } values.add(jsonNode.asText()); return; } if (jsonNode.isArray()) { // 数组节点 Iterator<JsonNode> it = jsonNode.elements(); while (it.hasNext()) { buildQuery(it.next(), path, queries); } } else { Iterator<Map.Entry<String, JsonNode>> it = jsonNode.fields(); while (it.hasNext()) { Map.Entry<String, JsonNode> entry = it.next(); if (StringUtils.hasText(path)) { buildQuery(entry.getValue(), path "." entry.getKey(), queries); } else { // 根节点 buildQuery(entry.getValue(), entry.getKey(), queries); } } } } }
<!-- https://mvnrepository.com/artifact/cn.springcloud.feign/venus-cloud-feign-core --> <dependency> <groupId>cn.springcloud.feign</groupId> <artifactId>venus-cloud-feign-core</artifactId> <version>1.0.0</version> </dependency>
END 十期推荐 【241期】面试官:你了解JVM中的ZGC垃圾收集器吗? 【242期】面试官:Spring AOP有哪些通知类型,它们的执行顺序是怎样的? 【243期】面试官:什么是前缀索引、为什么要用前缀使用、用在什么场景下? 【244期】万字 图解 Redis,面试不用愁了! 【245期】面试官:MySQL发生死锁有哪些原因,怎么避免? 【246期】面试官:说说你对 RabbitMQ 的理解以及使用它的场景 【247期】记一次Java面试中遇到的三个问题及感悟! 【248期】面试官:你能说几个Java8中Stream对列表去重的方法吗? 【249期】关于Java中的异常,面试可以问的都在这里了! 【250期】关于Mybatis知识点,面试可以问的都在这里了! ? ~