【微服务】5、声明式 HTTP 客户端 —— Feign

news2024/11/15 3:34:04

目录

  • 一、RestTemplate 不好的地方
  • 二、Feign 是什么
  • 三、使用
  • 四、自定义 Feign 的配置
    • (1) Feign 的几个常见配置
    • (2) 配置 Feign 的日志级别
      • ① 通过配置文件
      • ② Java 代码配置日志级别
  • 五、Feign 性能优化
    • (1) 性能优化介绍
    • (2) 修改 Feign 底层的 HTTP 请求客户端
  • 六、Feign 的最佳实践
  • (1) 方式一:继承(不好,不推荐)
  • (2) 方式二:抽取

一、RestTemplate 不好的地方

Long userId = orderById.getUserId();
String url = "http://userservice/users/getUserById/" + userId;
User userById = http.getForObject(url, User.class);

✏️ 代码可读性差、编程体验不统一
✏️ 当发送网络请求时的请求参数特别复杂的时候,URL 难以维护


二、Feign 是什么

✏️ Github 地址:https://github.com/OpenFeign/feign
✏️ Feign 是一个声明式的 HTTP 客户端
✏️ 可帮助开发者优雅地发送 HTTP 请求


三、使用

✏️ 依赖

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

✏️ 启动开关 @EnableFeignClients

@EnableFeignClients // 开启声明式 HTTP 客户端 Feign 的使用
@MapperScan("com.gq.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

✏️ 编写 Feign 客户端(声明远程调用的信息)

基于 SpringMVC 注解声明远程调用的信息:
① 服务名称:userservice
② 请求方式:GET
③ 请求路径:/user/{id}
④ 请求参数:Long id
⑤ 返回值类型:User

@FeignClient("userservice") // 服务名称
public interface UserFeignClient {
    
    @GetMapping("/users/getUserById/{id}")
    User getById(@PathVariable String id);
}

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    @Resource
    private OrderMapper orderMapper;

    @Resource
    private UserFeignClient userFeignClient;

    /**
     * 根据订单 id 查询订单
     */
    @Transactional(readOnly = true)
    @Override
    public Order getOrderById(Long orderId) {
        Order orderById = orderMapper.getOrderById(orderId);

        if (orderById != null) {
            Long userId = orderById.getUserId();

            // 使用 Feign 发起远程调用
            User userById = userFeignClient.getById(userId + "");

            orderById.setUser(userById);
        }

        return orderById;
    }
}

四、自定义 Feign 的配置

(1) Feign 的几个常见配置

在这里插入图片描述

☘️ 一般修改的都是日志级别


(2) 配置 Feign 的日志级别

① 通过配置文件

全局配置:

feign:
  client:
    config:
      default: # default 是全局配置(若写服务名称, 则是针对该微服务的配置)
        loggerLevel: FULL # 日志级别

局部配置:

feign:
  client:
    config:
      userservice: # 写服务名称表示只针对该微服务的配置
        loggerLevel: FULL # 日志级别

② Java 代码配置日志级别

必须配置下面的配置结合 Feign 的日志配置才能有效果

logging:
  level:
    com.gq: debug

📖 创建 FeignClientConfiguration

/**
 * 对 Feign 的配置(该配置类在 Feign 相关的注解中使用)
 */
public class FeignClientConfiguration {
    @Bean
    public Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }
}

📖 若是全局配置,将 FeignClientConfiguration 配置类放在 @EnableFeignClients 注解中

