声明式服务调用OpenFeign

news2025/2/24 7:23:38

文章目录

  • 一. OpenFeign
      • 1. Feign 与 OpenFeign
  • 二. OpenFeign的使用
  • 三. OpenFeign自定义配置
      • 1. 修改日志级别
      • 2. 超时控制
  • 四. OpenFeign性能优化
  • 五. OpenFeign最佳实践
      • 1. 继承
      • 2. 抽取


PS: 本文为作者学习笔记,实际技术参加意义不大,本文将持续改进完善。

一. OpenFeign

OpenFeign是一个声明式的http客户端,SpringCloud生态中服务调用的一个组件。
相关的服务调用组件还有: Feign、Ribbon、LoadBalancer等等
官方地址:点击跳转
其作用就是帮助我们优雅的实现http请求的发送

1. Feign 与 OpenFeign

Feign:
Feign,是Spring Cloud组件中的一个轻量级RESTfulE的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口就可以调用服务注册中心的服务。
依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

OpenFeign
OpenFeign,是Spring Cloud在Feign的基础上支持了SpringMVC的注解如@RequesMapping等等。OpenFeign的@FeignClienti可以解析,SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
依赖:

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

PS: 其实完全可以将OpenFeign理解为Feign的升级版。

二. OpenFeign的使用

想要使用OpenFeign,首先需要引入OpenFeign的依赖:

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

然后在模块的主启动类上添加 @EnableFeignClients 注解,如下:

@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class,args);
    }
}

然后就可以开始编写客户端代码(声明式的方式)如下:
在这里插入图片描述
其中 userservice 是注册中心中的服务名、请求方式是 get 、请求路径是 /user/{id}
使用时我们只要使用自动注入的方式生成一个接口实例调用其中的方法即可:

@Autowired
private UserClient userClient;
// 调用
User user = userClient.findById(order.getUserId());

值得注意的是: OpenFeign中集成了ribbon,自带负载均衡。

三. OpenFeign自定义配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
在这里插入图片描述
日志级别说明:

  1. 【NONE】也是默认的日志级别,就是没有日志
  2. 【BASIC】当发起一次hppt请求时会帮我们记录下来请求什么时候发起的已经什么时候结束的,耗时等基本信息。
  3. 【HEADERS】除了上面basic的基本信息以外,还会带上请求头等信息
  4. 【FULL】在上面basic的基础上还会加上请求体响应体等信息记录下来

PS: 顺嘴提一句失败重试机制,就是请求服务失败,一段时间后会自动请求其他相同业务的服务实例,直到拿到结果,或者全部请求失败。

1. 修改日志级别

一般我们使用的最多的就是修改日志级别,一般有两种方式,一种是通过配置来修改日志级别,另一种方式是通过java代码的方式进行日志级别的修改:
方式一: 配置文件方式
全局配置:

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

局部配置:

feign: 
	client:
	  config:
		  userservice:  
			  loggerLevel: FULL  #日志级别

方式二: java代码配置方式
使用Bean的方式进行配置:

public class FeignclientConfiguration{
	@Bean
	public Logger.Level feignLogLevel(){
		return Logger.Level.BASIC;
		}
}

如果是全局配置则放到: 启动类上面的注解

@EnableFeignclients(defaultConfiguration FeignclientConfiguration.class)

如果是局部配置则放到: 调用接口上的注解,通过value的值指定配置的微服务名

@Feignclient(value "userservice",configuration FeignclientConfiguration.class)

2. 超时控制

根据服务业务功能的不同服务接口调用的时间也会不同,但是OpenFeign的底层是ribbon,默认的等待时间是1秒钟,超过一秒调用时间就会报错, 这显然是不合理的。
为了避免上述情况这时我们就需要在配置文件中修改等待的时间:

#设置feign客户端超时时间(OpenFeign默认支ribbon)
ribbon:
	#指的是建立连接所用的时间,适用于网路状况正常的情况下,两端连接所用的时间
	ReadTimeout: 5000  #5 秒的意思
	#指的是建立连接后从服务器读取到可用资源所用的时间
	ConnectTimeout: 5000

四. OpenFeign性能优化

OpenFeign的性能虽然已经很不错,但是还是存在优化的余地,底层客户端实现:

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

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

  1. 使用连接池代替默认的URLConnection
  2. 日志级别,最好用basic或none (减少性能损耗)

关于日志上一章已经讲解过了,那么接下来还是着重聊修改连接池,这里就以修改为HttpClient为例子:
首先先引入依赖:

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

