【微服务】七. http客户端Feign

news2025/1/12 1:50:19

7.1 基于Feign远程调用

RestTimeplate方式调用存在的问题

先来看以前利用RestTemplate发起远程调用的代码:

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

存在下面的问题:

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

Feign的介绍

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面的问题。

定义和使用Feign客户端
使用Feign的步骤如下:

  • 引入依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 在order-service的启动类添加注解开启Feign的功能:
@EnableFeignClients  -- 开启feign注解
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
 public class OrderApplication{
     public static void main(String[] args){
         SpringApplication.run(OrderApplication.class,args);
     }
 }
  • 编写Feign客户端
@FeignClient("userservice")
public interface UserClient{
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

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

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User
  1. 用Feign客户端代替RestTemplate
@Autowired
private UserClient userClient;

public Order queryOrderById(Long orderId){
	// 1. 查询订单
	Order order = orderMapper.findById(orderId);
	// 2. 利用Feign发起http请求,查询用户
	User user = userClient.findById(order.getUserId());
	// 3. 封装User到Order
	order.setUser(user);
	// 4. 返回
	return order; 
}

实际操作:
基于feign远程调用实际操作
feign集成了ribbon,已经实现了负载均衡
fegin集成了ribbon实现了负载均衡

总结

Feign的使用步骤:

  1. 引入依赖
  2. 添加@EnableFeignClients注解
  3. 编写FeignClient接口
  4. 使用FeignClient中定义的方法代替RestTemplate

7.2 自定义feign配置

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

类型作用说明
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL(一般情况下用basic或none,调试错误下用full)
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign.Contract支持的注解格式默认是SpringMVC的注解
feign.Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

一般我们需要配置的就是日志级别。
配置Feign日志有两种方式:
方式一:配置文件方式
全局生效:

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

局部生效:

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

方式二:java代码配置,需要先声明一个Bean

public class FeignClientConfiguration{
	@Bean
	public Logger.Level feignLogLevel(){
		return Logger.Level.BASIC;  // 引入的包: feign.Logger
	}
}

而后,如果是全局配置,则把它放到@EnableFeignClients这个注解中:(加到启动类上)

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class);

如果是局部配置,则把它放到@FeignClient这个注解中:(加到具体的client接口上)

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

总结

Feign的日志配置:

  1. 方式一是配置文件,feign.client.config.xxx,loggerLevel
  • 如果xxx是default则代表全局
  • 如果xxx是服务名称,例如userservice则代表某服务
  1. 方式二是java代码配置Logger.Level这个Bean
  • 如果是在@EnableFeignClients注解声明则代表全局
  • 如果在@EnableClient注解中声明则代表某服务

7.3 Feign的性能优化

7.3.1 Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池
    因为优化Feign的性能主要包括:
  • 使用连接池代替默认的URLConnection
  • 日志级别,最好用basic或none(默认none)

7.3.2 Feign的性能优化–连接池配置

Feign添加HttpClient的支持
引入依赖:

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

配置连接池:

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

真实业务中要对程序进行压测,来具体确定max-connections、max-connections-per-route的值

总结:

Feign的优化:

  1. 日志级别尽量使用basic
  2. 使用HttpClient和OKHttp代替URLConnection
    引入feign-httpClient依赖
    配置文件开启httpClient功能,设置连接池参数

7.4 Feign最佳实践分析

方式一(继承):

给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
feign最佳实践方式一
一般我们不推荐客户端和服务端之间共享一个interface,因为会造成紧耦合,而且对spring mvc不起作用

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

方式二(抽取):

将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有的消费者使用
feign最佳实践方式二
降低了耦合度,但是如果order-service只用feign-api中的两三个接口,需要把feign-api的所有都加载出来。

总结

Feign的最佳实践

  1. 让controller和FeignClient继承同一接口
  2. 将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用

7.5 实践:抽取FeignClient

抽取FeignClient

实现最佳实践方式二的步骤如下:

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

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

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

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

5.重启测试

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:

方式一:指定FeignClient所在包(将所有的都拿过来)

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

方式二:指定FeignClient字节码(只拿UserClient)

@EnableFeignClients(clients = {UserClient.clss})

总结

不同包的FeignClient的导入有两种方式:

1.在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包

2.在@EnableFeignClients注解中添加clients,指定具体FeignClient的字节码

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

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

相关文章

数据产品读书笔记——认识数据产品经理

&#x1f33b;大家可能听说的更多是产品经理这个角色&#xff0c;对数据产品经理可能或多或少了解一些&#xff0c;但又不能准确的描述数据产品经理的主要职能和与其他产品的不同&#xff0c;因此通过读一些书来对数据产品经理有一个准确且全面的认知。 目录 1. 数据的产品分类…

STC89C51基础及项目第10天:LCD显示字符(非标协议外设)

1. 初识LCD1602&#xff08;233.79&#xff09; 非标协议外设 LCD1602显示 LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符(16列两行) 引脚说明 第 1 脚&#xff1a; VSS 为电源地第 2 脚&#xff1…

vue3前端开发-flex布局篇

文章目录 1.传统布局与flex布局优缺点传统布局flex布局建议 2. flex布局原理2.1 布局原理 3. flex常见属性3.1 父项常见属性3.2 子项常见属性 4.案例实战(携程网首页) 1.传统布局与flex布局优缺点 传统布局 兼容性好布局繁琐局限性&#xff0c;不能再移动端很好的布局 flex布…

