Http客户端 Feign 的使用 (黑马springcloud笔记)

news2024/11/28 4:47:12

Feign基本使用

目录

  • Feign基本使用
    • 一、Feign代替RestTemplate
    • 二、自定义配置
    • 三、Feign使用优化
      • 1. 底层优化
      • 2. 日志优化
    • 四、最佳实践
      • 方式一:继承
      • 方式二:抽取

一、Feign代替RestTemplate

步骤:

  1. 引入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 启动类上添加注解@EnableFeignClients

  3. 编写Feign客户端

    @FeignClient("userService")
    public interface UserApi {
        @GetMapping("/user/{id}")
        User findById(@PathVariable Long id);
    }
    
  4. 使用

    这是RestTemplate的代码

    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
        @Autowired
        RestTemplate restTemplate;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.调用REST接口查询数据
            User user = restTemplate.getForObject("http://userService/user/" + order.getUserId(), User.class);
            // 3.封装数据
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    

    这是Feign的代码:

    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
        
        @Autowired
        UserApi userApi;
        
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.调用REST接口查询数据
            User user = userApi.findById(order.getUserId());
            // 3.封装数据
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    

    代码可读性更高了,并且自带负载均衡。

二、自定义配置

feign可以自定义配置一些东西:

在这里插入图片描述

springboot中配置一般都是两种方式,代码或者application.yml

  1. 代码

    @Bean
    public Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }
    

    若是全局生效,需要在启动类的注解中加上该配置类:

    @EnableFeignClients(defaultConfiguration = CustomConfiguration.class)
    

    若是局部,只需要在对应的客户端中声明:

    @FeignClient(value = "userService", configuration = CustomConfiguration.class)
    
  2. application.yml

    配置文件同样也可以配置全局或者局部

    全局:

    feign:
      client:
        config:
          default: # 这个就是区分全局或者局部的 若是default则是全局
            logger-level: full
    

    局部:

    feign:
      client:
        config:
          userService: # 这个就是区分全局或者局部的 若是default则是全局
            logger-level: full
    

三、Feign使用优化

1. 底层优化

Feign底层实现默认是URLConnection,不支持连接池,效率低。

我们可以选择Apache HttpClient或是OKHttp(俩都支持连接池)来优化Feign的性能。

以HttpClient为例:

  • 引入依赖

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>
    
  • 配置连接池

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

2. 日志优化

简单说就是使用NONE级别或是BASIC级别,级别高了消耗性能。

四、最佳实践

方式一:继承

给消费者的FeignClient和提供者的Controller定义一个统一的父接口作为标准。

在这里插入图片描述

缺点:紧耦合

方式二:抽取

就是搞一个公共的模块,把多个微服务都需要的接口写在里面,需要使用时引入即可。

在这里插入图片描述

缺点就是会引入很多不用的东西。

实现:

  1. 创建新的公共模块,导入feign的依赖,创建普通maven项目即可,不然打包时有坑。

  2. 将order-service中的Feign客户端、实体类、Feign的配置等移入该公共模块

  3. 在order-service中引入该公共模块

    如:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>feign-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    
  4. 指定客户端

    两种方式

    • 扫描包,全部导入

      @EnableFeignClients(basePackages = "com.example.feignapi.apis")
      

      该包下的所有feign客户端都会被扫描

    • 指定客户端导入

      @EnableFeignClients(clients = {UserAPI.class})
      

      指定客户端,可以是一个数组

    建议使用第二种。

  5. 测试在这里插入图片描述

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

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

相关文章

UITableView内输入框(UITextView)换行

业务描述&#xff1a; UITableView内存在一个Cell&#xff0c;该Cell内有一输入框可以输入文字&#xff0c;超出输入框宽度则换行展示&#xff0c;即该Cell高度要增加 如图&#xff1a; 解决方法&#xff1a; 思路&#xff1a; 1:取到最大输入框宽度 2:计算当前文字宽度与最…

QT自定义控件工程结构框架

目录前言一、cutewidgets是什么&#xff1f;二、工程结构三、框架的工程配置1 cutewidgets.pro2 cutewidgets.pri2.1 cutewidgetsconfig.pri2.2 cutewidgetsfunctions.pri2.3 cutewidgetsbuild.pri四、源码1 src1.1 src.pro1.2 cutewidgets_global.h1.3 testedit1.4 扩展2 exam…

互联网中断检测技术窥览与讨论

前言&#xff1a; 如其他人造系统一样&#xff0c;互联网的运行也会出现异常甚至中断。仅在2022年就发生了多起影响重大的互联网中断事件&#xff1a;1月15日汤加火山喷发三个小时后&#xff0c;全国断网&#xff0c;和外界的所有电话与网络联系都无法接通&#xff1b;3月28日…

系统分析师案例必备知识点汇总---2023系列文章二

需求获取 1、需求获取的技术&#xff1a; 用户访谈 优点&#xff1a;具有良好的灵活性&#xff0c;有较宽广的应用范围。 缺点是&#xff1a;用户忙&#xff0c;信息量大&#xff0c;记录困难&#xff0c;需要沟通技巧。 问卷调查 优点&#xff1a;短时间内收集数据。 缺点…

Python aiohttp 库是否值得学?那必须要掌握呀

aiohttp 是一个基于 asyncio 的异步 HTTP 客户端/服务器库。它提供了一组用于编写高性能异步网络应用程序的工具&#xff0c;包括基于协程的客户端和服务器。 库的安装使用 pip install aiohttp Python aiohttp 库通过 aiohttp 搭建服务器aiohttp 路由aiohttp 中间件aiohttp 发…

【机器学习之模型融合】Blending混合法

