Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

news2024/11/18 3:32:31

目录

一、Feign 是什么,有什么用呢?

二、Feign 客户端的使用

2.1、远程调用

1.引入依赖

2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能

3.编写 Feign 客户端

4.通过 Feign 客户端发起远程调用

2.2、自定义 Feign 配置

1.配置文件方式

2.java代码方式

2.3、Feign 的性能优化

1.引入依赖

2.配置连接池

2.4、Feign 的最佳实践

1.方式一:给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。

2.方式二(推荐):将FeignClient抽取为独立模块,并且把接口有关的POJO(实体类)、默认的Feign配置都放到这个模块中,提供给所有消费者使用


一、Feign 是什么,有什么用呢?


以往我们是通过 RestTemplate 发起远程调用,如下

存在问题如下:

  • 代码可读性差,编程体验不统一
  • 参数复杂URL难以维护

Feign  是一个声明式的 http 客户端,其作用就是用来把我们解决上述问题的~

二、Feign 客户端的使用


2.1、远程调用

主要分为以下步骤:

1.引入依赖

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

2.order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能

3.编写 Feign 客户端

主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Component
@FeignClient("userservice")
public interface UserClients {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);

}

4.通过 Feign 客户端发起远程调用

用 Feign 来代替 RestTemplate 是不是十分优雅~

2.2、自定义 Feign 配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下

类型

作用

说明

feign.Logger.Level

修改日志级别

包含四种不同的级别:NONEBASICHEADERSFULL

feign.codec.Decoder

响应结果的解析器

http远程调用的结果做解析,例如解析json字符串为java对象

feign.codec.Encoder

请求参数编码

将请求参数编码,便于通过http请求发送

feign. Contract

支持的注解格式

默认是SpringMVC的注解

feign. Retryer

失败重试机制

请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

我们最常使用的就是 修改日志级别 ,其他的可以暂时不考虑~

配置Feign日志有以下两种方式:

1.配置文件方式

a、全局生效

feign:
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

b、局部生效

feign:
  client:
    config: 
      userservice: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

2.java代码方式

首先需要声明一个 Bean,如下

public class FeignClientConfiguration {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC;  //一般使用 BASIC 级别,因为太多的日志信息影响效率
    }
}

情况一:如果是全局配置,则把它放到@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class) 

情况二:如果是局部配置,则把它放到@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class) 

2.3、Feign 的性能优化

Feign 的底层客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此优化Feign的性能主要包括:

  1. 使用连接池代替默认的URLConnection
  2. 日志级别,最好用basic或none

因此使用 HttpClient 或 OKHttp 代替 URLConnection

1.引入依赖

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

2.配置连接池

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息 
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

2.4、Feign 的最佳实践

1.方式一:给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。

仔细观察我们可以发现, Feign 发起远程调用的接口和接收远程调用请求的 controller 层实现代码是一样的,因此,我们我可以把他们的共性提取出来,写成一个公开的接口,将来我们使用的时候只需要继承这个接口即可,如下图

 

 但这种方式存在一定的问题,以下是官方提出的问题:

