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对继承、压缩、日志的支持以及构造多参数请求相关推荐

  1. SpringCloud系列研究---Eureka服务消费Feign

    转载自:https://www.cnblogs.com/chxuyuan/p/8358998.html SpringCloud系列研究---Eureka服务消费Feign 一.Feign简介 Feig ...

  2. J360-cloud SpringCloud系列二:服务发现Discovery Service

    2019独角兽企业重金招聘Python工程师标准>>> j360开源博客之 ----------------------------------------------------- ...

  3. SpringCloud系列——Zuul 动态路由

    前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...

  4. SpringCloud系列之Nacos+Dubbo+Seata应用篇

    SpringCloud系列之Nacos+Dubbo+Seata应用篇 原文链接:https://www.cnblogs.com/chinaWu/p/13671620.html ---------- 源 ...

  5. SpringCloud 微信小程序授权登录 获取openId SessionKey【SpringCloud系列13】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 自我提升方法推荐:神奇的早起 早上 5:00 -5:20 起床刷牙 5:30-6:00 晨练(跑步.跳绳.骑自行车.打球等等) ...

  6. SpringCloud系列博客父工程xml依赖

    SpringCloud系列博客父工程xml依赖 <?xml version="1.0" encoding="UTF-8"?><project ...

  7. Spring Cloud 2.x系列之Feign整合断路器监控Hystrix Dashboard

    SVN多版本库环境的搭建 OAuth 2.0是什么?看这篇文章就够了. 前端 Java Python等资源合集大放送 Ribbon可以整合整合断路器监控Hystrix Dashboard,Feign也 ...

  8. SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】

    阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...

  9. SpringCloud Gateway 通过redis实现限流【SpringCloud系列8】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCl ...

最新文章

  1. BlockChain:Scene application区块链场景应用集合
  2. 黑苹果找不到触控板_苹果App内测找不到苹果企业签名怎么办?
  3. 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
  4. 第三次学JAVA再学不好就吃翔(part22)--匿名对象
  5. python-pygame声音模块的使用
  6. 登录界面转换实现html,html5和css3登录注册表单界面切换动画
  7. Python机器学习:PCA与梯度上升:009人脸识别与特征脸(lfw_people数据集)
  8. UiAutomator喷射事件的源代码分析
  9. 1 shell备份数据库MYSQL案例
  10. C语言程序设计——学生学籍管理系统
  11. Visio 2016专业版 激活方式
  12. 24届大三日常实习字节(抖音)后端一面 面经
  13. shell遍历ip执行特定功能
  14. imo CEO乔月猛:我们是史上研发投入最大的创业团队
  15. Unity适配IOS刘海屏
  16. Mysql数据库备份和还原
  17. linux puppy 安装软件,请问 如何在puppy下安装linux程序?·[已解决]
  18. gcc编译-hal库-stm32f4xx串口IAP升级
  19. 使用Cisco-ISE做Radius 服务端
  20. 泉州师范学院计算机课程表,泉州师范学院课程表.doc

热门文章

  1. 对称加密 与 非对称加密
  2. windows server 2003 AD之FSMO角色
  3. 仓库码放要求_仓储管理的全流程SOP操作示范,你们公司仓库管理规范吗?
  4. thread.sleep是让哪个线程休眠_java多线程必看:java线程的生命周期
  5. java eden分配参数,JVM垃圾收集器与内存分配策略,
  6. java5错误_Error:java: 错误: 不支持发行版本 5
  7. 二分法求数组最大最小_JavaScript之如何求数组的最大值和最小值
  8. python 散点图点击链接图片_在Python和matplotlib中连接三维散点图中的两点
  9. 嵌入式开发有年龄限制吗_报名深圳成考有年龄限制吗?
  10. manual setting mysql_mysql 5.5配置