SpringBoot 使用 Feign 无废话 All-in-one 指南

这篇具有很好参考价值的文章主要介绍了SpringBoot 使用 Feign 无废话 All-in-one 指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开篇

Feign 是声明式、模板化的 HTTP 客户端, 可以帮助我们更快捷、优雅地调用 HTTP API;Spring Cloud 为 Feign 添加了 Spring MVC 的注解支持,并整合了 Ribbon 和 Eureka 来为使用 Feign 时提供负载均衡;在 Spring Cloud 中使用 Feign 是非常容易的。

本篇主要介绍 SpringBoot 中要玩转 Feign 需要掌握的如添加 pom 依赖、客户端注解启用、切换底层 HttpClient、配置数据压缩、调整日志级别、定制配置、配置的优先级机制、增加拦截器以及拦截器的追加机制等知识。

一、使用 Feign 的示例

1.1 添加依赖

<dependencies>
  <!--openfein的依赖-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
      <version>2.1.3.RELEASE</version>
  </dependency>
</dependencies>
复制代码

1.2 启用 Feign

在 SpringBoot 的启用类上添加注解@EnableFeignClients@EnableFeignClients用于开启 Feign,会自动扫描@FeignClient标注的 FeignClient 接口。

@SpringBootApplication
@EnableFeignClients
@EnableWeb
public class FeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class,args);
    }
}
复制代码

1.3 编写 FeignClient 接口

@FeignClient(
        name = "demo-service",
        url = "http://localhost:8080/feign/server/",
        configuration = FeignInterceptor.class,
        fallback = TestService.DefaultFallback.class
)
public interface TestService {

    @RequestMapping(value = "/getError/{id}", method = RequestMethod.GET)
    public String getError(@RequestParam("id") Integer id);


    @RequestMapping(value = "/get1", method = RequestMethod.GET)
    public String get1();

    @RequestMapping(value = "/get2/{param}", method = RequestMethod.GET)
    public String get2(@RequestParam("param") String param);

    @RequestMapping(value = "/post1", method = RequestMethod.POST)
    public FeignDemo post1(@RequestBody FeignDemo demo);
复制代码

1.4 编写对应的服务端

@RestController
@RequestMapping("/feign/server")
public class FeignServerController {

    @GetMapping("/get1")
    public String get1() {
        return "get1";
    }
    @GetMapping("/get2/{para}")
    public String get2(@PathVariable("para") String para){
        return para;
    }
    @PostMapping("/post1")
    public FeignDemo  post1(@RequestBody FeignDemo demo) {
        return demo;
    }
}
复制代码
public class FeignDemo {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "FeignDemo{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}
复制代码

1.5 调用 FeignClient

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {FeignApplication.class},webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("dev,feign")
public class FeignClientTest {

    @Autowired
    private TestService testService;

    @Test
    public void testFallback(){
        testService.getError(1);
    }
    @Test
    public void testGet1(){
        System.out.println(testService.get1());
        System.out.println(testService.get2("abc"));
        System.out.printf("..");
        FeignDemo feignDemo = new FeignDemo();
        feignDemo.setName("name");
        feignDemo.setAge(1);
        System.out.println(testService.post1(feignDemo));
    }

@Component
    public class DefaultFallback implements TestService {

        @Override
        public String getError(@RequestParam("id") Integer id){
            return "";
        }

        @Override
        public String get1() {
            return null;
        }

        @Override
        public String get2(String param) {
            return null;
        }

