OpenFeign

OpenFeign

一、基本使用

1、引入依赖

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

对于loadbalancer做一个解释,开始用的是Ribbon,2020年之后开始使用loadbalancer代替它,两者最主要的区别是,Ribbon是一个较为底层的负载均衡器,需要开发人员手动配置均衡策略和服务发现机制,但是loadbalancer提供了更高层次的抽象,将负载均衡策略和服务发现机制实现了封装,更加容易使用。

2、启动类上添加@EnableFeignClients注解,表示开启OpenFeign

3、编写接口,看代码:

@FeignClient(value = "item-service")
public interface ItemClient {@GetMapping("item/{id}")ResponseEntity<Item> queryById(@PathVariable("id") Integer id);
}

@FeignClient括号里面value对应的值是被请求的服务的名称,接口中的方法就跟在controller里面写的一样,只是不需要实现,需要提供请求方式和路径,例如:@GetMapping("item/{id}"),还需要提供返回值,请求参数,请求参数的注解,都不能少,例如:ResponseEntity<Item> queryById(@PathVariable("id") Integer id),需要将返回值的类从其他服务复制一份过来。

二、原理

1、OpenFeign调用接口没有具体实现,是因为使用了代理,代理类是FeignInvocationHandler实现了InvocationHandler

static class FeignInvocationHandler implements InvocationHandler 

2、FeignInvocationHandler类的主要方法是invoke

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 

 下面是方法的一部分:

     if (!"equals".equals(method.getName())) {if ("hashCode".equals(method.getName())) {return this.hashCode();} else {return "toString".equals(method.getName()) ? this.toString() : ((MethodHandler)this.dispatch.get(method)).invoke(args);}} else {try {Object otherHandler = args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;return this.equals(otherHandler);} catch (IllegalArgumentException var5) {return false;}}}

除了基本的hashCode这样的方法之外,都要走代理invoke方法。代理的过程:

(1)首先根据接口定义的信息创建一个RequestTemplate对象,这个对象从接口获取到请求方法,请求路径,请求参数,服务名称,模板创建完成之后是这样:GET /item/2 HTTP/1.1

 RequestTemplate template = this.buildTemplateFromArgs.create(argv);

(2)根据模板创建一个请求对象Request,此时请求的路径基本成型,只是还有获取到服务的ip和端口,暂时用服务名代替,例如:GET http://item-service/item/2,通过Request对象可以获取到被请求服务的服务列表

Request request = this.targetRequest(template);

(3)通过loadBalancerClient.choose负载均衡,从实例列表中选出一个实例,获取该实例的ip和端口

ServiceInstance instance = this.loadBalancerClient.choose(serviceId, lbRequest);
ServiceInstance是一个实例,大概信息是:

最后拼接成url:

 (4)使用client 类型的delegate发送http请求,但是这里的发送可以优化,使用连接池技术,避免每次创建和销毁链接导致的系统性能开销,推荐使用OKHttp。

优化:

添加依赖

<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>

配置applicaton.yml

feign:okhttp:enabled: true

避坑:

遇到过两个错误

(1)feign/Request$ProtocolVersion

(2)feign.Request$HttpMethod.isWithBody()Z

原因是因为OKHttp依赖的版本和cloud不匹配导致的,我这里用的是这一组,可以参考下:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId><version>10.12</version>
</dependency>

 springboot的版本是:

<version>2.6.13</version>

 三、最佳实践

如果说大量使用到服务之间的通信调用,那么可以将Client单独抽离到一个模块,实现统一维护。

四、OpenFeign日志开启

1、首先是client所在的包的日志级别必须是debug,yml文件的配置如下,包名自己换:

logging:level:com.cart.cartservice: debugpattern:dateformat: HH:mm:ss:SSS

2、编写配置类

public class DefaultFeignConfig {@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.BASIC;}
}

Logger.Level.BASIC是日志级别:

  • NONE:不记录,这是默认值

  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。

  • HEADERS:在BASIC的基础上额外的记录了请求和响应的头

  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

 3、在启动类的注解上添加扫描的包和配置类

@EnableFeignClients(basePackages = "com.cart.cartservice",defaultConfiguration = DefaultFeignConfig.class)

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

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

相关文章

k8s的网络

k8s的网络 k8s中的通信模式&#xff1a; 1、pod内部之间容器与容器之间的通信 在同一个pod中的容器共享资源和网络&#xff0c;使用同一个网络命名空间&#xff0c;可以直接通信的 2、同一个node节点之内&#xff0c;不同pod之间的通信 每个pod都有一个全局的真实的ip地址…

BMS均衡技术

一、电池的不一致性&#xff1f; 每个电池都有自己的“个性”&#xff0c;要说均衡&#xff0c;得先从电池谈起。即使是同一厂家同一批次生产的电池&#xff0c;也都有自己的生命周期、自己的“个性”——每个电池的容量不可能完全一致。例如以下的两个原因都会造成电池不一致…

docker部署mysql

