SpringCloud学习路线(6)—— 远程调用HTTP客户端Feign

一、Feign替代RestTemplate

RestTemplate示例

String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);

RestTemplate的缺陷:

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

(一)Fegin的概念

Fegin是一个声明式的http客户端,官网:https://github.com/OpenFeign/feign
作用是 帮助简化实现http请求的发送。

(二)基本使用Fegin

1、引入依赖

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

2、启动类加注解启动Fegin

@EnableFeignClients //启动Fegin客户端
@MapperScan("xxx.xxx.xxx.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class,args);}
}

3、定义Fegin客户端

@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

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

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值:User

3、Service使用Feign客户端

@Service 
public class OrderService {@Autowiredprivate OrderMapper mapper;@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {Order order = orderMapper.findById(orderId);User user = userClient.getById(order.getUserId());order.setUser(user);return order;}}

二、自定义配置

可以修改的配置表

类型作用说明
fegin.Logger.Level修改日志级别(常用)
包含四种级别:NONE、BASIC、HEADERS、FULL
fegin.codec.Decoder响应结果解析器
http 远程调用的结果做分析,例如解析JSON
fegin.codec.Encoder请求参数编码格式
将请求参数编码,便于http请求发送
fegin.Contract支持的注解格式
默认是SpringMVC注解
fegin.Retryer失败重试机制
请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

(一)修改配置的实现

方式一:配置文件方式

fegin:client:config:default: #设置全局配置,若是直接写服务名称,则是针对某一个微服务的配置loggerLevel: FULL #全日志级别

方式二:自定义Feign配置

FeignClientConfiguration 配置类

//配置注解选择一种即可
//全局配置:在启动类上加上该注解
//@EnableFeginClients(defaultConfiguration = FeignClientConfiguration.class)
//局部配置:具体Client类上加该注解
//@FeginClient(value = "userservice", configuration = FeignClientConfiguration.class)
public class FeignClientConfiguration {@Beanpublic Logger.Level.feignLogLevel(){return Logger.Level.BASIC;}
}

三、Feign优化

(一)Feign底层的客户端实现(三种模式)

  • URLConnection: 默认实现,不支持连接池(JDK自带)
  • Apache HttpClient: 支持连接池
  • OKHttp: 支持连接池

(二)对Fegin进行优化的性能

  • 1、使用连接池代替URLConnection
  • 2、日志级别,最好配置为 BASICNONE

(三)配置连接池代替URLConnection

1、引入HttpClient依赖

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

2、配置连接池

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

四、实践总结的实现FeignClient的经验

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

1、实现:

父接口

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

UserClient继承父接口

@FeignClient(value = "userservice")
public interface UserClient extends UserAPI{}

UserController实现父接口

@RestController
public class UserController implements UserAPI {public User findById(@PathVariable("id") Long id) {//...实现业务}
}

2、这种方式的缺陷

  • 服务紧耦合
  • 父接口参数列表映射不会被继承

(二)方式二(抽取): 将FeignClient抽取为独立模块,并且把接口有关的POJO、默认Feign配置都放置在这个模块中给所有消费者使用。

在这里插入图片描述
1、实现

(1)模块创建

创建一个module,命名为feign-api,引入feign的starter依赖

(2)模块功能类抽取

将需要抽取的类放到feign-api模块中。

(3)使用feign-api

消费者服务引入feign-api依赖

(4)消费者服务 import feign-api

2、可能会出现的问题

UserClient 没有被Spring 创建 Bean 对象

  • 原因: FeginClient脱离了消费者服务包扫描的范围,导致有引入没实例的情况。

