【深入浅出SpringCloud源码探究】「Netflix系列之Ribbon+Fegin」微服务化的负载均衡组件源码剖析与实战开发全流程(Fegin篇)

本文主要是介绍【深入浅出SpringCloud源码探究】「Netflix系列之Ribbon+Fegin」微服务化的负载均衡组件源码剖析与实战开发全流程(Fegin篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微服务化的负载均衡组件源码剖析与实战开发全流程

  • 什么是Feign
  • Maven依赖引入
  • 让调用更轻松
  • 使用介绍
    • 在启动类上面增加配置
    • 定义Fegin调研方法请求类以及方法
      • @PathVariable注解
    • 定义调用方法
      • @RequestParam注解
        • 没有使用@RequestParam注解的情况下
        • 有@RequestParam 注解的情况下
          • 不指定value属性
            • 示例代码如下
          • 指定value属性
  • Feign的默认配置
    • 编码器和解码器
      • 编码器
      • 解码器
    • 自定义配置
      • 配置FeignClient的指定配置信息
    • 日志配置
      • 开启压缩
      • 更多配置

什么是Feign

Feign是一种具备声明式和模板化特性的高级HTTP客户端。在Spring Cloud中,Feign提供了一种简洁、直观的编码体验,使得远程服务调用就像调用本地方法一样简单。它允许开发者无需关注底层的HTTP请求细节。

Feign的设计灵感来自于Retrofit、JAXRS-2.0和WebSocket等优秀的HTTP客户端框架。它以提供更加便捷的方式来编写Java的HTTP客户端为目标,通过最小的代码量和资源开销实现与HTTP API的交互。

Maven依赖引入

在使用Feign时,可以通过在Maven项目的pom.xml文件中添加相应的依赖来引入Feign。以下是Feign的Maven依赖引入示例:

<dependencies>    <!-- Feign 相关依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
</dependencies>

在上述示例中,通过将spring-cloud-starter-openfeign添加到dependencies节点下,您就可以引入Feign的Maven依赖。这个依赖是Spring Cloud框架中用于支持Feign的模块。此外,里面的 jar 包含有 spring-cloud-starter-Ribbon,是基于 Ribbon 来实现的

注意,您需要确保您的项目中已经引入了Spring Cloud相关的依赖,并将其与Feign的依赖一起添加到项目中。同时,根据您的实际需要,您可能还需要添加其他相关的依赖,例如Spring Boot等

让调用更轻松

通过使用Feign提供的特性,我们可以为每个微服务创建一个自定义的API工程,并使用Maven将此API工程引入到其他调用者项目中。这样一来,调用者在调用远程服务时就可以像调用本地方法一样简单,无需关心实际的REST接口。

使用介绍

在使用Feign时,可以通过在Spring Boot应用程序的主类上添加注解@EnableFeignClients来开启Feign注解的功能。

@EnableFeignClients注解的作用是启用Feign相关的注解处理器,以便在定义Feign客户端接口时使用Feign提供的注解。通过使用这个注解,可以方便地将Feign客户端与实际的服务提供者进行关联,并在进行远程服务调用时得到Feign的支持。

在启动类上面增加配置

为了让Spring能够正确扫描到使用@FeignClient注解的类,可以通过设置@EnableFeignClients注解的basePackages属性来指定需要扫描的包名。这样,Spring将会在指定的包及其子包中查找Feign客户端接口,并进行相应的处理。

示例代码如下:

@SpringBootApplication
@EnableFeignClients((basePackages = "com.xxx.xx")
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

注意,basePackages属性可以设置为一个字符串数组,以同时指定多个包名。这样有助于更灵活地管理Feign客户端接口的扫描范围

定义Fegin调研方法请求类以及方法

Spring将会正确识别带有@FeignClient注解的接口,并将其注册为Feign客户端,使得您可以在应用程序中使用Feign进行远程服务调用。

@FeignClient(value = "spring-cloud-provider")
public interface FeginClientTest {/*** @return*/@RequestMapping(value = "/api/test/{id}", method = RequestMethod.GET)String test(@PathVariable(value = "id") int id);
}

@PathVariable注解

使用@PathVariable注解时,必须要在注解中定义value或name属性,以指定路径变量的名称。例如,可以使用@PathVariable(value = “id”)或@PathVariable(name = “id”)来标识路径变量为"id"。

@RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET)
String test(@PathVariable(name = "id") int id);

定义调用方法


@RestController
@RequestMapping(value = "/feign/user", method = RequestMethod.POST)
public class FeignUserController {@Autowiredprivate FeginClientTest  testClient;@RequestMapping(value = "/{id}", method = RequestMethod.GET)public String get(@PathVariable(value = "id") int id) {return testClient.test(id);}
}

@RequestParam注解

没有使用@RequestParam注解的情况下

Spring MVC会根据请求类型自动进行参数绑定。如果请求类型为GET,那么参数将会通过查询字符串的形式进行传递。如果请求类型为POST,那么参数将会通过请求体的形式进行传递,并且会以JSON的格式进行转换。

当在方法参数上没有使用@RequestParam注解时,默认情况下请求类型将被视为POST(即使指定为GET),并且请求的数据将使用Jackson转换为JSON并放置在请求体中。在这种情况下,方法只能接受一个没有带注解的参数。

@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET)
User get1(@PathVariable(value = "id") int id, String name);
@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET)
User get2(@PathVariable(value = "id") int id, Map<String, Object> name);