1.查找mysql镜像 [rootVM-4-5-centos ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-sourc…

AnyText:多语言视觉文字生成与编辑——最详细傻瓜式安装教程

先看图,下面都是AnyText生成的,可以说效果效果确实是很震撼了。 附上地址: GitHub - tyxsspa/AnyTextContribute to tyxsspa/AnyText development by creating an account on GitHub.https://github.com/tyxsspa/AnyText接下来开始详细讲解安装过程: 1. 下载项目 (1)下…

探讨JVM垃圾回收机制与内存泄漏

目录 1. 垃圾回收机制的基本原理 2. 内存泄漏的定义与表现 3. 垃圾回收机制的局限性 4. Finalizer导致的延迟 5. 不当使用静态集合 6. JNI资源未释放 7. 解决内存泄漏的方法 8. 结语 在Java虚拟机&#xff08;JVM&#xff09;的世界中&#xff0c;垃圾回收机制被设计用…

电磁波的信号加载说明

电磁波的信号加载电磁波(Electromagnetic wave)是由同相振荡 且互相垂直的电场与磁场在空间中衍生发射的振荡粒子波&#xff0c;是以波动的形式传播的电磁场&#xff0c;具有波粒二象性&#xff0c;其粒子形态称为光子&#xff0c;电磁波与光子不是非黑即白的关系&#xff0c;而…

外显和呼叫系统的关系

经常接到推销电销&#xff0c;对于不同号码显示&#xff0c;我们选择接听电话和挂断电话的概率也是不一样的。 我们接到号码有显示运营商和归属地名称。 例如&#xff1a;北京 移动&#xff0c;广东深圳 电信&#xff0c;广电&#xff0c;广东广州 虚拟运营商等&#xff1b; 有…

快速打通 Vue 3(二):响应式对象基础

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…

Flink-【时间语义、窗口、水位线】

1. 时间语义 1.1 事件时间&#xff1a;数据产生的事件&#xff08;机器时间&#xff09;&#xff1b; 1.2 处理时间&#xff1a;数据处理的时间&#xff08;系统时间&#xff09;。 &#x1f330;&#xff1a;可乐 可乐的生产日期 事件时间&#xff08;可乐产生的时间&…

算法导论复习——CHP24 单源最短路

单源最短路径问题&#xff1a; 给定一个图G (V,E)&#xff0c;找出从给定的源点s∈V到其它每个结点v∈V的最短路径。 这样最短路径具有最优子结构性&#xff1a;两个结点之间的最短路径的任何子路径都是最短的。 基本概念 负权边&#xff1a;权重为负值的边称为负权重的边。 如…

Vue3+TS+ElementPlus的安装和使用教程【详细讲解】

前言 本文简单的介绍一下vue3框架的搭建和有关vue3技术栈的使用。通过本文学习我们可以自己独立搭建一个简单项目和vue3的实战。 随着前端的日月更新&#xff0c;技术的不断迭代提高&#xff0c;如今新vue项目首选用vue3 typescript vite pinia……模式。以前我们通常使用…

webpack知识点总结(高级应用篇)

除开公共基础配置之外&#xff0c;我们意识到两点: 1. 开发环境(modedevelopment),追求强大的开发功能和效率&#xff0c;配置各种方便开 发的功能;2. 生产环境(modeproduction),追求更小更轻量的bundle(即打包产物); 而所谓高级应用&#xff0c;实际上就是进行 Webpack 优化…

计算机组成原理-期末复习

目录 第一章——计算机系统概述 一、数字计算机的主要组成结构 二、指令的形式 三、控制器的基本任务 四、指令流和数据流 五、适配器与输入/输出设备 七、计算机的系统软件 八、C 语言的转换层次图 九、计算机系统的层次结构图 第二章——运算方法和运算器 一、 数据格式…

javascript之跳转页面的几种方法?

文章目录 前言代码演示及解释使用location.href属性使用location.assign()方法使用location.replace()方法使用window.open()方法使用document.URL方法 总结 前言 本章学习的是JavaScript中的跳转页面的几种方法 代码演示及解释 使用location.href属性 可以直接将一个新的URL…

企业如何做好客户管理?有哪些关键因素?

客户管理是建立和维护客户关系的重要组成部分&#xff0c;对于企业的发展至关重要。下面就让我们来看看在做好客户管理时有哪些关键因素吧。 第一个关键因素是提供优质的客户服务。无论是线上还是线下&#xff0c;当客户需要帮助时&#xff0c;他们希望能够得到有效且及时的支持…

sqlserver根据分组的内容分别查询出匹配的一条信息

需求场景&#xff1a; 我写了条分组语句&#xff0c; select name from car_machine_command group by name 然后该表有很多条相关的数据&#xff0c;我只想拿各个分组的一条数据看看即可 解决&#xff1a;可以使用窗口函数&#xff08;Window Function&#xff09;和 ROW_NU…

Dora-rs 机器人框架学习教程(1)—— Dora-rs安装

1、dora简介 Dora-rs[1] 是一个基于 Rust 实现的化机器人框架&#xff0c;其具有极高的实时性能。Dora-rs使用Rust语言做数据流的传输和调度管理&#xff0c;可以大大减少了数据的重复拷贝和传输。它提供了Rust语言和Python语言之间的无缝集成&#xff0c;减少了跨语言的性能代…

阿里云服务器Valheim端口2456、2457和2458放行设置

使用阿里云服务器搭建Valheim英灵神殿需要开启2456-2458端口&#xff0c;阿里云服务器默认只开放了22核3389端口&#xff0c;开通2456端口是在安全组中配置的&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器安全组开通端口流程&#xff1a; 阿里云服务器安…

中国供应链,出海大时代

尽量优化、打通跨境电商每一个参与方的物流、商流、信息流、资金流是电商供应链出海的解题之法。这个过程中数智化便是打通这些节点的钥匙。 作者|斗斗 编辑|皮爷 出品|产业家 “速卖通加持&#xff0c;阿里国际零售商业收入同比上涨73%”“拼多多发布Q3财报同比增长94%…

基于Java SSM框架实现中国古诗词学习平台项目【项目源码】

基于java的SSM框架实现中国古诗词学习平台系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用…