        @Override
        public FeignDemo post1(FeignDemo demo) {
            return null;
        }

    }
}
复制代码

二、如何切换 Client

Feign 中自带的是 HttpURLConnection,这个 client 健壮性差,可替换为成熟的 Apache HttpClient 或 OkHttp 来进行网络请求。

2.1 使用 Apache 的 HTTP Client

使用 Apache 的 httpclient 替换 Feign 中默认的 client。

2.1.1 添加依赖

<!--httpclient的依赖,因为选择了使用httpclient-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>10.4.0</version>
</dependency>
复制代码

2.1.2 配置启用

配置中添加如下信息,表示启用httpclient

feign:
  httpclient:
    enabled: true
复制代码

2.2 使用 OkHttp

2.2.1 添加依赖

在 Feign 中使用OkHttp作为网络请求框架,则只需要在 pom 文件中加上feign-okhttp的依赖,代码如下:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>10.2.0</version>
</dependency>
复制代码

2.2.2 配置启用

feign:
  okhttp:
    enabled: true
复制代码

三、如何修改日志级别

在发送和接收请求的时候,其内部将日志的打印输出定义成了四个等级,对应的详情如下:

级别 说明
NONE 不做任何记录
BASIC 仅记录请求方法和 URL 以及响应状态代码和执行时间
HEADERS 记录基本信息以及请求和响应标头
FULL 记录请求和响应的标题,正文和元数据

3.1 通过配置文件修改日志级别

注意需要指定接口的全限定名

logging:
  level:
    com.zto.titans.test.feign.service.TestService : DEBUG
复制代码

3.2 通过配置类修改日志级别

@Configuration
public class FooConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
复制代码

这个一看即懂,不再废话。

四、如何实现数据压缩

可以分别对 HTTP 通信的requestresponse设置是否启用 GZIP 压缩,配置方法如下:

feign:
    compression:
        request:
            enabled: true
            mime-types: text/xml,application/xml,application/json # 配置压缩支持的MIME TYPE
            min-request-size: 2048  # 配置压缩数据大小的下限
        response:
            enabled: true # 配置响应GZIP压缩
复制代码

五、FeignClient 的配置以及配置的优先级机制

有 2 种途径设置 FeignClient 的配置,通过自定义配置类来设置配置和在配置文件中设置,其中配置文件方式有点特殊,它里边可以指定全局配置对所有 FeignClient 有效,也可以为特定名称的 FeignClient 设置专属的配置。

5.1 通过自定义配置类来定制配置

实现一个配置类

public class TestConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
复制代码

将配置类 TestConfiguration 指定给configuration

@FeignClient(
        name = "test-service",
        configuration = {FeignInterceptor2.class,TestConfiguration.class}
)
复制代码

5.2 在配置文件中设置全局配置

feign.client.config.default.xxx ,这个default意为全局的配置属性。

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic
复制代码

5.3 在配置文件中设置专属配置

feign.client.config.feignName.xxx , 给名字为feignNameFeignClient指定专属的配置。

feign:
  client:
    config:
      feignName:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
        errorDecoder: com.example.SimpleErrorDecoder
        retryer: com.example.SimpleRetryer
        requestInterceptors:
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        decode404: false
        encoder: com.example.SimpleEncoder
        decoder: com.example.SimpleDecoder
复制代码

5.4 理解配置的优先级与拦截器的追加原则

org.springframework.cloud.openfeign.FeignClientFactoryBean#configureFeign中可以确认以上 3 种配置的优先级:

configureUsingConfiguration(context, builder); // 1
configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()),builder); //2
configureUsingProperties(properties.getConfig().get(this.contextId),builder);//3
复制代码
  1. 第 1 类为通过自定义配置类来指定配置
  2. 第 2 类为在配置文件中的feign.client.config.default.xxx设置全局配置
  3. 第 3 类为在配置文件中的feign.client.config.feignName.xxx设置专属配置

5.4.1 优先级的效果

配置文件里的专属配置 -覆盖-> 配置文件里的全局配置 -覆盖-> 配置类的配置

5.4.2 追加的原则

RequestInterceptor 是拦截器,可以在发送前做一些处理,比如统一添加header信息。每一类中的requestInterceptors可以存储多个拦截器,拦截器并非覆盖的效果,而是链式追加的效果;从执行顺序来看优先级是:1 > 2 > 3,即先执行 配置类中指定的拦截器,然后是 配置文件中指定的全局拦截器,最后是配置文件中指定的专属拦截器

需特别注意:RequestInterceptor 的实现类(例如 RI-A,RI-B)上如果添加了@Component注解,就都会被扫描识别到,并被追加到第一类的requestInterceptors列表中;倘若不小心 RI-A 还在第 2 类中又被指定了,则还会将拦截器 RI-A 追加在第二类的requestInterceptors列表中,结果是会 RI-A 总计会执行 2 次;若也在第三类中指定 RI-A,则 RI-A 也在其列表中追加,结果是 RI-A 总计会执行 3 次。

5.4.3 拦截器的效果验证

以一个实例来验证说明效果

  • 自定义三个 RequestInterceptor
class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("user", "myuser1");
        requestTemplate.header("password", "mypassword");
    }
}
复制代码
class FeignInterceptor1 implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("user1", "myuser1");
        requestTemplate.header("password1", "mypassword1");
    }
}
复制代码
class FeignInterceptor2 implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("user2", "myuser2");
        requestTemplate.header("password2", "mypassword2");
    }
}
复制代码
  • @FeignClient 中指定一个
@FeignClient(
        name = "test-service",
        url = "http://localhost:8080/feign/server/",
        configuration = {FeignInterceptor.class,TestConfiguration.class},
        fallback = TestService.DefaultFallback.class
)
复制代码
  • 配置中指定 2 个

default 指定了一个,test-service里指定一个

feign:
  httpclient:
    enabled: true
  okhttp:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        #loggerLevel: none
        requestInterceptors:
          - com.zto.titans.test.feign.service.FeignInterceptor1
      test-service:
        #loggerLevel: basic
        requestInterceptors:
          - com.zto.titans.test.feign.service.FeignInterceptor2
logging:
  level:
    com.zto.titans.test.feign.service.TestService : DEBUG
复制代码

根据追加逻辑,最终执行的顺序是:

  1. FeignInterceptor
  2. FeignInterceptor1
  3. FeignInterceptor2

总结

本篇主要介绍 SpringBoot 中要玩转 Feign 需要掌握的如添加 pom 依赖、客户端注解启用、切换底层 HttpClient、配置数据压缩、调整日志级别、定制配置、配置的优先级机制、增加拦截器以及拦截器的追加机制等知识,以实例 + 效果的方式帮读者高效全面并深入的理解它们。