注意:当方法参数没有使用@RequestParam注解时,默认情况下请求类型被处理为POST,即使在方法上指定为GET。同时,请求数据被解析为JSON格式,并使用Jackson库进行转换,然后放置在请求体中。然而,这种默认行为只适用于单个非注解参数的情况下,其他参数需要通过注解的方式进行明确指定。

有@RequestParam 注解的情况下

在使用@RequestParam注解时,如果不指定value属性,那么参数必须以Map的形式提供。这样,参数会被转换为键值对的形式,并将其添加到请求的URL中作为查询参数。而如果指定了value属性,那么参数将按照指定的value值进行传递。

不指定value属性

如果没有指定@RequestParam注解的value属性,那么方法参数必须使用Map类型来接收参数。参数将以键值对的形式进行提供,并将其添加到请求URL中作为查询参数。

示例代码如下
@GetMapping("/users")
public String getUsers(@RequestParam Map<String, String> params) {}

在上述示例中,参数params将会接收所有的查询参数,并以键值对的形式提供给方法进行处理。

指定value属性

如果指定了@RequestParam注解的value属性,那么参数将按照指定的value值进行传递。参数将以指定的value作为名称进行传递,而不会使用键值对的形式。

@GetMapping("/users")
public String getUsers(@RequestParam(value = "name") String userName, @RequestParam(value = "age") int userAge) {}

在上述示例中,通过指定@RequestParam注解的value属性,明确了每个参数的名称。当请求"/users?name=John&age=25"。

Feign的默认配置

Spring Cloud Netflix 提供的默认实现类:FeignClientsConfiguration
在这里插入图片描述

编码器和解码器

编码器的作用是将方法参数对象序列化为请求参数,并将其放置到HTTP请求中;解码器的作用是将HTTP响应的数据反序列化为Java对象。

编码器

编码器是在客户端将方法参数对象转换为HTTP请求参数时使用的工具。它将方法参数对象序列化为某种特定格式的数据,例如JSON或XML,并将其放置到HTTP请求中作为请求参数。这样,当客户端发起HTTP请求时,编码器将负责将方法参数对象转换为适合在请求中传递的格式,并将其发送到服务器。

解码器

解码器是在客户端接收到HTTP响应时使用的工具,它将HTTP响应体中的数据反序列化为Java对象。这个过程通常涉及将JSON、XML或其他格式的数据转换为相应的Java对象,以便在客户端的应用程序中进行处理和使用。解码器的主要目标是将HTTP响应数据转换为可操作的Java对象,以便于进一步处理和分析。

自定义配置

@Configuration
public class RcFeignConfiguration {}

配置FeignClient的指定配置信息

@FeignClient(value = "test-app", configuration = RcFeignConfiguration.class)

日志配置

日志配置默认情况下不会打印任何日志信息。

logging.level.com.xxx.xxx.xxx.TestServer=debug

若需启用Feign的详细日志,需在配置类中添加以下代码:

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfig {@Beanpublic Logger.Level feignLoggerLevel() {return feign.Logger.Level.FULL;}
}

上述配置中,将Feign客户端的日志级别设置为FULL,以便在日志中显示详细的请求和响应信息。这对于调试和排查问题时非常有帮助。## 支持压缩

开启压缩

feign.compression.request.enabled=true
feign.compression.response.enabled=true
  • feign.compression.request.enabled=true: 这个设置表明Feign客户端启用了请求压缩功能。当发送请求时,Feign会对请求进行压缩以减小数据的大小。
  • feign.compression.response.enabled=true: 这个设置表明Feign客户端启用了响应压缩功能。当接收到来自服务端的响应时,Feign会对响应数据进行压缩,以减小网络传输的数据量。

更多配置

  • feign.compression.request.mime-types: 这个配置指定了需要进行请求压缩的MIME类型。只有当请求的MIME类型与此配置匹配时,Feign才会对请求进行压缩。在这个示例中,指定了text/xml、application/xml和application/json这三种MIME类型会被压缩。
  • feign.compression.request.min-request-size: 这个配置指定了请求数据的最小大小。如果请求数据的大小小于该值,Feign将不会对其进行压缩。在这个示例中,设置最小请求大小为2048字节,即2KB,意味着只有请求数据大于等于2KB时,才会进行压缩。
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048

通过这些配置,可以有效减小请求和响应的数据大小,提升网络传输的效率,减少网络带宽的占用,同时服务端也需要支持压缩功能,并且按照相应的设置进行配置,以便正确地解压缩请求和压缩响应。

这篇关于【深入浅出SpringCloud源码探究】「Netflix系列之Ribbon+Fegin」微服务化的负载均衡组件源码剖析与实战开发全流程(Fegin篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/563146

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2