当前位置: 首页 > news >正文

微服务中间件--http客户端Feign

http客户端Feign

  • http客户端Feign
    • a.Feign替代RestTemplate
    • b.自定义Feign的配置
    • c.Feign的性能优化
    • d.Feign的最佳实践分析
    • e.Feign实现最佳实践(方式二)

http客户端Feign

a.Feign替代RestTemplate

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

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

存在下面的问题:

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

Feign的介绍

Feign是一个声明式的http客户端, 其作用就是帮助我们优雅的实现http请求的发送, 解决上面提到的问题。

在这里插入图片描述

使用Feign的步骤如下:

1.引入依赖:

<!--Feign客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.在order-service的启动类添加注解@EnableFeignClients开启Feign的功能:

@EnableFeignClients
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

3.编写clients/UserClient中Feign客户端:

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

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

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

4.用Feign客户端代替RestTemplate

在这里插入图片描述

b.自定义Feign的配置

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

在这里插入图片描述

一般我们需要配置的就是日志级别。

配置Feign日志有两种方式:

方式一:配置文件方式

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

方式二:java代码方式,需要先声明一个Bean,在config/DefaultFeignConfiguration:

public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}
}

而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class) 

如果是局部配置,则把它放到@FeignClient这个注解中:

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

c.Feign的性能优化

Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此优化Feign的性能主要包括:

  • 使用HttpClient 或者OKHttp连接池代替默认的URLConnection
  • 日志级别,最好用basic或none

Feign添加HttpClient的支持:

1.引入依赖:

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

2.配置连接池:

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

d.Feign的最佳实践分析

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

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

在这里插入图片描述

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

在这里插入图片描述

e.Feign实现最佳实践(方式二)

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

  • 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字节码

@EnableFeignClients(clients = {UserClient.class})

相关文章:

微服务中间件--http客户端Feign

http客户端Feign http客户端Feigna.Feign替代RestTemplateb.自定义Feign的配置c.Feign的性能优化d.Feign的最佳实践分析e.Feign实现最佳实践(方式二) http客户端Feign a.Feign替代RestTemplate 以前利用RestTemplate发起远程调用的代码&#xff1a; String url "http:…...

C语言学习系列-->【关于qsort函数的详解以及它的模拟实现】

文章目录 一、概述二、qsort函数参数介绍三、qsort实现排序3.1 qsort实现整型数组排序3.2 qsort实现结构体数组排序 四、模拟实现qsort函数 一、概述 对数组的元素进行排序 对数组中由 指向的元素进行排序&#xff0c;每个元素字节长&#xff0c;使用该函数确定顺序。 此函数使…...

Linux系统安全:NAT(SNAT、DNAT)

目录 一.NAT 二.SNAT 三.DNAT 一.NAT NAT: network address translation&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标IP&#xff0c;根据…...

【数据库】MySQL存储过程:提升数据库性能和操作效率的利器

在数据库管理系统中&#xff0c;存储过程是一种重要的数据库对象&#xff0c;它允许将一组复杂的SQL语句组合起来&#xff0c;形成一个独立的单元进行重复使用。存储过程可以极大地提高数据库的性能和操作效率&#xff0c;降低网络流量&#xff0c;减轻系统负载。本文将深入探讨…...

rust写一个多线程和协程的例子

当涉及到多线程和协程时&#xff0c;Rust提供了一些非常强大的工具&#xff0c;其中最常用的库之一是tokio&#xff0c;它用于异步编程和协程。下面我将为你展示一个简单的Rust程序&#xff0c;演示如何使用多线程和协程。 首先&#xff0c;你需要在你的项目的Cargo.toml文件中…...

react18+antd5.x(1):Notification组件的二次封装

antdesign已经给我们提供了很好的组件使用体验,但是我们还需要根据自己的项目业务进行更好的封装,减少我们的代码量,提升开发体验 效果展示 开起来和官网的使用没什么区别,但是我们在使用的时候,进行了二次封装,更利于我们进行开发 MyNotification.jsx,是我们的业务页面…...

jenkins运行pytest测试用例脚本报错:没有权限,无法写日志PermissionError:[Error 13]Permission denied

报错信息&#xff1a; PermissionError:[Error 13]Permission denied&#xff1a;‘/var/jenkins_home/workspace/deleverySystem/Delivery_System/out_files/logs/waimai_20230823.log’ 解决方法&#xff1a; 在jenkins容器内部输入 chmod -R 777 /var/jenkins_home/works…...

数据结构 day1

1>x.mind 2>间接定义结构体数组&#xff0c;进行4种方式的定义和初始化 3>定义结构体存储10辆车&#xff08;车的信息&#xff1a;品牌、单价、颜色&#xff09; 1.定义函数&#xff0c;实现循环输入 2.定义函数&#xff0c;实现排序 3.定义函数&#xff0c;计算红色车…...

湖北咸宁农业三维扫描数字化农业3d打印制造应用-CASAIM中科广电

农业是人类衣食之源、生存之本&#xff0c;是一切生产的首要条件&#xff0c;CASAIM在农业三维扫描和3d打印应用上有丰富经验。 1.三维扫描技术在农业领域的应用 CASAIM三维扫描是集光学、机电和计算机技术于一体的高新无损检测技术&#xff0c;能够对实物的空间外形、结构乃…...