// 全局配置 Feign 的日志级别
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@MapperScan("com.gq.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

📖 若是局部配置,将 FeignClientConfiguration 配置类放在 @FeignClient 注解中

// 局部配置 Feign 的日志级别
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
public interface UserFeignClient {
    @GetMapping("/users/getUserById/{id}")
    User getById(@PathVariable String id);
}

五、Feign 性能优化

(1) 性能优化介绍

📔 Feign 底层的客户端实现方案:
URLConnection: 默认实现(不支持连接池)
Apache HttpClient:支持连接池
OKHttp:支持连接池

📔 以上 OKHttpURLConnectionApache HttpClient 是几种发送 HTTP 请求的客户端工具
📔 不使用连接池性能会很差


🍒 Feign 性能优化主要包括两个方面:
① 使用支持连接池的 HTTP 请求客户端 (如 Apache HttpClient、OKHttp) 代替 URLConnection

② 日志级别最好使用 BASIC或 NONE【debug 的时候才用 FULL】


(2) 修改 Feign 底层的 HTTP 请求客户端

🎁 添加 HttpClient 依赖

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

🎁 在 yaml 文件配置连接池

feign:
  client:
    config:
      default:
        loggerLevel: BASIC # 打印基本的请求和响应信息
  httpclient:
    enabled: true # 开启 Feign 对 HttpClient 的支持
    max-connections: 168
    max-connections-per-route: 39 # 每个路径的最大连接数

六、Feign 的最佳实践

(1) 方式一:继承(不好,不推荐)

🎄 给消费者的 FeignClient 和提供者的 Controller 定义统一的父接口作为标准
在这里插入图片描述

(2) 方式二:抽取

🎄 将 Feign 抽取为独立的模块
在这里插入图片描述

当定义的 FeignClient 不在 SpringBootApplication 的扫描包范围时,FeignClient 将无法使用(解决方法如下)

🚀 指定 FeignClient 所在包

@EnableFeignClients(basePackages = {"com.guoqing.feign"})

在这里插入图片描述

🚀 指定 FeignClient 字节码

@EnableFeignClients(clients = {UserFeignClient.class})

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

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

相关文章

C++:std::function模板类(前言):为什么有了函数指针还需要Functional

为什么有了函数指针还有 Functional 1: 函数指针定义2&#xff1a; 函数指针结论3&#xff1a;疑问4&#xff1a; Function来源5&#xff1a;Functional 特点 1: 函数指针定义 在C中可以使用指针指向一段代码&#xff0c;这个指针就叫函数指针&#xff0c;假设有下面一段代码 …

交友项目【首页推荐,今日佳人,佳人信息】

目录 1&#xff1a;首页推荐 1.1&#xff1a;接口地址 1.2&#xff1a;流程分析 1.3&#xff1a;代码实现 2&#xff1a;今日佳人 1.1&#xff1a;接口地址 1.2&#xff1a;流程分析 1.3&#xff1a;代码实现 3&#xff1a;佳人信息 1.1&#xff1a;接口地址 1.2&am…

计算机基础--MySQL--索引

参考文献 [MySQL索引连环18问&#xff01;] https://zhuanlan.zhihu.com/p/364041898[深入理解MySQL索引] https://www.infoq.cn/article/ojkwyykjoyc2ygb0sj2c[聚集索引和非聚集索引的区别] https://juejin.cn/post/7001094401858469918[索引分类] https://blog.csdn.net/dd2…

【消费战略】解读100个食品品牌丨王小卤 4年10亿爆品破局

爆品破局 王小卤的聚焦发展! 王小卤创建于 2016 年&#xff0c;与饮料行业的独角兽元气森林同年。 相较于元气森林的快速增长&#xff0c;王小卤历经 三年坎坷之路&#xff0c;直至 2019 年才踏上高增长的赛道&#xff0c;实现四年十亿的增长。 “所有的消费品都值得重新 做…

RHCSA练习作业(二)

目录 题目一 题目二 题目三 第四题 第五题 题目一 文件查看&#xff1a;查看/opt/passwd文件的第六行&#xff08;使用head和tail指令&#xff09; 代码如下&#xff1a; head -6 /opt/passwd | tail -1 题目二 在/etc及其子目录中&#xff0c;查找host开头的文件&#x…

纯净Python环境的安装以及配置PyCharm编辑器

前言 优质的教程可以让我们少走很多弯路&#xff0c;这一点毋庸置疑。去年二月我接触了Python&#xff0c;并找到了一份优质的配置教程&#xff0c;让我能够快速上手Python的学习。现在&#xff0c;一年多过去了&#xff0c;我已经有了很大的进步和变化&#xff0c;这也让我更…

ARM kernel 内核的移植 - 从三星官方内核开始移植

一、内核移植初体验 1、三星官方移植版内核获取 (1) 从网盘下载源码包。 (2) 这个文件最初是来自于三星的 SMDKV210 开发板附带的光盘资料。 2、构建移植环境 (1) Windows下建立工程。 (2) ubuntu下解压。 3、配置编译下载尝试 (1) 检查 Makefile 中 ARCH 和 CROSS_COMPI…

手把手教你Python爬虫

前言 python爬虫技术在java开发工作中属于工具性的技术属性&#xff0c;所以我这里就只从爬取一个网站的数据为例作为教学内容&#xff0c;具体的基础学习与其它的扩展知识内容&#xff0c;我会以链接的形式给出&#xff0c;若有兴趣可自行点击学习。 python基础知识教学 Pyth…

怎么压缩图片的体积大小,4款软件分享

怎么压缩图片的体积大小&#xff1f;因为在日常生活和工作中&#xff0c;我们常常会遇到需要压缩图片大小的情况。图片的大小是由像素点数量和每个像素的颜色深度共同决定的&#xff0c;一般来说&#xff0c;像素点数量越多&#xff0c;每个像素的颜色深度越高&#xff0c;图片…

四百元以内哪种耳机音质好?2023便宜音质好的蓝牙耳机推荐

现如今&#xff0c;蓝牙耳机的发展速度越来越快&#xff0c;不少人对于其音质方面的要求也越来越高。最近看到很多人问&#xff0c;有没有便宜音质又好的蓝牙耳机&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款便宜音质好的蓝牙耳机&#xff0c;一起来看看吧。 一、…

怎么远程控制电脑

为什么要从另一台电脑远程控制电脑&#xff1f; 如今&#xff0c;Splashtop已广泛应用于各个领域。 在很多情况下&#xff0c;您需要从另一台远程电脑控制一台电脑。 这里演示了两个例子&#xff1a; 1&#xff1a;当您不在同一楼层时&#xff0c;您的同事需要您的帮助来解决…

阿里云张献涛:云原生计算基础设施助力汽车行业数字化升级

2023 年阿里云峰会北京站《云上智能汽车》论坛&#xff0c;阿里云智能基础产品部副总裁、阿里云智能弹性计算 & 无影产品线总经理张献涛&#xff0c;发表了《云原生计算基础设施助力汽车行业数字化升级》的主题演讲。 当前&#xff0c;汽车行业的数字化浪潮已经渗透到汽车设…

System V 共享内存

System V 共享内存 共享内存是什么如何使用共享内存ftokshmgetshmatshmdtshmctl 共享内存的原理共享内存实现两个进程间通信共享内存的特点共享内存与管道配合使用两个进程间通信多个进程间通信 共享内存是什么 &#x1f680;共享内存是最快的IPC形式。一旦这样的内存映射到共…

【产品应用】一体化步进伺服电机在高速异形插件机的应用

随着科技的不断发展&#xff0c;自动化生产设备在各个行业中得到了广泛的应用。高速异形插件机作为自动化生产设备中的一种&#xff0c;其核心部件之一就是一体化步进伺服电机。本文将详细介绍一体化步进伺服电机在高速异形插件机中的应用。 01.设备简介 高速异形插件机是一种…

我们为什么要写作?

为什么要写书是一个很难回答的问题&#xff0c;因为从不同的角度&#xff0c;会有不同的答案。 最近ChatGPT很火&#xff01;诸事不决&#xff0c;先问问ChatGPT&#xff0c;看看它是怎么回答的。 ChatGPT给出的答案还是比较全&#xff0c;虽然没有“一本正经的胡说八道”&…

PCB高频电路设计中的差分信号设计

目录 1、差分信号的定义 2、如何布置差分线路&#xff1f; 3、微带线和带状线的概念 4、布线中常用的匹配方法 1、差分信号的定义 什么是差分布线&#xff1a;差分布线主要是区别传统的信号线对应一根地线的信号传输方式&#xff0c;差分信号传输主要是两条线上都有信号传…

基本数据类型和引用数据类型的存储区别?

目录 1、存储位置的区别 2、变量赋值时的区别 ① 基本数据类型 ② 引用数据类型 3、小结 ① 声明变量时不同的内存地址分配 ② 不同的类型数据导致赋值变量时的不同 1、存储位置的区别 基本数据类型和引用数据类型存储在内存中的位置不同&#xff1a; ① 基本数据类型存…

20230420 | 977. 有序数组的平方、 209. 长度最小的子数组、59. 螺旋矩阵 II

1、977. 有序数组的平方 方法1&#xff1a;使用暴力法&#xff0c;一遍for&#xff0c;一次排序。这个时间复杂度是 O(n nlogn)&#xff0c; 可以说是O(nlogn)的时间复杂度。 class Solution {public int[] sortedSquares(int[] nums) {//先计算出平方for(int i0;i<nums.le…

Vulnhub项目:JANGOW 1.0.1

靶机地址&#xff1a;Jangow: 1.0.1 ~ VulnHub 渗透过程&#xff1a; kali ip&#xff1a;192.168.56.104&#xff0c;使用arp-scan -l查看到靶机ip192.168.56.118 对靶机进行端口探测&#xff0c;发现了21、80端口 访问80端口&#xff0c;发现site目录 点击进去后&#xff0…

HIVE SQL 进行 Join 和 group by的具体原理及分区方式

HIVE SQL 实现Join和group by 具体原理 1、JOIN 在map的输出value中为不同表的数据打上tag标记&#xff0c;在reduce阶段根据tag判断数据来源。MapReduce的过程如下&#xff1a; 2、 GROUP BY HIVE SQL 实现Join和group by 的分区原理 1、JOIN 在join操作中&#xff0c;两个…