然后进行连接池的配置:
具体参数根据业务需求调整

feign: 
	client:
	  config:
		  default:
			  loggerLevel: NONE # 日志级别
	httpclient:
		enabled: true #开启feign对Httpclient的支持
		max-connections: 200 #最大的连接数
		max-connections-per-route: 50 #每个路径的最大连接数

五. OpenFeign最佳实践

1. 继承

方式一: 给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
在这里插入图片描述
但是这种方法也存在一定的问题,比如耦合度比较高,且方法参数也是继承不下来的。

2. 抽取

方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的pojo、默认的Feign配置都放到这个模块中,消费者通过引入该模块调用方法发送http请求。
在这里插入图片描述
但是这种方法也是有缺点的,可能会将一些多余的调用方法引入到模块。
值得注意的是:消费者启动类上还是得使用@EnableFeignClients注解
在这里插入图片描述

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

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

相关文章

Doris(二)

目录1、Doris数据的导入和导出1.1 数据导入1.1.1 Broker Load1.1.1.1 适用场景1.1.1.2 基本原理1.1.1.3 基本语法1.1.1.4 导入示例1.1.1.5 查看导入1.1.1.6 取消导入1.1.2 Stream Load1.1.2.1 适用场景1.1.2.2 基本原理1.1.2.3 基本语法1.1.2.4 导入示例1.1.2.5 取消导入1.1.3 …

蓝牙耳机什么牌子好?性价比最高的蓝牙耳机排行榜

近年来&#xff0c;蓝牙耳机品牌与日俱增&#xff0c;可供人们选择的范围也越来越大。当然&#xff0c;主打性价比的蓝牙耳机品牌也有很多&#xff0c;下面&#xff0c;我来给大家分享几款性价比最高的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳机 售价&#…

寒潮来袭,这款产品在跨境电商市场卖脱销

年底的寒潮来袭&#xff0c;全球市场热销产品分析跨境电商在年底冬季属于销售旺季&#xff0c;大多数的跨境电商卖家们都开始尽情努力&#xff0c;争取今年获得大批收入&#xff0c;在这个年底既是旺季也是困难季。2022年底旺季时分&#xff0c;有不少产品在跨境电商市场卖脱销…

jQuery index()

jQuery index() 概述 在jQuery中&#xff0c;我们可以使用index()方法来获取当前jQuery对象集合中“指定元素”的索引值。 语法 $(元素).index()说明 index()方法可以接受一个“jQuery对象”或“DOM对象”作为参数&#xff0c;不过一般情况下&#xff0c;我们很少会使用到…

Idea常用快捷键(MacOS和Win平台)持续更新ing~

小名在刚换MacOS系统时总结的一些Idea快捷键&#xff0c;这里小名把Win的对比快捷键和功能都列出来&#xff0c;方便像小名这样“肌肉记忆”的小伙伴顺利过渡&#xff5e; 当然&#xff0c;这些都是小名平日工作常用的快捷键&#xff0c;不熟悉这些快捷键的Win平台小伙伴也可以…

springboot的核心注解详解

springboot的注解详解 Spring Boot 主要优势之一&#xff0c;就是“开箱即用&#xff0c;远离繁琐的配置”。 Spring Boot 架构没有代码生成&#xff0c;也不需要XML配置&#xff0c;有效避免大量的 Maven 导入和各种版本冲突&#xff0c;为 Spring 开发提供一个更快、更广泛…

数字ic后端|分享后端项目中一次分析解决问题的过程

后端ICer经常会在项目中遇到问题&#xff0c;如何解决问题&#xff0c;则体现出经验。今天遇到的一个问题&#xff0c;这里做个记录。同时也希望通过读这篇文章&#xff0c;你也能增加一个解决问题的经验。 相对来说&#xff0c;前端更多的是理论&#xff0c;后端更多的是需要…

Java基础:Lambda表达式方法引用

在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿什么参数做什么操作。那么考虑一种情况&#xff1a;如果我们在Lambda中所指定的操作方案&#xff0c;已经有地方存在相同方案&#xff0c;那是否还有必要再写重复逻辑&#xff1f;…

学习Python中turtle模块的基本用法(6:其它函数)

除了之前文章中介绍的turtle模块的绘图函数&#xff0c;本文从turtle帮助文档中梳理了其它绘图或状态函数&#xff0c;编写复杂的绘图函数时也用得到&#xff0c;函数清单如下表所示&#xff1a; 序号函数名称说明1turtle.home返回初始坐标 (0,0)&#xff0c;并设置朝向为初始…

