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配置类

  1. package com.itmuch.cloud.microserviceconsumermoviefeignlogging.config;
  2.  
  3. import feign.Logger;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6.  
  7. @Configuration
  8. public class FeignLogConfiguration {
  9.  
  10. @Bean
  11. Logger.Level feignLoggerLevel() {
  12. return Logger.Level.FULL;
  13. }
  14.  
  15. }

  > 修改Feign的接口,指定其配置类

  1. package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;
  2.  
  3. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration;
  4. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User;
  5. import org.springframework.cloud.openfeign.FeignClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8.  
  9. @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class)
  10. public interface UserFeignClient {
  11.  
  12. @GetMapping(value = "/{id}")
  13. User findById(@PathVariable("id") Long id);
  14.  
  15. }

  > 在 application.yml 中添加以下内容,指定Feign接口的日志级别为DEBUG(因为Feign的Logger.Level只对DEBUG级别作出响应)

  1. logging:
  2. level:
  3. 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接口就有几个参数

  1. package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;
  2.  
  3. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration;
  4. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User;
  5. import org.springframework.cloud.openfeign.FeignClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9.  
  10. @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class)
  11. public interface UserFeignClient {
  12.  
  13. @GetMapping(value = "/get")
  14. User findUserByCondi(@RequestParam("id") Long id, @RequestParam("username") String username);
  15.  
  16. }

    > 使用 Map 构建。当目标URL参数非常多时,使用Map构建可简化Feign接口的编写

  1. package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;
  2.  
  3. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration;
  4. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User;
  5. import org.springframework.cloud.openfeign.FeignClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9.  
  10. import java.util.Map;
  11.  
  12. @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class)
  13. public interface UserFeignClient {
  14.  
  15. @GetMapping(value = "/get")
  16. User findUserByCondi(@RequestParam Map<String, Object> map);
  17.  
  18. }

  5.2 POST请求包含多个参数

  1. package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign;
  2.  
  3. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration;
  4. import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User;
  5. import org.springframework.cloud.openfeign.FeignClient;
  6. import org.springframework.web.bind.annotation.*;
  7.  
  8. @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class)
  9. public interface UserFeignClient {
  10.  
  11. @PostMapping(value = "/post")
  12. User findUserByCondi(@RequestBody User user);
  13.  
  14. }

6. 总结

  这几章讲解了Feign的相关知识。

  下文将讲解使用Hystrix实现微服务的容错处理。敬请期待~~~

7. 参考

  周立 --- 《Spring Cloud与Docker微服务架构与实战》

SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求的更多相关文章

  1. SpringCloud系列-利用Feign实现声明式服务调用

    上一篇文章<手把手带你利用Ribbon实现客户端的负载均衡>介绍了消费者通过Ribbon调用服务实现负载均衡的过程,里面所需要的参数需要在请求的URL中进行拼接,但是参数太多会导致拼接字符 ...

  2. springcloud系列五 feign远程调用服务

    一:Feign简介 Feign 是一种声明式.模板化的 HTTP 客户端,在 Spring Cloud 中使用 Feign,可以做到使用 HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完 ...

  3. 【SpringCloud构建微服务系列】Feign的使用详解

    一.简介 在微服务中,服务消费者需要请求服务生产者的接口进行消费,可以使用SpringBoot自带的RestTemplate或者HttpClient实现,但是都过于麻烦. 这时,就可以使用Feign了 ...

  4. SpringCloud系列十二:手动创建Feign

    1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...

  5. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  6. SpringCloud系列——Feign 服务调用

    前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...

  7. SpringCloud系列——Config 配置中心

    前言 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持.有了配置服务器,您就有了一个中心位置来管理跨所有环境的应用程序的外部属性.本文记录实现一个配置中心.客 ...

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

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

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

    目录 前言 项目版本 项目说明 Nacos服务 Seata服务 订单模块 支付模块 参考资料 系列文章 前言 本文接上篇文章<SpringCloud系列之Nacos+Dubbo应用篇>继续 ...

随机推荐

  1. hdu6086(AC 自动机)

    hdu6086 题意 字符串只由 \(01\) 组成,求长度为 \(2L\) 且包含给定的 \(n\) 个子串的字符串的个数(且要求字符串满足 \(s[i] \neq s[|s| - i + 1]\) ...

  2. HashSet如何排序

    方法一: 把HashSet保存在ArrayList里,再用Collections.sort()方法比較 private void doSort(){ final HashSet<Integer& ...

  3. 【计算几何】【状压dp】Codeforces Round #226 (Div. 2) D. Bear and Floodlight

    读懂题意发现是傻逼状压. 只要会向量旋转,以及直线求交点坐标就行了.(验证了我这俩板子都没毛病) 细节蛮多. #include<cstdio> #include<algorithm& ...

  4. 125.乘积最大(划分性DP)

    1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解 题目描述 Descriptio ...

  5. Spring的Aop 注解配置

    1,导包 2,准备目标对象 package com.songyan.anno; public interface UserService { void save(); void delete(); v ...

  6. yum出现的“UnicodeDecodeError: 'ascii' codec”问题解决

    新装了CentOS 6.5系统,打算使用yum安装程序是出现了如下错误: Loading mirror speeds from cached hostfile Traceback (most rece ...

  7. Delphi 设置时间格式

    // 设置WINDOWS系统的短日期的格式SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, 'yyyy-MM-dd'); Applicat ...

  8. 使用apt-mirror建立局域网内的Debian/Ubuntu源镜像

    转:http://forum.ubuntu.org.cn/viewtopic.php?t=41791 第一次翻译,翻译得不好还请大家见谅,多多指出错误~!:) 原文可以见如下的贴子:http://fo ...

  9. Web服务器在外网能裸奔多久?

      很多时候我们轻易地把Web服务器暴露在公网上,查看一下访问日志,可以看到会收到大量的攻击请求,这个是网站开通后几个小时收到的请求: 1.  探测服务器信息 在上线一分钟,收到OPTION请求探测. ...

  10. httpd 服务的两个节点的HA

    实验目的是:实现两个节点的http和nfs服务的HA集群. 实现条件:准备两个节点.node1,node2作为HA1,HA2提供集群服务.在node1和node2分别按照httpd服务.挂载nfs服务 ...