Spring Cloud使用Feign进行远程调用的操作指南

 更新时间:2025年02月18日 10:01:41   作者:Dream_sky分享  
本文介绍了Feign作为声明式HTTP客户端在SpringCloud中的使用,从简介、对比RestTemplate的问题、使用步骤,到日志配置、性能优化和实际应用进行了详细讲解,包括如何通过Feign简化接口调用,以及解决启动时找不到FeignClient的问题,需要的朋友可以参考下

一、Feign简介

Feign官网:https://github.com/OpenFeign/feign

Fegin是声明式、模块化的Http客户端,可以帮助我们快捷优雅的调用HTTP接口。在SpringCloud中可以很方便的创建一个Feign客户端,只需声明一个接口,并加上对应的注解就能完成对HTTP接口的调用。

在这里插入图片描述

二、RestTemplate方式调用存在问题

可读性差,参数复杂难以维护

   //2远程查询用户信息
   String url="http://provider-server/provider/"+order.getUserId();
   
   //3. 发起调用
   User user = restTemplate.getForObject(url, User.class);

三、Feign的使用步骤

在服务消费者端添加如下

3.1 引入依赖

  <!-- 加入feign的依赖 -->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>

3.2 添加@EnableFeignClients注解

在启动类或者配置类添加

@EnableFeignClients

3.3 编写FeignClient接口

@FeignClient("provider-server")
public interface ProviderServeClient {
    /**
     * 根据id查询用户信息
     */
    @GetMapping("/provider/{id}")
    User queryById(@PathVariable("id") Long id);

}

  • 服务名称:provider-server
  • 请求路径:/provider/{id}
  • 请求方式:GET
  • 请求参数:Long id
  • 返回值类型:User

3.4 使用Feign客户端代用RestTemplate

    @Autowired
    private ProviderServeClient providerServeClient;

    /**
     * 根据id查询订单并返回
     */
    @Override
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);

        //2远程查询用户信息
//        String url="http://provider-server/provider/"+order.getUserId();
        //2. 发起调用
//        User user = restTemplate.getForObject(url, User.class);

        User user = providerServeClient.queryById(order.getUserId());

        //3. 存入order
        order.setUser(user);
        // 4.返回
        return order;
    }

启动调用成功

在这里插入图片描述

四、日志配置

4.1 日志级别介绍

在这里插入图片描述

1. NONE: 不记录任何日志信息,默认值

2. BASIC: 仅记录请求的方法,URL以及响应状态码和执行时间

3. HEADERS: 在BASIC的基础上,增加了请求和响应头信息

4. FULL: 记录所有请求和响应的明细,包括头信息,请求体,元数据

4.2 配置日志

方式一: 配置文件方式

全局配置

feign:
  client:
    config:
      default: # 全局的配置
        loggerLevel: BASIC 

局部配置

feign:
  client:
    config:
      provider-server: # 写服务名称,则针对某个微服务的配置
        loggerLevel: FULL

方式二: java代码方式

public class FeignClientConfiguration {
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC;
    }
}

全局配置,添加到@EnableFeignClients注解中

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

局部配置,添加到服务对应的@FeignClient注解中

@FeignClient(value = "provider-server",configuration = FeignClientConfiguration.class)

五、Feign的性能优化

Feign底层的客户端实现:

  1. URLConnection :默认实现,不支持连接池
  2. Apache HttpClient:支持连接池
  3. OKHttp : 支持链接池
  • 使用连接池代替默认的URLConnection
  • 日志级别最好使用BASIC或者NONE

引入依赖

        <!--httpClient的依赖 -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

配置连接池

  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 30 # 每个路径的最大连接数

六、Feign的实际应用

继承方式,给消费者的FeginClient和提供者的controller定义统一的父接口(不推荐)

缺点:

耦合度高参数无法继承

模块抽-----取将FeignClient抽取为独立模块,并把所有接口有关的配置都放到这个模块中,提供给所有消费者使用,这样就不用每个消费者都定义自己的Feign客户端,避免重复开发

抽取启动可能会报错如下:
ProviderServeClient没有找到

在这里插入图片描述

Description:

Field providerServeClient in com.xing.service.impl.ConsumerServiceImpl required a bean of type 'com.api.clients.ProviderServeClient' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)

原因:

  1. 启动类所在包:package com.xing
  2. fegin模块客户端所在包为:package com.api;
  3. Spring Boot启动默认扫描启动类所在包及其所有子包,而fegin客户端所在包没有扫描到,所以报错ProviderServeClient没有找到

解决方案:

指定FeignClient所在包

@EnableFeignClients(basePackages = "com.api")

指定FeignClient字节码

@EnableFeignClients(clients = {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->ProviderServeClient.class})

启动成功

在这里插入图片描述

测试接口调用成功

在这里插入图片描述

以上就是Spring Cloud使用Feign进行远程调用的操作指南的详细内容,更多关于Spring Cloud Feign远程调用的资料请关注脚本之家其它相关文章!

相关文章

  • 将Java项目打包成可执行的jar包

    将Java项目打包成可执行的jar包

    这篇文章主要介绍了将Java项目打包成可执行的jar包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java连接orcale数据库示例分享

    java连接orcale数据库示例分享

    这篇文章主要介绍了java连接orcale数据库示例,需要的朋友可以参考下
    2014-02-02
  • Spring Boot开启的2种方式详解

    Spring Boot开启的2种方式详解

    这篇文章主要介绍了Spring Boot开启的2种方式详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • SpringBoot+Redis+Lua防止IP重复防刷攻击的方法

    SpringBoot+Redis+Lua防止IP重复防刷攻击的方法

    本文主要介绍了SpringBoot+Redis+Lua防止IP重复防刷攻击的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • SpringBoot实现国际化过程详解

    SpringBoot实现国际化过程详解

    这篇文章主要介绍了SpringBoot实现国际化过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • IDEA快速搭建spring boot项目教程(Spring initializr)

    IDEA快速搭建spring boot项目教程(Spring initializr)

    这篇文章主要介绍了IDEA快速搭建spring boot项目教程(Spring initializr),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • JAVA基于静态数组实现栈的基本原理与用法详解

    JAVA基于静态数组实现栈的基本原理与用法详解

    这篇文章主要介绍了JAVA基于静态数组实现栈的基本原理与用法,结合实例形式详细分析了JAVA基于静态数组实现栈相关原理、用法与操作注意事项,需要的朋友可以参考下
    2020-03-03
  • java设计模式之简单工厂模式简述

    java设计模式之简单工厂模式简述

    这篇文章主要为大家详细介绍了java设计模式之简单工厂模式,简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • java并发编程死锁定义及如何避免死锁

    java并发编程死锁定义及如何避免死锁

    这篇文章主要为大家介绍了java并发编程中死锁的详细说明及如何避免死锁的方法,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Java中四种访问权限资料整理

    Java中四种访问权限资料整理

    这篇文章主要介绍了 Java中四种访问权限总结的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论