MySQL重复与不重复问题

1.查询某个字段不重复的记录 当某个字段有重复的数据&#xff0c;而其他字段数据不一样时&#xff0c;需要查询这些不重复的记录&#xff0c;可以使用distinct关键字配合group by进行查询。 1&#xff09;先看所有的数据 2&#xff09;根据name查询不重复的记录 基本语法 s…

记一次线上fullgc----数据库查询返回大量数据

背景 某服务线上16台机器&#xff0c;晚上八点左右有4台机器突然出现fullgc&#xff0c;而且不止一次 处理流程 1&#xff09;发现机器full gc告警时&#xff0c;立即dump出机器内存快照 2&#xff09;下线问题机器 3&#xff09;分析内存快照&#xff0c;找到问题对象 可以…

JAVA中IO面试题

1.什么是IO I:Input O:Output 通过IO可以完成硬盘文件的读和写。 IO流又叫输入输出流 &#xff0c;输入和输出均是以内存作为参照物。 2. I/O流的分类? 2.1 输入流&#xff0c;输出流 以内存作为参照物&#xff0c; 往内存中去&#xff0c;叫做输入&#xff0c;或者叫做读…

【OpenFeign】【源码+图解】【六】创建FeignClient接口的代理(下)

【OpenFeign】【源码图解】【五】创建FeignClient接口的代理&#xff08;上&#xff09; 目录6.2 RequestTemplate.Factory6.3 创建SynchronousMethodHandler6.4 创建FeignInvocationHandler7. FeignInvocationHandler处理HTTP请求6.2 RequestTemplate.Factory 先看下类图 从类…

sql查询中遇到的一些小小注意点

1.sql子查询 // 最外层查询是查子查询中查询出来的结果 SELECTserverId,sum(revenue) as revenue,sum(orderCount) as orderCount,sum(refundCount) as refundCount,sum(guideRevenue) as guideRevenue,sum(cardCount) as cardCount,sum(activityCount) as activityCount,sum(…

笔试强训(7)

第一题:两种排序方法(网易)两种排序方法_牛客题霸_牛客网 题目描述:考拉有N个字符串&#xff0c;任意两个字符串的长度都不是相同的&#xff0c;考拉现在学习到了两种字符串的排序方法 1)根据字符串的字典序排序&#xff0c;比如说 "car"<"carriage"<…

CodeQL的自动化代码审计之路(下篇)

0x01 前言 CodeQL的自动化代码审计之路&#xff08;上篇&#xff09; CodeQL的自动化代码审计之路&#xff08;中篇&#xff09; 在上一篇文章中&#xff0c;我们基于CodeQL官方提供的sdk实现了自动化查询数据库功能&#xff0c;在文章中也提到实现完整的自动化代码审计还缺…

ggokabeito | 一般般啵~支持ggplot2和ggraph的配色包!~

1写在前面 天真的好冷啊&#xff0c;不知道各位穿秋裤了没有&#xff0c;有没有感冒。&#x1f618; 这期就介绍一下ggokabeito包&#xff0c;是一个支持ggplot2和ggraph的即用型配色包&#xff0c;喜欢就去安装吧。&#x1f92a; 再放一张去年拍的雪人照片&#xff0c;哈哈哈哈…

socket网络编程的5大误区

隐患 1&#xff0e;忽略返回状态 第一个隐患很明显&#xff0c;但它是开发新手最容易犯的一个错误。如果您忽略函数的返回状态&#xff0c;当它们失败或部分成功的时候&#xff0c;您也许会迷失。反过来&#xff0c;这可能传播错误&#xff0c;使定位问题的源头变得困难。 捕…

c++算法基础必刷题目——枚举

文章目录枚举算法1、铺地毯2、回文日期枚举算法 枚举算法是我们在日常中使用到的最多的一个算法&#xff0c;它的核心思想就是:枚举所有的可能。   枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件&#xff1a;   (1)可预先确定候选答案的数量…

[Square 2022] Hard Copy 复现

原来一直没弄过TLS的流&#xff0c;今天看到一个WP&#xff0c;按这个一步步重来一遍。 Square的题目会一直开放下载 原题点这里 下来后的数据包包含一个go的原码程序和一个流量包 流量是经过加密的&#xff0c;所以看不到内容。 第一步就是取得RSA的公钥。先在包里找到 S…