SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求
1. 回顾
上文讲解了手动创建Feign,比默认的使用更加灵活。
本文将讲解Feign对继承、压缩的支持以及日志和多参数请求的构造等。
2. Feign对继承的支持
Feign支持继承。使用继承,可将一些公共操作分组到一些父接口中,从而简化Feign的开发。
尽管Feign的继承可帮助我们进一步简化开发,但是Spring Cloud指出——通常情况下,
不建议服务器端和客户端之间共享接口,因为这种方式会造成服务器端和客户端代码的紧耦合。
并且,Feign本身并不使用Spring MVC的工作机制(方法参数映射不被继承)。
3. Feign对压缩的支持
在一些场景下,可能需要对请求或响应进行压缩,此时可使用启用Feign的压缩功能。
其中,feign.compression.request.mime-types 用于支持的媒体类型列表,默认是 text/xml,application/xml,application/json
feign.compression.request.min-request-size用于设置请求的最小阈值,默认是2048
4. Feign的日志
很多场景下,需要了解Feign处理请求的具体细节。
Feign对日志的处理非常灵活,可为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger。
默认情况下,logger的名称是Feign接口的完整类名。需要注意的是,Feign的日志打印只会对DEBUG级别作出响应。
我们可为每个Feign客户端配置各自的Logger.Level对象,告诉Feign记录那些日志。Logger.Level的值有以下选择。
- NONE:不记录任何日志(默认值)
- BASIC:仅记录请求方法、URL、响应状态代码以及执行时间
- HEADERS:记录BASIC级别的基础上,记录请求和响应的header
- FULL:记录请求和响应的header,body和元数据
> 复制项目 microservice-consumer-movie-feign,将 ArtifactId 修改为 microservice-consumer-movie-feign-logging
> 创建Feign配置类
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.config;import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class FeignLogConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}}
> 修改Feign的接口,指定其配置类
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;@FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient {@GetMapping(value = "/{id}")User findById(@PathVariable("id") Long id);}
> 在 application.yml 中添加以下内容,指定Feign接口的日志级别为DEBUG(因为Feign的Logger.Level只对DEBUG级别作出响应)
logging:level:com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign.UserFeignClient: DEBUG # 将Feign接口的日志级别设置为DEBUG,因为Feign的Logger.Level只对DEBUG作出响应
> 启动 microservice-discovery-eureka
> 启动 microservice-provider-user
> 启动 microservice-consumer-movie-feign-logging
> 访问 http://localhost:8010/user/1,可在电影微服务的控制台看见如下内容
5. 使用Feign构造多参数请求
5.1 GET请求多参数的URL
http://localhost:8001/get?id=1&username=张三
> 最直观的方法,URL有几个参数,Feign接口就有几个参数
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam;@FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient {@GetMapping(value = "/get")User findUserByCondi(@RequestParam("id") Long id, @RequestParam("username") String username);}
> 使用 Map 构建。当目标URL参数非常多时,使用Map构建可简化Feign接口的编写
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam;import java.util.Map;@FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient {@GetMapping(value = "/get")User findUserByCondi(@RequestParam Map<String, Object> map);}
5.2 POST请求包含多个参数
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*;@FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient {@PostMapping(value = "/post")User findUserByCondi(@RequestBody User user);}
6. 总结
这几章讲解了Feign的相关知识。
下文将讲解使用Hystrix实现微服务的容错处理。敬请期待~~~
7. 参考
周立 --- 《Spring Cloud与Docker微服务架构与实战》
转载于:https://www.cnblogs.com/jinjiyese153/p/8664968.html
SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求相关推荐
- SpringCloud系列研究---Eureka服务消费Feign
转载自:https://www.cnblogs.com/chxuyuan/p/8358998.html SpringCloud系列研究---Eureka服务消费Feign 一.Feign简介 Feig ...
- J360-cloud SpringCloud系列二:服务发现Discovery Service
2019独角兽企业重金招聘Python工程师标准>>> j360开源博客之 ----------------------------------------------------- ...
- SpringCloud系列——Zuul 动态路由
前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...
- SpringCloud系列之Nacos+Dubbo+Seata应用篇
SpringCloud系列之Nacos+Dubbo+Seata应用篇 原文链接:https://www.cnblogs.com/chinaWu/p/13671620.html ---------- 源 ...
- SpringCloud 微信小程序授权登录 获取openId SessionKey【SpringCloud系列13】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 自我提升方法推荐:神奇的早起 早上 5:00 -5:20 起床刷牙 5:30-6:00 晨练(跑步.跳绳.骑自行车.打球等等) ...
- SpringCloud系列博客父工程xml依赖
SpringCloud系列博客父工程xml依赖 <?xml version="1.0" encoding="UTF-8"?><project ...
- Spring Cloud 2.x系列之Feign整合断路器监控Hystrix Dashboard
SVN多版本库环境的搭建 OAuth 2.0是什么?看这篇文章就够了. 前端 Java Python等资源合集大放送 Ribbon可以整合整合断路器监控Hystrix Dashboard,Feign也 ...
- SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】
阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...
- SpringCloud Gateway 通过redis实现限流【SpringCloud系列8】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCl ...
最新文章
- BlockChain:Scene application区块链场景应用集合
- 黑苹果找不到触控板_苹果App内测找不到苹果企业签名怎么办?
- 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
- 第三次学JAVA再学不好就吃翔(part22)--匿名对象
- python-pygame声音模块的使用
- 登录界面转换实现html,html5和css3登录注册表单界面切换动画
- Python机器学习:PCA与梯度上升:009人脸识别与特征脸(lfw_people数据集)
- UiAutomator喷射事件的源代码分析
- 1 shell备份数据库MYSQL案例
- C语言程序设计——学生学籍管理系统
- Visio 2016专业版 激活方式
- 24届大三日常实习字节(抖音)后端一面 面经
- shell遍历ip执行特定功能
- imo CEO乔月猛:我们是史上研发投入最大的创业团队
- Unity适配IOS刘海屏
- Mysql数据库备份和还原
- linux puppy 安装软件,请问 如何在puppy下安装linux程序?·[已解决]
- gcc编译-hal库-stm32f4xx串口IAP升级
- 使用Cisco-ISE做Radius 服务端
- 泉州师范学院计算机课程表,泉州师范学院课程表.doc
热门文章
- 对称加密 与 非对称加密
- windows server 2003 AD之FSMO角色
- 仓库码放要求_仓储管理的全流程SOP操作示范,你们公司仓库管理规范吗?
- thread.sleep是让哪个线程休眠_java多线程必看:java线程的生命周期
- java eden分配参数,JVM垃圾收集器与内存分配策略,
- java5错误_Error:java: 错误: 不支持发行版本 5
- 二分法求数组最大最小_JavaScript之如何求数组的最大值和最小值
- python 散点图点击链接图片_在Python和matplotlib中连接三维散点图中的两点
- 嵌入式开发有年龄限制吗_报名深圳成考有年龄限制吗?
- manual setting mysql_mysql 5.5配置