Jenkins的定时任务配置

jenkins配置定时任务位置(点击日程表的问好可查看语法配置) jenkins的定时任务的参数 # 定时任务参数(每个参数之间使用tab键或空格分隔)MINUTE HOUR DOM MONTH DOW 参数解释取值范围 MINUTE 分钟0-59HOUR小时0-23DOM一月的天数1-31MONTH月份1-12DOW 一周的天数0…...

THINKPHP 微联云投票系统源码独立版 + 支持刷礼物

THINKPHP 微联云投票系统源码独立版 支持刷礼物 nginxphp7.2以上 mysql5.6以上 简单测试后台基本没什么问题&#xff0c;暂时发现H5前端有bug,自行修复。...

Mongodb两种启动方法

一、命令行启动 1.修改存放数据库的位置 说明&#xff1a;E:\data\mongodb&#xff1b;我在E盘创建的文件夹mongodb mongod --dbpathE:\data\mongodb 2.成功启动 说明&#xff1a;默认端口27017&#xff0c;代表已经启动成功 &#xff0c;并在mongodb自动创建文件 二、配置项…...

Python:列表的浅拷贝与深拷贝

在python语言中&#xff0c;因为其面向对象的特性&#xff0c;在进行列表拷贝时可能会出现一些意想不到的结果&#xff0c;涉及到列表的浅拷贝和深拷贝相关问题&#xff0c;本文将对其进行总结。 首先我们来看以下代码。 my_list [1, 2, 3] your_list my_list your_list[0] …...

OnePlus Open可折叠手机:规格、价格、发布日期等详细信息汇总!

我们知道OnePlus可折叠手机即将问世,无论它是否被命名为OnePlus Open。我们迫不及待地想让它到来,为该公司再添一根弦,为最好的可折叠手机增添一个新的竞争对手。 OnePlus以前没有生产过任何可折叠产品,但它确实拥有合作伙伴公司Oppo的丰富知识,并可以向三星、摩托罗拉和…...

SQL 数据库

安装配置 【1】 MySQL安装配置教程&#xff08;超级详细、保姆级&#xff09; 【2】 MySQLNavicat安装配置教程&#xff08;超级详细、保姆级&#xff09; 学习资料 【戴师兄】SQL入门免费教程 刷题链接&#xff1a;https://share.mubu.com/doc/4BHMMbbvIMb 学习笔记&#xf…...

【算法系列篇】滑动窗口

文章目录 前言什么是滑动窗口1.长度最小的子数组1.1 题目要求1.2 做题思路 1.3 Java代码实现2.无重复字符的最长子串2.1 题目要求2.2 做题思路2.3 Java代码实现 3.最大连续1的个数 III3.1 题目要求3.2 做题思路3.3 Java代码实现 4.将x减到0的最小操作数4.1 题目要求4.2 做题思路…...

多维时序 | MATLAB实现BiTCN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现BiTCN-BiGRU-Attention多变量时间序列预测。 模型描…...

Docker容器与虚拟化技术:Docker compose部署LNMP

目录 一、理论 1.LNMP架构 2.背景 3.Dockerfile部署LNMP 3.准备Nginx镜像 4.准备MySQL容器 5.准备PHP镜像 6.上传wordpress软件包 7.编写docker-compose.yml 8.构建与运行docker-compose 9.启动 wordpress 服务 10.浏览器访问 11.将运行中的 docker容器保存为 doc…...

高性能服务器Nodejs操作Mysql数据库

目录 1 Node 操作 mysql1.2 操作 mysql 数据库 2 Web 开发模式2.1 服务端渲染2.2 前后端分离2.3 如何选择 3 身份认证3.1 Session 认证机制3.2 JWT 认证机制 1 Node 操作 mysql 数据库和身份认证 配置 mysql 模块 安装 mysql 模块 npm install mysql建立连接 const mysql …...

ffmpeg将rtsp流转成mp4

命令行版本 ffmpeg -y -i "rtsp://你的rtsp地址" -vcodec copy -f mp4 d:/1.mp4中间的rtsp网址一定要加上双引号&#xff0c;避免出现url有特殊字符的问题 java代码版本 如果不支持tcp协议&#xff0c;去掉下面两个参数即可,加上这两个参数是因为ffmpeg默认使用ud…...

第十四天|层序遍历、226.翻转二叉树 (优先掌握递归)、101. 对称二叉树 (优先掌握递归)

层序遍历 题目链接&#xff1a;102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(n…...

如何使用装rancher安装k8s集群(k8s集群图形化管理工具)

前言 kubernetes集群的图形化管理工具主要有以下几种&#xff1a; 1、 Kubernetes Dashborad: Kubernetes 官方提供的图形化工具 2、 Rancher: 目前比较主流的企业级kubernetes可视化管理工具 3、各个云厂商Kubernetes集成的管理器 4、 Kuboard: 国产开源Kubernetes可视化管理…...

类加载器与双亲委派