  • 解决方案:

方式一:指定FeignClient坐在包

@EnableFeignClients(basePackages = "xxx.xxx.xxx.clients")

方式二:指定FeignClient字节码

@EnableFeignClients(clients= {UserClient.class})

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

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

相关文章

需求分析案例:全局错误码设计

本文介绍了我在一些业务系统中遇到的错误提示问题&#xff0c;以及进行需求分析和设计实现的过程&#xff0c;欢迎进行交流和指点&#xff0c;一起进步。 1、需求起源 作为程序员&#xff0c;或多或少&#xff0c;都经历过如下场景&#xff1a; 场景1&#xff1a; 产品经理&a…

智慧校园能源管控系统

智慧校园能源管控系统是一种搭载了物联网技术、大数据技术、大数据等技术性智能化能源管理方法系统&#xff0c;致力于为学校提供更高效、安全性、可信赖的能源供应管理和服务。该系统包括了校内的电力工程、水、气、暖等各类能源&#xff0c;根据对能源的实时检测、数据统计分…

Django 创建应用

第一步&#xff1a;python.exe .\manage.py startapp submit_score 创建后生成的submit_score文件夹&#xff0c;里面文件如下&#xff1a; PS E:\code\portrait> python.exe .\manage.py startapp submit_score PS E:\code\portrait> ls目录: E:\code\portraitMode …

文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;63&#xff09;-- 算法导论6.5 2题 二、试说明 MAX-HEAP-INSERT(A&#xff0c;10)在堆A(15&#xff0c;13&#xff0c;9&#xff0c;5&#xff0c;12&#xff0c;8&#xff0c;7&#xff0c;4&#xff0c;0&#xff0c;6&#xf…

leetcode 13. 罗马数字转整数

罗马转整数要考虑先后顺序 当排在前面的罗马数字大于后面的罗马数字&#xff0c;就正常化成阿拉伯数字相加 如果小&#xff0c;那就是将小的数转成负数&#xff0c;再加就ok。 但也是需要模拟的&#xff0c;就是哪一字母代表哪个数值。 class Solution:def romanToInt(self, s…

【业务功能篇48】后端接口开发的统一规范

业务背景&#xff1a;日常工作中&#xff0c;我们开发接口时&#xff0c;一般都会涉及到参数校验、异常处理、封装结果返回等处理。而我们项目有时为了快速迭代&#xff0c;在这方面上有所疏忽&#xff0c;后续导致代码维护比较难&#xff0c;不同的开发人员的不同习惯&#xf…

2.3 QLayout一探究竟(上)

2.布局 2.1 布局简介 2.2 Qt四大布局介绍及使用方法 2.2.1 QBoxLayout讲解及示例 2.2.1.1 QHBoxLayout介绍 2.2.1.1 QVBoxLayout介绍 2.2.2 QFormLayout讲解及示例 2.2.3 QGridLayout讲解及示例 2.2.4 QStackedLayout讲解及示例 2.3 QLayout一探究竟 2.3.1 布局的基础单元-QL…

HTTP进化史:从HTTP1的简单到HTTP3的强大

文章目录 &#x1f4c8;I. HTTP1⚡A. 基本特点⚡B. 特点⚡C. 优缺点 &#x1f4c8;II. HTTP2⚡A. 基本特点⚡B. 特点⚡C. 优缺点 &#x1f4c8;III. HTTP3⚡A. 基本特点⚡B. 特点⚡C. 优缺点 &#x1f4c8;IV. 总结&#x1f4c8;附录&#xff1a;「简历必备」前后端实战项目&am…

[RK3568] AMP架构

Rockchip 平台异构多系统 AMP&#xff08;非对称多核架构&#xff09;的开发软件包&#xff0c;支持 Linux(Kernel-4.19)、 Baremetal(HAL)、RTOS(RT-Thread) 组合AMP构建形式。 Baremetal(HAL) Baremetal表示裸机操作系统&#xff0c;HAL是裸机操作系统的一种。 裸机嵌入式系…

MySQL不适合创建索引的7种情况

1. 在where中使用不到的字段&#xff0c;不要设置索引 WHERE条件&#xff08;包括order by &#xff0c;group by&#xff09; 2. 数据量小的表最好不要使用索引 表记录太少&#xff0c;比如少于1000个&#xff0c;创建索引会先查索引&#xff0c;再回表&#xff0c;查询花费…

01 QT命名规范,快捷键

命名规范&#xff1a; 类名首字母大写&#xff0c;单词和单词之间首字母大写函数名、变量名 首字母小写&#xff0c;单词和单词之间首字母大写 快捷键&#xff1a; 运行&#xff1a;ctrl r 编译&#xff1a;ctrl b 注释&#xff1a;ctrl / 字体缩放&#xff1a;ctrl 鼠…

设计模式之工厂模式-简单工厂、工厂方法、抽象工厂模式

工厂模式是一种常见的创建型设计模式&#xff0c;它提供了一种创建对象的方法&#xff0c;将对象的创建与使用分离开来&#xff0c;可以减少代码的耦合度。在工厂模式中&#xff0c;我们通过一个工厂类来创建对象&#xff0c;而不是直接在代码中实例化对象。 工厂模式有三种常…

C++并发编程之共享数据(二)

3.1 条件竞争 恶性条件竞争通常发生于完成对多于一个的数据块的修改。例如对一个双向链表的结点的修改。该节点有两个指针。 避免条件竞争的两种方式&#xff1a; 方式一&#xff1a;确保只有进行修改的线程才能看到不变量被破坏时的中间状态。从其他访问线程的角度来 看&…

Git 常用命令

Git操作 克隆远程仓库到本地 # Git初始化&#xff08;仅一次使用的适合需要设置&#xff09; git config --global user.name "用户名" git config --global user.email "邮箱账号"# 朴实无华的拉取 git clone <url>分支 # 查看分支 git branch # …

Spring Boot 配置属性设置优先级

文章首发地址 Spring Boot设计了非常特殊的加载指定属性文件&#xff08;PropertySource&#xff09;的顺序&#xff0c;以允许对属性值进行合理的覆盖。属性值会以下面的优先级进行设置。 home目录下的Devtools全局设置属性&#xff08;~/.spring-boot-devtools.properties&a…

【每日随笔】摩托车安全驾驶 ② ( 头盔选择 | 新手上路技巧 | 摩托车驾驶速度 | 保命法则 | 骑车心理态度 )

文章目录 一、摩托车安全驾驶0、头盔选择1、新手上路技巧2、摩托车驾驶速度3、保命法则4、骑车心理态度 重要的保命法则 : ① 不变道 : 前方 有车 , 就停车 , 等他走你再走 , 千万不要随意变道 , 摩托车变道很危险 , 一个不好就进骨科 , 而且还是你自己全责 ; 只有在 左转 ( …

Puppeteer 使用教程-实战篇(爬取图片、视频、音频,页面数据)

目录 前言 一、 获取实体店铺信息 二、 获取全国各省市县地图json数据 三、 cookies 四、 获取网络图片、视频资源 五、 自动化测试 总结 前言 续上篇&#xff0c;我们简单讲述一下puppeteer常见的应用场景&#xff0c;包括静态页面数据获取&#xff0c;网络请求获取截取…

第 5 章 Spark Shuffle 解析

第 5 章 Spark Shuffle 解析 5.1 Shuffle 的核心要点1. 数据分区&#xff1a;2.数据传输&#xff1a;3. 数据排序&#xff1a;4.数据聚合&#xff1a;5. 数据重分发&#xff1a;6.数据持久化&#xff1a;5.1.1 ShuffleMapStage 与 ResultStage 5.2 HashShuffle 解析5.2.1 未优化…

day7-三数之和

三数之和 力扣题目链接(opens new window) 给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且不重复的三元组。 注意&#xff1a; 答案中不可以包含…

Appium python 框架

目录 前言 流程 结构 具体说说 run.py 思路 其他模块 前言 Appium是一个开源的移动应用自动化测试框架&#xff0c;它允许开发人员使用多种编程语言&#xff08;包括Python&#xff09;来编写自动化测试脚本。Appium框架提供了一套API和工具&#xff0c;可以与移动设备进…