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

news2024/12/25 13:28:04

一、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 {
	@Autowired
	private OrderMapper mapper;
	
	@Autowired
	private 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 {
	@Bean
	public 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.coloradmin.cn/o/771225.html

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

相关文章

(位运算)2023年7月19日学习笔记

位运算符的优先级&#xff08;从高到低&#xff09;&#xff1a;~、&、^、|【其中~&#xff08;取反&#xff09;的结合方向自右至左&#xff0c;且优先级高于算术运算符&#xff0c;其余运算符的结合方向都是自左至右&#xff0c;且优先级低于关系运算符】 声明一下关系运…

乔云监控tf卡格式化后数据恢复方法

您有没有使用过乔云牌监控设备呢&#xff1f;它通常里面会放置一个TF卡以存储录像&#xff0c;而TF卡长期高温高速运行&#xff0c;容易产生碎片&#xff0c;因此很多商家会建议大家一个月进行一次格式化。但是格式化后您有没有后悔过呢&#xff1f;在这个篇文章中&#xff0c;…

rt-thread构建含c++源码的工程

RT-Thread Components > C/C and POSIX layerscons构建项目会出错&#xff1a; vim libraries/SConscript &#xff0c;删除 pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp&#xff08;切记不要注释&#xff0c;要删除&#xff09; 再次scons构建项目&#…

C++基础算法高精度篇

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要讲解了高精度算法的四种常用的计算 文章目录 Ⅲ. 高精度Ⅲ. Ⅰ . …

Spring6.0 源码部署

环境依赖 Git JDK17 Gradle&#xff08;版本号需要和Spring源码中的版本一致&#xff09; 源码下载 官网地址 源码配置修改 maven { url "https://maven.aliyun.com/repository/central" }gradle-wrapper.properties #distributionUrlhttps\://services.gradle…

allure环境搭建

allure环境搭建 在搭建之前你应该有python、pycharm allure介绍 官网&#xff1a;https://docs.qameta.io/allure/ 英文介绍 Allure Framework is a flexible lightweight multi-language test report tool that not only shows a very concise representation of what have…

【Envi风暴】Envi5.6安装图文教程(附Envi5.6完整版下载)

文章目录 一、ENVI5.6安装过程二、ENVI5.6下载地址一、ENVI5.6安装过程 从文末网盘下载完整的ENVI5.6安装包,如下所示:双击envi56-win.exe,开始安装。 点击Next。 点击Next。 点击Next。 等待安装。 点击Finish。

行业追踪,2023-07-19,磷化工这板块放量,但rps强度还未够,可以关注参与下

自动复盘 2023-07-19 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Microsoft Outlook如何建立联系人组 ?

New Items→More Items→Contact Group 选择Add Members→From Address Book

为什么弹性内容交付网络是决定网站性能的关键

如今的用户对于所访问网站都对网站有自己的标准&#xff0c;他们期望访问的网站性能良好&#xff0c;具有快速的页面加载时间和易于访问、新鲜且动态的内容&#xff0c;同时他们还希望享受无缝且安全的体验&#xff0c;无需停机或内容访问受到限制。比如微博等平台每次在网络热…

案例拆解:教育行业平均一场视频号活动裂变3095人!

我们分析了几何裂变平台上视频号裂变工具6月份的活动数据&#xff0c;发现教育行业用的最多的玩法是【预约直播企业微信裂变】。 平均一场活动裂变3095人&#xff0c;裂变率平均为327%&#xff0c;即1个老用户能带来3.27个新用户预约直播添加企业微信。 今天为大家拆解下教育…

工厂模式+策略模式

UML&#xff1a; class: public interface IDeliveryService {/*** 创建第三方出货单* param obj 入参*/Object createThirdOrder(Object obj); } Service RequiredArgsConstructor public class DeliveryServiceImpl implements IDeliveryService {private final DeliverySt…

超声医疗高压功率放大器ATA-4315技术参数

超声波检查或超声诊断&#xff0c;是一种非侵入性的医学检查方法&#xff0c;它利用了声波的高频振动来观察和评估人体内部的器官和组织。它基于不同密度和组织结构中传播的原理。通过将ultrasound(超声波)传递到身体的特定区域&#xff0c;并记录反射回来的声波&#xff0c;我…

reggie优化05-前后端分离开发

1、YApi 2、Swagger 2.1 操作步骤 1、导入Maven <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency>2、导入Knife4j相关配置&a…

Java读取Excel 单元格包含换行问题

Java读取Excel 单元格包含换行问题 需求解决方案 需求 针对用户上传的Excel数据&#xff0c;或者本地读取的Excel数据。单元格中包含了换行&#xff0c;导致读取的数据被进行了切片。 正常读取如下图所示。 解决方案 目前是把数据读取出来的cell转成字符串后&#xff0c;…

点大商城V2_2.5.0 全开源版 商家自营+多商户入驻 百度+支付宝+QQ+头条+小程序端+unipp开源前端安装测试教程

播播资源安装点大商城V2_2.5.0 全开源版测试后发现后台总体体验下来比较简洁&#xff0c;营销功能还是挺多该有的都有了&#xff0c;相比上一版优化很多细节。首页和会员中心均支持DIY装修&#xff0c;底部菜单也一样&#xff0c;安装测试中目前未发现BUG&#xff0c;小程序整体…

在 Amazon 上以高可用性模式实现 Microsoft SQL 数据库服务现代化的注意事项

许多企业都有需要 Microsoft SQL Server 来运行关系数据库工作负载的应用程序&#xff1a;一些应用程序可能是专有软件&#xff0c;供应商可使用它强制 Microsoft SQL Server 运行数据库服务&#xff1b;其他应用程序可能是长期存在的、自主开发的应用程序&#xff0c;它们在最…

Echarts 实现温度计

先上图 <div id="mainOne" style="width: 230px;height:130px;"></div> var dom1 = document.getElementById(mainOne) 核心代码 setTemperature(){var dom1 = document.getElementById(mainOne)var dom2 = document.getElementById(mainTw…

mybatis 基础2

查询所有 数据库字段与JavaBean属性保持一致 数据库字段与JavaBean属性不一致 使用resultMap标签 多表查询 association【引入JavaBean实体类】 通过tprice&#xff0c;address_name模糊查询

软件渗透测试真的很重要吗?渗透测试有哪些测试流程?

软件渗透测试是指通过模拟恶意攻击者的行为&#xff0c;评估软件系统中的潜在安全漏洞和弱点的活动。这种安全测试方法能够帮助开发人员和系统管理员发现并修复潜在的安全漏洞&#xff0c;以确保软件系统的安全性和完整性。软件渗透测试是一项高度技术性的任务&#xff0c;需要…