当前位置: 首页 > news >正文

spring-cloud-feign实战笔记

feign 配置

  1. 针对单个feign接口进行配置
    feign:client:config:# feignName 注意这里与contextId一致,不能写成name(FeignClientFactoryBean#configureFeign)# 不能写成 client-b (微服务名称),否则不生效helloFeignClient: # contextIdconnectTimeout: 50000 # 连接超时时间readTimeout: 50000 # 读超时时间loggerLevel: full #配置Feign的日志级别#default:# 其他默认配置
    
  2. feign 全局默认配置
    feign:client:config:default:connectTimeout: 50000 # 连接超时时间readTimeout: 50000 # 读超时时间loggerLevel: full #配置Feign的日志级别
    
  3. feign开启gzip支持
    feign:compression:request:enabled: truemime-types: "text/xml, application/xml, application/json"min-request-size: 2048response:enabled: true # 配置相应GZIP压缩
    

开启gzip支持后接口调用处理(方式一)

  1. feign接口使用ResponseEntity<byte []>接收数据
    @FeignClient(contextId = "testFeignClient", name = "client-a")
    public interface TestFeignClient {@GetMapping(value = "/userInfo")ResponseEntity<byte []> userInfoCompress(@RequestParam("username") String username, @RequestParam("address") String address) ;
    }
    
  2. 编写单元测试(注意需要对byte[] 数组使用Gzip解压)
    @Slf4j
    public class TestFeignClientTest extends BaseJunitTest {@Autowiredprivate TestFeignClient testFeignClient ;@Testpublic void userInfoCompress() throws IOException {String username = "张三" ;String address = "北京" ;ResponseEntity<byte[]> responseEntity = testFeignClient.userInfoCompress(username, address);byte[] compressed = responseEntity.getBody();String decompressValue = GzipUtils.decompress(compressed);log.info("value : {}", decompressValue);}
    }
    
  3. 编写gzip解压缩工具类
    public final class GzipUtils {public static String decompress(byte [] compressed) throws IOException {final StringBuilder output = new StringBuilder() ;try(GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(compressed));BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gis, StandardCharsets.UTF_8))){String line ;while ((line = bufferedReader.readLine()) != null){output.append(line) ;}return output.toString() ;}}
    }
    

开启gzip支持后接口调用处理(方式二)

  1. 编写Decoder (内部使用方式一的Gzip解压缩工具类GzipUtils)
    public class FeignResponseDecoder implements Decoder {private final Decoder delegate;public FeignResponseDecoder(Decoder delegate) {Objects.requireNonNull(delegate, "Decoder must not be null. ");this.delegate = delegate;}@Overridepublic Object decode(Response response, Type type) throws IOException {Collection<String> values = response.headers().get(HttpEncoding.CONTENT_ENCODING_HEADER);if (Objects.nonNull(values) && !values.isEmpty() && values.contains(HttpEncoding.GZIP_ENCODING)) {byte[] compressed = Util.toByteArray(response.body().asInputStream());if ((compressed == null) || (compressed.length == 0)) {return delegate.decode(response, type);}//decompression part//after decompress we are delegating the decompressed response to default//decoderif (isCompressed(compressed)) {String decompressValue = GzipUtils.decompress(compressed);Response decompressedResponse = response.toBuilder().body(decompressValue.getBytes()).build();return delegate.decode(decompressedResponse, type);} else {return delegate.decode(response, type);}} else {return delegate.decode(response, type);}}private static boolean isCompressed(final byte[] compressed) {return (compressed[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) && (compressed[1] == (byte) (GZIPInputStream.GZIP_MAGIC >> 8));}
    }
    
  2. 将Decoder加入到Spring容器管理
    @Configuration
    public class AppConfig{@Beanpublic Decoder GZIPResponseDecoder(ObjectFactory<HttpMessageConverters> messageConverters) {Decoder decoder = new FeignResponseDecoder(new SpringDecoder(messageConverters));return decoder;}
    }
    
  3. feign接口使用普通java对象接收数据
    @FeignClient(contextId = "testFeignClient", name = "client-a")
    public interface TestFeignClient {@GetMapping("/userInfo")UserInfoVO userInfo(@RequestParam("username") String username, @RequestParam("address") String address) ;
    }
    
  4. 编写单元测试
    @Slf4j
    public class TestFeignClientTest extends BaseJunitTest {@Autowiredprivate TestFeignClient testFeignClient ;@Testpublic void userInfo(){String username = "张三" ;String address = "北京" ;UserInfoVO userInfo = testFeignClient.userInfo(username, address);log.info("user info : {}", userInfo);}
    }
    

其他知识点补充

  1. SpringBoot服务提供者开启gizp压缩
    server:port: 7070compression:enabled: true
    
http://www.lryc.cn/news/42644.html

相关文章:

  • 【Pytorch】利用PyTorch实现图像识别
  • 在家查找下载最新《柳叶刀》The Lancet期刊文献的方法
  • 当下的网络安全行业前景到底怎么样?还能否入行?
  • SpringCloud:SpringAMQP介绍
  • 第十三届蓝桥杯省赛 python B组复盘
  • SQL注入之HTTP请求头注入
  • Metasploit详细教程
  • 【ChatGPT】Notion AI 从注册到体验:如何免费使用
  • 每个开发人员都需要掌握的10 个基本 SQL 命令
  • Vue项目预渲染
  • 可别再用BeanUtils了(性能拉胯),试试这款转换神器
  • Transformer 杂记
  • 实现异步的8种方式
  • Github隐藏功能显示自己的README,个人化你的Github主页
  • 单片机 | 51单片机原理
  • (只需五步)注册谷歌账号详细步骤,解决“此电话号码无法验证”问题
  • ChatGPT使用介绍、ChatGPT+编程、相关组件和插件记录
  • linux系统中复制粘贴和头文件问题解决方案
  • Vue项目实战 —— 后台管理系统( pc端 ) —— Pro最终版本
  • Springboot+vue开发的图书借阅管理系统项目源码下载-P0029
  • 学习 Python 之 Pygame 开发魂斗罗(十三)
  • 指针进阶(中)
  • C/C++获取文件名的方法(__FILE__,__builtin_FILE(),__BASE_FILE__)
  • 线程池的讲解和实现
  • linux编程──gcc和clang
  • 字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...
  • 5.多线程学习
  • 数据结构中的堆
  • Linux内核设备信息集合
  • 若依框架---权限管理设计