最后说一句(请关注,莫错过)

如果这篇文章对您有帮助,或者有所启发的话,欢迎关注公众号【 架构染色 】进行交流和学习。您的支持是我坚持写作最大的动力。文章来源地址https://www.toymoban.com/news/detail-408387.html

到了这里,关于SpringBoot 使用 Feign 无废话 All-in-one 指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 群晖网络UPS服务器-PVE All In One使用UPS

    UPS只有一根USB数据连接线,但同时给两个硬件设备供电,目的是实现断电时两个硬件(三套系统)自动关机。 实现方案:USB直接连接的黑群晖1设置为服务器,将UPS的状态共享给运行在副NAS硬件上的黑群晖2和PVE,断电时黑群晖2和PVE也都能获取到电源状态,也自动关机。 群晖

    2024年04月25日
    浏览(42)
  • 机器人SLAM导航学习-All in one

    参考引用 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022. 本博客未详尽之处可自行查阅上述书籍 移动机器人激光SLAM导航(文章链接汇总) 1. ROS 入门必备知识 ROS学习笔记(文章链接汇总) 2. C++ 编程范式 《21天学通C++》读书笔记(文章链接汇总) 3. OpenCV 图像

    2024年02月16日
    浏览(40)
  • SD WebUI 扩展:prompt-all-in-one

    sd-webui-prompt-all-in-one 是一个基于 Stable Diffusion WebUI 的扩展,旨在提高提示词/反向提示词输入框的使用体验。它拥有更直观、强大的输入界面功能,它提供了自动翻译、历史记录和收藏等功能,它支持多种语言,满足不同用户的需求,尤其给英文不好但又想玩 AI 绘画的用户带

    2024年02月12日
    浏览(70)
  • 新一代分布式融合存储,数据场景All In One

            2023年5月11日,浪潮信息全国巡展广州站正式启航。会上,重磅发布新一代分布式融合存储AS13000G7,其采用极致融合架构设计理念,实现同一套存储满足四种非结构化数据的“All In One”高效融合,数据存力提升300%,IO性能提升100%;同时,实现四种非结构化协议无损

    2024年02月13日
    浏览(34)
  • 如何在 macOS 上进行 STM32 开发 All In One

    网上好多 STM32 的教学视频的开发环境都是基于 Windows 系统的,对 macOS 用户直接劝退了 在 Mac 上安装 虚拟机 ,在虚拟机中运行 Windows 系统 💩 VirtualBox / VMWare https://www.virtualbox.org/ https://www.vmware.com/sg.html 使用 STM 官方免费开发工具 STM32CubeIDE , 基于 Eclipse IDE ✅ (3 GB, 占用存储空

    2024年02月06日
    浏览(38)
  • Visual C++ Redistributable 一键安装All In One Runtimes

    老版本的程序需要在客户端安装低版本的VC运行库Visual Studio,但网上第三方找到的软件要么无法下载,要么版本低,或者要求付费,而且常常有病毒,或者根本就是垃圾广告。 因此从微软厂商下载,并编写了一个非常简单的脚本一键安装(右键以管理员方式安装)。可能版本不一

    2024年02月04日
    浏览(41)
  • 瓴羊发布All in One 产品,零售SaaS的尽头是DaaS?

    “打破烟囱、化繁为简,让丰富的能力、数据和智能All in One”,这是瓴羊新发布的产品瓴羊One承担的使命,也意味着瓴羊DaaS事业迈入了一个新阶段。 成立伊始,瓴羊就打出了“Not SaaS,But DaaS”旗号,将自己的产品“五朵云”定位为DaaS(Data intelligence as a Service)。如果说“

    2024年02月13日
    浏览(42)
  • Stable Diffusion - 提示词翻译插件 sd-webui-prompt-all-in-one

    欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131649921 sd-webui-prompt-all-in-one 是一个基于 stable-diffusion-webui 的扩展,目的是提高 提示词 / 反向提示词 输入框的使用体验,拥有更直观、强大的输入界面功能,提供了自动翻译、历史记录和收

    2024年02月16日
    浏览(56)
  • 值得收藏【Markdown】皇额娘级教你玩转vscode插件: Markdown All in One

    vscode Markdown All in One vscode中的Markdown All in One插件目前下载量:6,103,710,实力水平轻而易举的可以看出来了,相比于大名鼎鼎的Typora最大的良心优势就是free !free !free !对于穷苦人来说是极好的,赞~~~ 截至目前最新版本:v3.5.1 安装方式相对简单,如图操作1~4步: 安装完成之后状

    2024年02月04日
    浏览(60)
  • [环境配置]让sd自动翻译提示词插件sd-webui-prompt-all-in-one安装

    方式一(使用git克隆): 此方法需要你的电脑上安装了 git,如果没有安装,可参考 git 官方文档 进行安装。 打开终端,进入到你的  stable-diffusion-webui  目录下。  使用 git 克隆  sd-webui-prompt-all-in-one  到  stable-diffusion-webuiextensions  目录下。 如果你的终端没有访问Github的

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包