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

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(