微服务Springcloud之Feign的基本使用

 更新时间:2023年03月29日 16:52:39   作者:JAVA贩卖机  
这篇文章主要介绍了微服务Springcloud之Feign的基本使用,Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解,需要的朋友可以参考下

前言

        当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下。

一、Feign概述

        Feign是Spring Cloud提供的声明式、模板化的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。

        Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解;Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果。

二、Feign入门

        注意:以下所有步骤实现的前提是需要在启动类上加入注解 @EnableFeignClients 主要是为开启feign接口扫描

1.创建服务提供者(provider)

导入依赖:

<!--Spring Cloud OpenFeign Starter -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

代码如下(示例):

        在服务提供者中调用servic层获取数据

//创建服务提供者
@RestController
@RequestMapping("/provider")
public class ProviderController {
	
	@Autowired
	private UserService userService;
 
	@RequestMapping("/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		return userService.getUserById(id);
	}
}

2.创建feign接口    

代码如下(示例):

        解释都放在了代码中,可以直接复制粘贴

/**
 * @FeignClient 一般采用服务名进行命名
 * name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
 * url: url一般用于调试,可以手动指定@FeignClient调用的地址
 *
 * @RequestMapping 主要用于feign框架拼接传递url,弥补了Ribbon的url需要手动拼接的缺陷
 * @PathVariable("id") 当路径为restful风格时路径传参方式
 * @RequestParam("id") 当路径为?id=250 时传参方式
 * @RequestBody User user 当路径为对象时采用的传参方式,(集合、数组等都属于对象)
 */
@FeignClient("feign-provider")
@RequestMapping("/provider")
public interface UserFeign {
 
    @RequestMapping("/getUserById/{id}")
    User getUserById(@PathVariable("id") Integer id);
 
    @RequestMapping("/deleteUserById")
    User deleteUserById(@RequestParam("id") Integer id);//?形式拼接参数,?id=250
 
    @RequestMapping("/addUser")
    User addUser(@RequestBody User user);//pojo--->json
}

3、创建服务消费者(consumer)

//服务消费者
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
 
    @Autowired
    private UserFeign userFeign;
 
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userFeign.getUserById(id);
    }
}

        application.yml文件

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.209.129:8848
  application:
    name: feign-consumer

三、Feign 原理

1、将feign接口的代理类扫描到Spring容器中:
        @EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,并把接口和代理类交给Spring的容器管理。
    2、为接口的方法创建RequestTemplate
        当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数)
    3、发出请求
        代理类会通过RequestTemplate创建Request,然后client(URLConnetct、HttpClient、OkHttp)使用Request发送请求

四、Feign优化

1、开启feign日志

feign日志级别

         在consumer的yml文件中加入以下代码

 
feign:
  client:
    config:
      feign-provider: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置
        loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger
 
#在application.yml中使用 logging.level.<Feign客户端对应的接口的全限定名> 的参数配置格式来开启指定客户端日志
logging:
  level:
    com.bjpowernode.feign: debug

随后启动测试:

        出现以下结果表示日志输出成功 

2、feign超时问题

        首先、Feign的负载均衡底层用的就是Ribbon,所以这里的请求超时配置其实就是配置Ribbon,当出现请求超时会出现以下报错。

注意 :当开启日志配置之后,feign超时问题不会出现报错情况。

        针对超时问题我们需要在之前的日志配置中加入以下内容

ConnectTimeout: 5000 #请求连接的超时时间

ReadTimeout: 5000 #请求处理的超时时间

3、http连接池

(1)、连接池介绍

        首先,我们知道HTTP连接需要经过三次握手,四次挥手的过程,这是很耗费性能的;所以HTTP连接池帮助我们节省了这一步。

        同时Feign的HTTP客户端支持三种框架:

        HttpURLConnection、HttpClient、OkHttp;默认是HttpURLConnection

(2)、连接池使用

         先引入依赖到公共接口工厂interfac,如果没有做公共接口就放入consumer

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

讲真的,其实这已经完成了,但是,我们还是要知道一下它的原理,否则显得太片面了

在配置文件中我们看到,连接池引入之后默认是开启的,所以我们就不用再写了

4、gzip压缩

压缩能力

        当 Gzip 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少 70%以上的文件大小。·

这个开启也是比较简单,只需要在consumer中yml文件中写入以下代码即可

此时在浏览器中就可以看到我们提供的压缩方式,和浏览器支持的压缩方式 

 到此这篇关于微服务Springcloud之Feign的基本使用的文章就介绍到这了,更多相关微服务Feign的基本使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 5个并发处理技巧代码示例

    5个并发处理技巧代码示例

    这篇文章主要介绍了5个并发处理技巧代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java如何处理数据成为树状结构

    Java如何处理数据成为树状结构

    这篇文章主要介绍了Java如何处理数据成为树状结构问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 如何解决Eclipse找不到或无法加载主类问题

    如何解决Eclipse找不到或无法加载主类问题

    这篇文章主要介绍了如何解决Eclipse找不到或无法加载主类问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • SpringBoot用多线程批量导入数据库实现方法

    SpringBoot用多线程批量导入数据库实现方法

    这篇文章主要介绍了SpringBoot用多线程批量导入数据库实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • java8中的HashMap原理详解

    java8中的HashMap原理详解

    这篇文章主要介绍了java8中的HashMap原理详解,HashMap是日常开发中非常常用的容器,HashMap实现了Map接口,底层的实现原理是哈希表,HashMap不是一个线程安全的容器,需要的朋友可以参考下
    2023-09-09
  • Spring 实现数据库读写分离的示例

    Spring 实现数据库读写分离的示例

    现在大型的电子商务系统,在数据库层面大都采用读写分离技术,我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力。
    2017-01-01
  • Springboot配置图片虚拟映射示例代码

    Springboot配置图片虚拟映射示例代码

    这篇文章主要给大家介绍了关于Springboot配置图片虚拟映射的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用springboot具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • 详解MyBatis直接执行SQL查询及数据批量插入

    详解MyBatis直接执行SQL查询及数据批量插入

    这篇文章主要介绍了MyBatis直接执行SQL查询及数据批量插入的相关知识,需要的朋友一起学习吧
    2016-01-01
  • java关于并发模型中的两种锁知识点详解

    java关于并发模型中的两种锁知识点详解

    在本篇文章了小编给大家整理的是一篇关于java关于并发模型中的两种锁知识点详解内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • SpringBoot自动装配原理详解

    SpringBoot自动装配原理详解

    这篇文章主要详细介绍了SpringBoot的自动装配原理,文中通过代码示例介绍的非常详细,需要的朋友可以参考一下
    2023-04-04

最新评论