【深入浅出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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick