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;根据对能源的实时检测、数据统计分…

文心一言 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…

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

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

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;查询花费…

Git 常用命令

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

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 未优化…

Appium python 框架

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

基于单片机语音识别智能家居系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;液晶显示当前环境温湿度&#xff0c;用电器开关状态通过语音模块识别设定的语音&#xff1b;DHT11进行环境温湿度采集&#xff1b;通过语音播报模块报当前温湿度&#xff0c;智能回复通过语音识别可以打开灯&#xff0c;窗帘&am…

C语言-排序,初识指针

目录 【1】冒泡排序&#xff08;从小到大&#xff09; 【2】选择排序 【3】二维数组 【4】指针 【5】指针修饰 【6】大小端 【7】初见二级指针 练习&#xff1a; 【1】冒泡排序&#xff08;从小到大&#xff09; #include <stdio.h> //数组哪里的\0?自己和字符串…

Flink 在新能源场站运维的应用

摘要&#xff1a;本文整理自中南电力设计院工程师、注册测绘师姚远&#xff0c;在 Flink Forward Asia 2022 行业案例专场的分享。本篇内容主要分为四个部分&#xff1a; 建设背景 技术架构 应用落地 后续及其他 点击查看原文视频 & 演讲PPT 一、建设背景 建设背景主要…

Yalmip入门教程(3)-约束条件的定义

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 之前的博客简单介绍了约束条件的定义方法&#xff0c;接下来将对其进行详细介绍。 首先简单复习一下&#xff1a; 1.定义约束条件可以使用矩阵拼接…

GRE和MGRE

目录 GRE GRE环境的搭建 MGRE MGRE的配置 MGRE环境下的RIP网络 MGRE实验 VPN 说到GRE&#xff0c;我们先来说个大家熟悉一点的&#xff0c;那就是VPN技术。 背景需求 企业、组织、商家等对专用网有强大的需求。 高性能、高速度和高安全性是专用网明显的优势。 物理专…

Notepad++ 配置python虚拟环境(Anaconda)

Notepad配置python运行环境步骤&#xff1a; 打开Notepad ->”运行”菜单->”运行”按钮在弹出的窗口内输入以下命令&#xff1a; 我的conda中存在虚拟环境 (1) base (2) pytorch_gpu 添加base环境至Notepad中 cmd /k chdir /d $(CURRENT_DIRECTORY) & call cond…

TX Barcode .NET for WPF Crack

TX Barcode .NET for WPF Crack 用于WPF软件的TX Barcode.NET包括一天完成的功能以及用于WPF的软件的2D条形码控制。 用于WPF的TX Barcode.NET的功能和属性&#xff1a; 它具有以下特性和属性&#xff0c;如&#xff1a; 常见的文字处理功能&#xff1a;它可以为用户和开发人员…

FastEdit ⚡:在10秒内编辑大型语言模型

概述&#xff1a; 这个仓库旨在通过一个单一的命令&#xff0c;有效地将新鲜且定制化的知识注入到大型语言模型中&#xff0c;以辅助开发人员的工作。 支持的模型&#xff1a;○ GPT-J (6B)○ LLaMA (7B/13B)○ BLOOM (7.1B)○ Falcon (7B)○ Baichuan (7B/13B)○ InternLM (7…

stable diffusion windows本地搭建的坑

刚刚2小时前&#xff0c;我搭好了&#xff0c;欣喜若狂&#xff0c;开放端口&#xff0c;同事也尝试了。我的配置 16G内存&#xff0c;AMD卡&#xff0c;有gpu但是没有用。这里不说具体步骤&#xff0c;只说坑点。 首先就是安装gfpgan、clip、openclip问题&#xff0c;我参考…