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

news/2025/1/7 21:52:05/

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 {@Autowiredprivate OrderMapper orderMapper;@AutowiredRestTemplate 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 {@Autowiredprivate OrderMapper orderMapper;@AutowiredUserApi 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.ppmy.cn/news/12696.html

相关文章

RT-Thread系列--组件初始化

一、目的RT-Thread里面有个特别有意思的软件设计叫做组件自动初始化。有些小伙伴可能是第一次听说&#xff0c;所以这边我解释一下&#xff0c;请看下面的代码片段static void clock_init() {// 时钟初始化 } static void uart_init() {// 串口初始化 } static void i2c_init()…

自动驾驶专题介绍 ———— 超声波雷达

文章目录介绍工作原理特点常见参数介绍 在汽车碰撞事故中&#xff0c;有大约15%的事故是因为倒车时汽车的后视能力不足引起的&#xff0c;因为增加汽车的后视能力的超声波雷达的研究成为了当下的热点之一。安全避免碰撞的前提是快速准确的测量障碍物于汽车之间的距离。超声波雷…

Opencv图像及视频基本操作

✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下 👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

Https为什么比Http安全?

Https是在Http之上做了一层加密和认证&#xff1b; 主要的区别是Https在TLS层对常规的Http请求和响应进行加密&#xff0c;同时对这些请求和响应进行数字签名。 Http请求的样式&#xff1a; 明文传输&#xff0c;通过抓包工具可以抓到 GET /hello.txt HTTP/1.1 User-Agent: c…

【JavaEE初阶】第二节.进程篇

文章目录 前言 一、操作系统 二、进程 2.1 进程的概念 2.2 进程的管理​​​​​​​​​​​​​​ 2.3 PCB 2.3.1 PCB里面的一些属性 2.3.2 进程的调度 2.3.3 进程的虚拟地址空间 2.3.4 进程间通信 总结 前言 本节内容我们继续对JavaEE的有关内容进行学习&#xff0c;…

[JavaEE]阻塞队列

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1.阻塞队列的概念 2.标准库中的阻塞队列 3.生产者…

nacos在国产银河麒麟系统飞腾CPU部署安装

1 jdk安装 1.1 首先查看系统是否自带jdk java -version1.2 卸载系统自带的openjdk apt-get remove openjdk*或者先查看安装的java&#xff1a;dpkg -l | grep java&#xff0c;再根据对应java的package卸载java&#xff1a;sudo apt-get remove ca-certificates-java1.3 安装…

OpenCV(12)-OpenCV的机器学习

OpenCV的机器学习 基本概念 计算机视觉是机器学习的一种应用&#xff0c;而且是最有价的应用 人脸识别 哈尔(Haar)级联方法深度学习方法(DNN) Haar人脸识别方法 哈尔(Haar)级联方法是专门为解决人脸识别而推出的&#xff0c;在深度学习还不流行时&#xff0c;哈尔已可以商…