也就是说

  • 服务紧耦合
  • 不适用于 Spring MVC (父接口参数列表中的映射不会被继承

2.方式二(推荐):FeignClient抽取为独立模块,并且把接口有关的POJO(实体类)、默认的Feign配置都放到这个模块中,提供给所有消费者使用

 具体步骤:

1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖

        <!--feign 客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

 


2.将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

 


3.在order-service中引入feign-api的依赖

 

4.修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

5.重启测试

这个时候你重启项目,项目必然会报以下错误

 

为什么 UserClients 没有对应的对象呢?

UserClients 之前有对象是因为扫描到 @FeignClient 注解注入了对象 ,而现在 order-service 扫描包的范围是启动类下的包,但由于我们刚刚把 UserClients 挪到了 feign-api 这个 Module 中,因此,扫描不到该注解,无法注入对象。

总而言之:当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。

有以下两种解决方式:

方式一:指定FeignClient所在包

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

这种方式会将指定包下的所有东西都拿过来。

方式二(推荐):指定FeignClient字节码

@EnableFeignClients(clients = {UserClient.class})

这种方式是精准打击,只拿指定的类,效率上更推荐使用,用哪个,就指定哪个.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

附件1.服务器操作系统安全加固要求及配置建议【上】

文章目录 加固文件说明【重启auditd服务后/etc/audit/audit.rules文件内容消失怎么处理】【用户的的本地登录和远程登录默认都会被审计&#xff1b; 2&#xff0c;可配置对chown、chmod、chcon等命令的执行进行审计&#xff1b;【ssh会话默认会被审计&#xff1b;】【可添加审计…

kafka入门用这一篇就够了!

目录 1&#xff0c;kafka简单介绍 2&#xff0c;kafka使用场景 3&#xff0c;kafka基本概念 kafka集群 数据冗余 分区的写入 读取分区数据 顺序消费 提交策略 零拷贝技术&#xff08;netty&#xff09; 1&#xff0c;kafka简单介绍 kafka是一款分布式、支持分区的、多…

3.springboot开发篇

SpringBoot开发实用篇 ​ KF-1.热部署 热部署是不用重启项目&#xff0c;项目自动更新 非springboot项目热部署实现原理 ​ 开发非springboot项目时&#xff0c;我们要制作一个web工程并通过tomcat启动&#xff0c;通常需要先安装tomcat服务器到磁盘中&#xff0c;开发的程序…

【openGauss数据库】--运维指南02-逻辑备份与恢复

【openGauss数据库】--运维指南02-逻辑备份与恢复 &#x1f53b; 一、 openGauss数据库备份与恢复概述&#x1f530; 1.1 备份与恢复类型&#x1f530; 1.2 类型对比 &#x1f53b; 二、 配置文件的备份与恢复&#x1f53b; 三、逻辑备份----gs_dump & gs_dumpall&#x1…

Uipath Excel 实战01-自动生成流水号最佳方法

Uipath RPA 自动生成流水号最佳方法&#xff0c;提高RPA 性能&#xff0c;速度毫秒级。通过本案例将学会Excel 写入单元格、Excel 自动填充公式、Excel 自动调整列范围、保存Excel 文件以及使用Excel 函数。 公式参考&#xff1a; Excel公式参考&#xff1a; Excel CONCATENAT…

动态规划——地下城游戏

题目链接 leetcode在线oj题——地下城游戏 题目描述 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健…

chatgpt赋能python:线上免费Python教程推荐

线上免费Python教程推荐 Python作为一门简单易学的编程语言&#xff0c;在各个行业和领域都越来越受欢迎。很多人想学Python&#xff0c;但是可能因为费用等问题而卡住了。今天&#xff0c;我们来介绍一些免费的Python教程&#xff0c;帮助那些想要学习Python但没有预算的人。…

上手vue2的学习笔记2之安装vue的踩坑经历

上一篇笔记 上手vue2的学习笔记1之了解前端三剑客&#xff0c;简单介绍了学习vue框架之前应该具备的基础知识和四个我认为非常有用的学习链接&#xff0c;建议大家动手实践一下&#xff0c;更多深刻的理解前端三剑客之间的关系。 这一篇笔记主要介绍我在安装vue过程中遇到的坑…

华为FIT痩AP旁挂式隧道组网实验(一)

拓扑图 实验设备型号ACAC6005S1S5700S2S3700APAP2050DNAP4AP2050DNAR1AR200 没有配置好之前,是没有这个AP范围圈的 配置流程 接入交换机创建VLAN,配置对应端口的链路类型,放行vlan,开启端口隔离 # 与AP连接的接口(0/0/2) [S2]vlan batch 100 101 [S2]int e0/0/2 [S2-Ethern…

Android中关于SharedPreference参数的问题

文章目录 一、前言二、问题背景三、问题定位四、问题解决 一、前言 在上周开发时遇到一个问题&#xff0c;记录一下&#xff1a; 首先描述一下应用场景&#xff1a; 使用sharedPreference进行存储&#xff0c;命名为a.xml&#xff0c;这里简称为a文件有两个服务&#xff0c;一…

海思nnie 部署环境 搭建流程

文章目录 在windows上安装 Ruyi studio 软件MinG-64 安装运行软件在windows上安装 Ruyi studio 软件 Hi3559A的资料包 链接:https://pan.baidu.com/s/1rQcXvLW6ruSxIs4C9cMSCg 提取码:zsq5 从百度网盘下载软件 有很多个版本, 这里我选择的是SVP_PC.part2的版本 解压后得到:…

[爬虫]解决机票网站文本混淆问题-实战讲解

前言 最近有遇到很多小伙伴私信向我求助&#xff0c;遇到的问题基本上都是关于文本混淆或者是字体反爬的问题。今天给大家带来其中一个小伙伴的实际案例给大家讲讲解决方法 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 ​​ 个人推荐python学习系列&#xff1a; ☄️爬虫J…

YOLOv8训练和预测

目录 1.源码下载 2.环境配置 3. 数据集准备 4.训练配置 5.训练时遇到的错误 1.源码下载 GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > CoreML > TFLite 2.环境配置 运行环境需要的包和YOLOv5/v7一样&#xff0c;这里不…

C语言:移位操作注意事项

移位操作&#xff1a;因为操作符的原因&#xff0c;注意加括号。还有没必要在移位的时候进行&#xff08;uint32_t&#xff09;转换。 测试程序如下&#xff1a; #include <string.h> #include <stdlib.h> #include <stdio.h> #include <stdint.h>i…

javaweb学习3

javascript入门 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript"> // <!-- 可以在head和body嵌入script执行顺序从上而…

KEIL5-MDK配色方案

改字体 复制如下代码&#xff0c;替换原有文件内容 global.prop文件&#xff1a;D:Keil_v5\UV4\global.prop # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page0 caretline.visible0 highlight.matchingbraces1 …

【深度学习】日常笔记8

过拟合是指模型在训练集上表现良好&#xff0c;但在验证集和测试集上表现不佳的现象。这是因为模型在训练过程中过度学习了训练数据中的噪声和细节&#xff0c;而忽略了更一般的特征和规律&#xff0c;导致模型泛化能力不足。 具体来说&#xff0c;当模型在训练集上进行训练时&…

some files could not be transferre Xcode14.3打包问题

方法1: Command空格 搜索 该项目的 source“ ( r e a d l i n k " (readlink " (readlink"{source}”)" 替换为source“ ( r e a d l i n k − f " (readlink -f " (readlink−f"{source}”)" 即可。 方法2:切换Xcode 版本&#xff0…

C++面向对象丨4. 文件操作

操作系统&#xff1a;Windows IDE&#xff1a;Visual Studio 2019 文章目录 1 文本文件1.1 写文件1.2 写文件实例1.3 读文件1.4 读文件实例 2 二进制文件2.1 写文件2.2 写文件实例2.2 读文件2.4 读文件实例 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会…

计算机图形硬件(二) 5 - 1 视频显示设备

现在&#xff0c;计算机图形学的功能与应用已经得到了广泛承认&#xff0c;大量的图形硬件和软件系统已经应用到了几乎所有的领域。通用计算机甚至许多手持计算器也已经普遍具备二维及三维应用的图形功能。在个人计算机上也可以配用多种交互输人设备及图形软件包。对于高性能应…