【C++入门到精通】C++入门 —— 红黑树(自平衡二叉搜索树)

阅读导航 前言一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树结构&#xff08;带有头结点的红黑树&#xff09;五、红黑树的插入操作1. 按照二叉搜索的树规则插入新节点2. 新节点插入后&#xff0c;红黑树的变色以及旋转情况1&#xff1a; cur为红&#xff0…

nginx-proxy反向代理缓存

介绍&#xff1a; 反向代理缓存&#xff0c;类似于动静分离&#xff0c;即通过nginx代理服务器根据客户端发送的url请求&#xff0c;去后台服务器获取数据&#xff0c;将静态数据缓存到nginx代理服务器上&#xff0c;并配置有过期时间&#xff0c;当客户端下次以相同的url请求…

【机器学习】决策树原理及scikit-learn使用

文章目录 决策树详解ID3 算法C4.5算法CART 算法 scikit-learn使用分类树剪枝参数重要属性和接口 回归树重要参数&#xff0c;属性及接口交叉验证代码示例 一维回归的图像绘制 决策树详解 决策树&#xff08;Decision Tree&#xff09;是一种非参数的有监督学习方法&#xff0c;…

blender 之视频渲染(以三维重建path为例)

blender 之视频渲染&#xff08;以三维重建path为例&#xff09; 1.新建轨迹路径2.设置相机&#xff0c;使其按照path运动3.将相机视角对准物体4.修改帧率5.设置输出路径6.设置输出格式7.渲染 1.新建轨迹路径 新建轨迹 选中新建的BezierCycle&#xff0c;按住S&#xff0c;拖…

基于支持向量机SVM和MLP多层感知神经网络的数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 一、支持向量机&#xff08;SVM&#xff09; 二、多层感知器&#xff08;MLP&#xff09; 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .…

mysql面试题23:如果某个表有近千万数据,CRUD比较慢,如何优化?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:如果某个表有近千万数据,CRUD比较慢,如何优化? 当某个表存在近千万数据且CRUD(增删改查)操作比较慢时,可以考虑以下优化策略: 使用索引:索…

3.1.OpenCV技能树--二值图像处理--图像腐蚀与膨胀

文章目录 1.文章内容来源2.图像膨胀处理2.1.图像膨胀原理简介2.2.图像膨胀核心代码2.3.图像膨胀效果展示 3.图像腐蚀处理3.1.图像腐蚀原理简介3.2.图像腐蚀核心代码3.3.图像腐蚀效果展示 4.易错点总结与反思 1.文章内容来源 1.题目来源:https://edu.csdn.net/skill/practice/o…

LVS+Keepalived 高可用集群负载均衡

一.keepalived介绍 1.1.Keepalived实现原理 由多台路由器组成一个热备组&#xff0c;通过共用的虚拟IP地址对外提供服务。 每个热备组内同时只有一台主路由器提供服务&#xff0c;其他路由器处于冗余状态。 若当前在线的路由器失效&#xff0c;则其他路由器会根据设置…

(论文调研) Multi-task的网络结构 在图像去噪问题中的应用

1.SNIDER: Single Noisy Image Denoising and Rectification for Improving License Plate Recognition 这是一篇用于实现端到端的车牌恢复 (LPR: License Plate Recognition) 网络, 其中使用去噪和校正网络来生成清晰的恢复图像, 以实现稳健的 LPR 性能. 这个网络的名称为SN…

内网渗透笔记之内网基础知识

0x01 内网概述 内网也指局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…

Maven(4)-利用intellij idea创建maven 多模块项目

本文通过一个例子来介绍利用maven来构建一个多模块的jave项目。开发工具&#xff1a;intellij idea。 一、项目结构 multi-module-project是主工程&#xff0c;里面包含两个模块&#xff08;Module&#xff09;&#xff1a; web-app是应用层&#xff0c;用于界面展示&#xff…

基于瞬时无功功率ip-iq的谐波信号检测Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

nodejs+vue快递管理服务系统elementui

电子商务改变了人们的传统经济活动中的交易方式和流通技术&#xff0c; 复杂的物流快递信息需要有效的进行处理&#xff0c;构建一个快递管理服务系统可以确保物流信息的一致性、员工登录&#xff1a;通过用户名和密码登录。这也间接带动了物流快递行业的高速发展。 &#xff0…

flutter开发实战-inappwebview实现flutter与Javascript方法调用

flutter开发实战-inappwebview实现flutter与Javascript方法调用 在使用inappwebview时候&#xff0c;需要flutter端与JS进行交互&#xff0c;调用相应的方法&#xff0c;在inappwebview中的JavaScript Handlers。 一、JavaScript Handlers 要添加JavaScript Handlers&#…

基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的仿真结果导入到MATLAB,结果如下所示&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps…

界面组件DevExpress WinForms v23.1 - TreeList、UI模板全新升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

cpu的指令重排,禁用办法

上一篇博客 volatile关键字总结-CSDN博客&#xff0c;我们讲了两个volatile变量可以限制编译器对指令的重排&#xff0c;但是限制不了cpu层面的指令重排 这篇博客开始&#xff0c;我们演示下cpu层面的指令重排&#xff0c;以及如何禁止cpu层面的指令重排 实验一&#xff1a;复…