前言 Stacking堆叠法基础知识&#xff1a;http://t.csdn.cn/dzAna 1、Blending的基本思想与流程&#x1f47f; Blending融合是在Stacking融合的基础上改进过后的算法。在之前的课程中我们提到&#xff0c;堆叠法stacking在level 1上使用算法&#xff0c;这可以令融合本身向着损…

好家伙,这几个隐藏功能,太香了

很多小伙伴可能被小畅的问题搞糊涂了&#xff0c;因为很多人只会在电脑上堆砌各种小应用&#xff0c;而忽略了Windows原有的实用功能。 而我们也千万不要小看这些功能&#xff0c;它们说不定能在关键时刻助你一臂之力&#xff0c;帮到你不少忙呢&#xff01; 那么今天小畅就为大…

MobaXterm连接出现 Network error: Connection timed out 问题解决

MobaXterm连接出现 Network error: Connection timed out&#xff1a; 接前文&#xff1a;CentOS安装, 点此查看文章&#xff0c;安装之后的SSH连接&#xff1a; 解决思路如下&#xff1a; 1、检查虚拟机端是否安装ssh 一般情况是可以自动安装的&#xff0c;直接在终端输入s…

系统分析师案例必备知识点汇总---2023系列文章一

一、系统规划 (视频内容&#xff1a;系统分析师-专业知识模块中的系统规划视频) 1 、可行性研究 经济可行性 技术可行性 法律可行性 用户使用可行性 也称为投资收益分析 或成本效益分析&#xff0c;主 要评估项目的建设成 本、运行成本和项目 建成后可能的经济收 益。 技…

eggjs框架源码解读

文章目录前言Egg进程模型Egg应用程序结构egg运行启动的内幕加载插件扩展内置对象加载中间件加载service加载路由加载配置设置应用信息执行业务逻辑文件加载机制结语前言 eggjs 是阿里在 Nodejs 技术上的一大杰作&#xff0c;也是对开源世界的一大贡献。里面包含了很多技术结晶…

Linux---进程概念

目录 1. 什么是进程&#xff1f; 2. 描述进程---PCB task_struct---PCB的一种 task_ struct内容分类 3. 组织进程 4. 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程---fork初识 1. 什么是进程&#xff1f; 其实&#xff0c;我们启动一个软件&#xf…

SLAM本质剖析番外-李群李代数的微分和导数

0. 简介 这几个月&#xff0c;博主已经从SLAM算法的使用向着算法的数学推导进行了记录和分享&#xff0c;之前也分享了李群李代数关注核心一文&#xff0c;从现象中解释了李群和李代数表达的含义。但是这还不够&#xff0c;所以这次作者作为SLAM本质剖析的番外&#xff0c;来介…

基础数字(一)位运算 哈希(数组中元素出现次数)

目录 力扣剑指 Offer II 070. 排序数组中只出现一次的数字 数组中只出现一次的数&#xff08;其它数出现k次&#xff09;_牛客题霸 数组中只出现一次的两个数字_牛客题霸_牛客网 数组中出现次数超过一半的数字_牛客题霸_牛客网 缺失的第一个正整数_牛客题霸_牛客网 力扣剑指…

[杂记]算法:前缀和与差分数组

这篇讲一下前缀和与差分数组的关系 1. 前缀和 1.1 一维数组前缀和 前缀和在处理数组中的连续子数组的某一段加和的问题中很有用, 因为是拿空间换时间, 可以将线性复杂度降低为常数时间复杂度. 前缀和的道理很简单, 对于数组arr[i],i0,...,n−1arr[i], i 0, ..., n - 1arr[i…

《Linux Shell脚本攻略》学习笔记-第四章

4.1 简介 本章主要介绍sed、awk、grep、cut等命令&#xff0c;这些工具可以相互结合以满足文本处理需求。 正则表达式是一种基础的模式匹配技术。 4.2 使用正则表达式 正则表达式是由字面文本和具有特殊意义的符号组成的。 1&#xff09;位置标记 位置标记锚点是标识字符串位置…

Anaconda安装、opencv环境配置、jupyter notebook使用虚拟环境

目录一、Anaconda 的安装二、opencv 3.4.1.15版本安装三、jupyter notebook使用虚拟环境四、运行报错-缺库一、Anaconda 的安装 Anaconda官网&#xff1a;Anaconda Installers Anaconda历史版本&#xff1a;Anaconda Index of 这边建议和我装一样anaconda3 python3.7&#xf…

opencv的图像基本操作(基于jupyter Notebook)

opencv的基本操作cv2是opencv在python中的缩写&#xff0c;函数开头用cv2cv2.imread(cat.jpg) #读入图片cat.jpgcv2.imwrite(mycat.png,img) #图片img保存为mycat.pngcv2.imshow(image,img) #创建窗口&#xff0c;显示图像cv2.waitKey(10000) #等待时间&#xff0c;以 毫秒为单…

整数分解

问题描述 将 3 分解成两个正整数的和, 有两种分解方法, 分别是 312312 和 321321 。注意顺序不同算不同的方法。 将 5 分解成三个正整数的和, 有 6 种分解方法, 它们是 113122113122 131212221311131212221311 。 请问, 将 2021 分解成五个正整数的和, 有多少种分解方法? …

Android大厂面试100题,涵盖测试技术、环境搭建、人力资源

测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有个程序&#xff0c;发现在Windows上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用例…

Sinutrain下载安装与开启OPC UA---kalrry

Sinumerik下载安装与开启OPC UA---kalrry前言一、安装前准备二、Win7安装1、软件安装2、开启授权3、文件配置4、客户端连接三、Win10/11安装四、启动后使用前言 本教程只适用于 Sinutrain-v4.7 版本&#xff0c;其他版本配置目录有所改变建议安装到默认路径&#xff0c;否则后…