四.声明式REST客户端Fegin

目录

1. 概念

2. 使用方法

2.1⬇️ 添加依赖

2.2⬇️ 启动类加注释

2.3⬇️ 添加接口

2.4▶️ 调用接口

3. 日志配置

3.1 全局配置

3.1.1 配置文件的方式

3.1.2 配置类的方式

3.2 局部配置

3.2.1 配置类的方式

a.配置类去掉@configuration注解

b.在Feign接口的@FeignClient注解中指定使用配置类

3.2.2 配置文件方式

a.去掉Feign接口中的configuration属性

b.配置文件中指定要调用的微服务名

4. 超时时间配置

4.1 配置文件的形式

4.1.1 全局配置

4.1.2 局部配置

4.2 配置类的形式

5. 性能调优

5.1 客户端组件配置

5.1.1 httpClient

1.pom

2.配置文件

5.2 GZIP压缩配置

局部配置,只是针对服务于服务之间

全局配置,不仅服务和服务之间会压缩,客户端也会压缩(查看响应头)

6. 多参数请求构造

6.1. Feign构造多参数Get请求

6.1.1. 当服务提供者的参数为对象时

6.1.1.1. 属性较少

6.1.1.2. 属性较多

6.1.2. 当服务提供者的参数为多个不同的参数时

6.2. Feign构造多参数Post请求


1. 概念

作为Spring Cloud的子项目之一,SpringCloud OpenFeign是一种声明式,模板化的HTTP客户端,在SpringCloud中使用OpenFeign,可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求,同时OpenFeign通过集成Ribbon实现客户端的负载均衡

Feign是Spring Cloud最好的HttpClient

Feign和OpenFeign的区别

Feign

OpenFeign

Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。

OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-feign</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-openfeign</artifactId>

</dependency>

2. 使用方法

2.1⬇️ 添加依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2⬇️ 启动类加注释

在项目的启动类上加@EnableFeignClients注解

2.3⬇️ 添加接口

需要注意:

在OpenFeign中虽然支持SpringMvc的注解,但是用户体验并没有达到原生SpringMvc注解的高度,所以注解中有一部分的属性是不能省略的;例如此处的@PathVariable注解,在原生注解中,被标注的属性名如果和注解中的一致,则可以不在注解中特意标明,但在OpenFeign中,无论是否一致,都需标明,否则运行报错

2.4▶️ 调用接口

注意,接口中的方法名是可以和远程调用的方法名不同的,但是返回值,参数类型和数量,还有请求类型路径都是必须一样

3. 日志配置

3.1 全局配置

3.1.1 配置文件的方式

做完后,可将其转移至Nacos的配置中心去

3.1.2 配置类的方式

@Configuration
public class FeignConfiguration {
    @Bean
    Logger.Level feignLoggerLevel(){
        return  Logger.Level.FULL;
    }
}

配置类打完后,配置文件中还是需要添加以下配置信息:

3.2 局部配置

3.2.1 配置类的方式

a.配置类去掉@configuration注解

b.在Feign接口的@FeignClient注解中指定使用配置类

3.2.2 配置文件方式

a.去掉Feign接口中的configuration属性

b.配置文件中指定要调用的微服务名

4. 超时时间配置

在OpenFeign中,默认是1秒钟超时(即从发送远程调用开始,到读取数据返回的过程)

测试:修改服务提供者的接口,加入TimeUnit.SECONDS.sleep(2L);测试异常

解决方式:

4.1 配置文件的形式

4.1.1 全局配置

feign:
  client:
    config:
      default:
      	#连接时间为1秒钟
        connectTimeout: 1000
        #读取数据5秒钟
        readTimeout: 5000

4.1.2 局部配置

局部的优先级是比全局高的,因此可以在配置完全局后,再给特定的微服务配置

feign:
  client:
    config:
    	#将default修改为微服务名称
      user-service:
      	#连接时间为1秒钟
        connectTimeout: 1000
        #读取数据5秒钟
        readTimeout: 5000

4.2 配置类的形式

配置类的全局配置和局部配置与上面的日志配置方式基本相同,这里就不在阐述

5. 性能调优

5.1 客户端组件配置

Feign中默认使用JDK原生的URLConnection发送HTTP请求,我们可以集成别的组件来替换掉URLConnection;

这里主要是涉及到Feign的性能优化问题,因为URLConnection不支持连接池,因此性能低于RestTemplate

如果加入连接池,性能可以提升15%左右.

5.1.1 httpClient

1.pom
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-httpclient</artifactId>
</dependency>
2.配置文件
feign:
  httpclient:
    enabled: true
    #feign的最大连接数
    max-connections: 200
    #feign单个路径的最大连接数
    max-connections-per-route: 50

如果性能提升后还是不能满足高并发的要求,则不使用OpenFeign,使用RestTemplate来进行远程调用

5.2 GZIP压缩配置

前后端分离的项目中,当传输的数据非常大的时候,使用JSON数据就会影响性能,所以就可以使用GZIP进行数据压缩进行性能调优

局部配置,只是针对服务于服务之间

feign:
  compression:
    request:
      #启用请求压缩
      enabled: true
      #指定应用请求压缩的MIME类型
      mime-types: text/xml,application/xml,application/json
      #压缩请求的最小大小阈值,如果请求大小小于此阈值,则不会进行压缩
      min-request-size: 2048
    response:
      #启用响应压缩
      enabled: true

全局配置,不仅服务和服务之间会压缩,客户端也会压缩(查看响应头)

server:
  compression:
    enabled: true
    #指定应用请求压缩的MIME类型
    mime-types: text/xml,application/xml,application/json
    #压缩请求的最小大小阈值,如果请求大小小于此阈值,则不会进行压缩
    min-request-size: 2048
   

6. 多参数请求构造

6.1. Feign构造多参数Get请求

当服务提供者的Get风格方法有多个参数时,Feign应该如何传递参数?

6.1.1. 当服务提供者的参数为对象时

6.1.1.1. 属性较少

Feign接口:

服务提供者:

@RequestParam中指定的属性名必须和服务提供者中实体类的属性名相同

6.1.1.2. 属性较多

当需要传递的参数很多时,在Feign接口中使用@RequestParam注解一个个标注参数太过于臃肿,因此也可以使用Map集合传递参数

Feign接口:

服务提供者:

与上面大同小异,Map集合中,值的key必须和服务提供者中实体类的属性名相同

6.1.2. 当服务提供者的参数为多个不同的参数时

第一种方法就是使用@RequestParam注解对应服务提供者的方法参数一个个标注,这种方法太过于简单,这里就不在阐述

第二种方法,其实和6.1.1中描述的大差不差,也是使用Map集合传递参数;Map集合中,属性的key值必须和服务提供者方法中的参数名相同

Feign接口:

服务提供者接口:

6.2. Feign构造多参数Post请求

Post请求的参数传递相对来说就方便许多,可以直接传递对象,当服务提供者的参数为对象时,Feign接口的参数传递如下:

多个参数的时候,Feign接口的参数传递如下:

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值