类加载器与双亲委派 Java 类加载器&#xff08;Class Loader&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#xff0c;负责将类的字节码加载到内存中&#xff0c;并将其转换为可执行的 Java 对象。类加载器在 Java 应用程序中起着重要的作用&#xff0c;它…...

用Python创造乐趣:编写你自己的探索游戏世界

在当今数字化时代&#xff0c;编程不再是一个专业程序员的专利。无论你是一个编程新手还是有一定经验的开发者&#xff0c;用Python编写简单的游戏是一个有趣且富有创造性的方式。在这篇博客中&#xff0c;我们将探索如何用Python构建一个基本的探索游戏世界&#xff0c;让玩家…...

git stash弹出栈中的指定内容

使用 git stash 的相关命令来选择性地弹出特定的 stash 内容&#xff0c;应用到指定的分支上。如果我们使用 git stash 命令已经存储了多个记录时&#xff0c;每个 stash 记录都会有一个唯一的标识符&#xff08;stash{0}、stash{1}…&#xff09;。通过这些标识符可以应用或弹…...

5.7 汇编语言:汇编高效乘法运算

乘法指令是一种在CPU中实现的基本算术操作&#xff0c;用于计算两个数的乘积。在汇编语言中&#xff0c;乘法指令通常是通过mul&#xff08;无符号乘法&#xff09;和imul&#xff08;有符号乘法&#xff09;这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多&#…...

Graphql中的N+1问题

开篇 原文出处 Graphql 是一种 API 查询语言和运行时环境&#xff0c;可以帮助开发人员快速构建可伸缩的 API。然而&#xff0c;尽管 Graphql 可以提供一些优秀的查询性能和数据获取的能力&#xff0c;但是在使用 Graphql 的过程中&#xff0c;开发人员也会遇到一些常见问题&…...

mysql、oracle、sqlserver常见方法区分

整理了包括字符串与日期互转、字符串与数字互转、多行合并为一行、拼接字段等一些常用的函数&#xff0c;当然有些功能实现的方法不止一种&#xff0c;这里列举了部分常用的&#xff0c;后续会持续补充。 MySQLOracleSQL Server字符串转数字 CAST(123 as SIGNED) 或 CONVERT(12…...

AcWing 4382. 快速打字

原题链接&#xff1a;AcWing 4382. 快速打字 关键词&#xff1a;双指针、判断子序列 芭芭拉是一个速度打字员。 为了检查她的打字速度&#xff0c;她进行了一个速度测试。 测试内容是给定她一个字符串 I&#xff0c;她需要将字符串正确打出。 但是&#xff0c;芭芭拉作为一…...

DataFrame.query()--Pandas

1. 函数功能 Pandas 中的一个函数&#xff0c;用于在 DataFrame 中执行查询操作。这个方法会返回一个新的 DataFrame&#xff0c;其中包含符合查询条件的数据行。请注意&#xff0c;query 方法只能用于筛选行&#xff0c;而不能用于筛选列。 2. 函数语法 DataFrame.query(ex…...

黑龙江省建设教育信息网网站/google浏览器官网

GRUB的功能1. 提供选择要启动的内核或者系统2. 提供交互式接口。进入GRUB后按e键进入GRUB的交互接口&#xff0c;可已经行Linux系统运行基本的选择。3. 基于密码的保护&#xff1a;启用内核映像&#xff0c;传递参数12341234GRUB的接口格式title&#xff1a;操作系统的内核或者…...

成都网站建制作/重庆seo代理计费

当需要查询的条目数太多&#xff0c;一页显示不全&#xff0c;需要分页提交sql请求 语法&#xff1a; SELECT 查询列表 FROM 表 LIMIT offset,size;offset代表的是起始的条目索引&#xff0c;也可以省略&#xff0c;默认从0开始 size代表的是显示的条目数 案例&#xff1a;查询…...

公司开发个网站/盘多多网盘搜索

www.163.com转载于:https://blog.51cto.com/testice/259978...

潜江资讯网招聘/如何优化关键词排名快速首页

软件功能测试对于保证软件质量至关重要。一个系统由几个组件组成&#xff0c;这些组件必须全部单独工作&#xff0c;也必须相互工作&#xff0c;才能实现稳健的功能。这些方面必须通过深入的功能测试来验证。软件功能测试的重点仍然主要是可访问性、可用性和主要功能测试。那么…...

全屋定制十大名牌排行2023/北京seo推广外包

在上一篇文章里&#xff0c;我介绍了如何对一个简单的Activity进行单元测试。&#xff08;参见上一篇&#xff09;我们为Activity提供了两个参数LastName和FirstName&#xff0c;Activity会根据这两个参数生成一个Email地址。在上一篇中&#xff0c;我们输入了两个“合法”的参…...

嘉兴品牌网站建设/直接打开百度

最近做了一个小工具&#xff0c;里面涉及到一些取SQL Server 服务器信息的一些东西&#xff0c;找了好久&#xff0c;找到一个不错的&#xff0c;贴出来分享。 系统函数 SERVERPROPERTY ( propertyname ) 包含要返回的服务器属性信息的表达式。propertyname 可以是下列值之一&a…...