Java面试——中间件

OpenFeign

1、openFeign是一个HTTP客户端,它融合了springmvc的注解,使之可以用REST风格的映射来请求转发。
2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射,亦或是作为service层处理逻辑,只不过这里,openFeign只是做一个请求转发的逻辑操作。
3、openFeign整合了hystrix做熔断处理,同时,可以和ribbon客户端负载均衡、Eureka注册中心配合使用,实现负载均衡的客户端。
4、openFeign有一个很重要的功能:fallback,其实它是hystrix的特性

Feign

Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,只不过对原有的方式(Ribbon+RestTemplate)进行了封装,开发者不必手动使用RestTemplate调服务,而是定义一个接口,在这个接口中标注一个注解即可完成服务调用,这样更加符合面向接口编程的宗旨,简化了开发。

OpenFeign的工作原理

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

OpenFeign远程调用的底层原理
OpenFeign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。它的底层原理主要基于几个关键组件的协作:

「核心组件」

「Feign Client」
在OpenFeign中,你可以通过创建一个接口并使用@FeignClient注解来定义一个Feign客户端。这个接口定义了服务的请求绑定,参数和回调处理。

「Contract」
Contract定义了如何将方法调用转换为HTTP请求。默认情况下,Feign使用自己的注解,但是也可以配置为使用JAX-RS或Spring MVC注解。

「Encoder & Decoder」
「Encoder」: 负责将Java对象编码成HTTP请求体。
「Decoder」: 负责将HTTP响应体解码成Java对象。

「Client」
Client是一个用于发送请求的组件。Feign有多个Client实现,如默认的Java HttpURLConnection、Apache HttpClient和OkHttp。

「Logger」
Feign提供了日志机制来记录HTTP请求和响应的详细信息。

OpenFeign 工作流程

  • 「接口定义」: 开发者定义一个接口,并使用@FeignClient注解来标记它需要调用的远程服务。
  • 「动态代理」: 当应用启动时,Spring Cloud Feign会为这个接口生成一个动态代理。
  • 「构造请求」: 当调用接口的方法时,Feign通过Contract组件将方法调用转换为HTTP请求。
  • 「编码请求」: Encoder组件将方法参数等信息编码成请求体。
  • 「发送请求」: Client组件负责发送实际的HTTP请求到服务端。
  • 「处理响应」: 服务端处理请求并返回响应,Decoder组件将响应体解码成Java对象。
  • 「异常处理」: 如果在调用过程中发生错误,Feign会使用ErrorDecoder组件来处理异常。
  • 「结果返回」: 最终,调用结果会返回给方法的调用者。
  • 「负载均衡」OpenFeign与Spring Cloud LoadBalancer或Netflix Ribbon集成,可以实现客户端负载均衡。当有多个实例提供相同服务时,Feign会根据负载均衡策略选择一个实例来发送请求。

「总结」
OpenFeign的底层原理是通过动态代理技术,将接口的方法调用转换为HTTP请求,并通过Client组件发送到远程服务。它通过Encoder和Decoder处理请求和响应的编码和解码,并且可以与负载均衡器集成以实现服务的高可用性。

OpenFeign如何使用

  1. 首先,调用以及被调用的微服务双方都应该被注册到注册中心。
  2. Spring Boot启动APP上标注 @EnableFeignClients注解。
  3. 编写远程调用接口并标注@FeignClient注解。(括号内添加所要调用的微服务名称)
  4. 接口中的方法为实际想要调用的服务的方法签名,并使用@PostMapping注解映射为一个post类型的HTTP请求。

Feign是如何实现自动处理多个不同服务器上的服务的?

如果Feign调用服务冲突怎么办?

超时如何处理

如果openFeign没有设置对应得超时时间,那么将会采用Ribbon的默认超时时间,Ribbon的默认超时连接时间、读超时时间都是是1秒。
设置openFeign的超时时间

default设置的是全局超时时间,对所有的openFeign接口服务都生效

feign:client:config:## default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间default:connectTimeout: 5000readTimeout: 5000

给serviceC这个服务单独配置一个超时时间,配置如下:

feign:client:config:## default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间default:connectTimeout: 5000readTimeout: 5000## 为serviceC这个服务单独配置超时时间serviceC:connectTimeout: 30000readTimeout: 30000

Feign和OpenFeign有什么区别?

FeignopenFiegn
Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

OpenFeign 夺命连环 9问

Http和RPC有什么区别?

  • Http是一种基于文本传输的应用层协议,定义的是远程通讯的规范;RPC是一种远程过程调用协议,它允许一个网络节点的程序调用另一个网络节点的程序的函数或者方法就像调用本地函数。
  • Http主要用于跨越互联网传输数据,适用于面向网络的通讯。 而RPC是用于实现跨机器或者进程之间的通讯,适合用于面向应用程序的通讯。

Dubbo和OpenFeign的区别

  • 应用场景。Dubbo是一个基于RPC的分布式服务框架,它提供了服务注册发现和远程通讯。适用于高性能、高可靠性和复杂服务治理的场景。提供了负载均衡、超时处理和熔断降级等功能。 OpenFeign是一个声明式的客户端,它简化了基于Http的远程通讯过程,适用于简单的微服务场景,特别是当你的微服务使用Http通讯并且希望通过接口来定义客户端调用的时候。它可以把Http请求转化为Java接口方法的调用。

消息队列

为什么使用消息队列/应用场景

消息队列的场景使用场景很多,主要是三个:解耦、异步、和削峰。

解耦

一个系统或者一个模块,调用了多个系统,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要同步调用接口的,如果用MQ给他异步化解耦,也是可以的,这个时候可以考虑在自己的项目中,是不是可以运用这个MQ来进行系统的解耦。

在这里插入图片描述

通过一个MQ,发布和订阅模型,Pub/Sub模型,系统A就和其它系统彻底解耦。

异步

在这里插入图片描述系统A只需要发送消息到MQ中就直接返回了,然后其它系统各自在MQ中进行消费。用户在执行系统A的时候,就会感觉非常快就得到响应了。

削峰

在这里插入图片描述
削峰就是大量的请求过来,然后MQ将其消化掉了,然后通过其它系统从MQ中取消息,在逐步进行消费,保证系统的有序运行。一般高峰期不会持续太长,在一段时间后,就会被下游系统消化掉。

RocketMQ

在这里插入图片描述

如何保证消息的可靠性传输,要是消息丢失了怎么办?

在这里插入图片描述

生产者、broker、消费者在哪些阶段会发生消息丢失?
生产阶段:网络故障
Broker存储阶段:异步刷盘失败
消费者:消费消息失败

在这里插入图片描述

生产者:
同步/异步

  • confirm机制
  • 重试机制
    broker:异步刷盘成功后再返回ack
    消费者:消费成功后再ack

在这里插入图片描述

RocketMQ的消息持久化机制

RocketMQ的消息持久化机制是指将消息存储在磁盘上,以确保消息能够可靠地存储和检索。
三个角色:CommitLog、ConsumeQueue和IndexFile

  • CommitLog:所有的消息都存储在CommitLog文件中。
    RocketMQ默认会将消息数据线存储在内存的一个缓冲区中,每当缓冲区中积累了一定量的消息或者一定时间过后,就会将缓冲区中的消息批量写入到磁盘上的CommitLog文件中。消息在写入CommitLog文件后就可以被消费者消费了。
    CommitLog文件大小固定1G,写满之后生成新的文件,并且采用的是顺序写的方式。
  • ConsumeQueue:消息消费逻辑队列,类似数据库的索引文件
    RocketMQ中每个主题下的每个消息队列都会对应一个ConsumeQueue。ConsumeQueue存储了消息的offset和该offset对应的消息在CommitLog文件中的位置,便于消费者快速定位并消费消息。
    每个ConsumeQueue文件固定由30万个固定大小20byte的数据块组成;数据块内容包括:msgPhyOffset(8byte,消息在CommitLog文件中的起始位置)+msgSize(4byte,消息在CommitLog文件中占用的长度)+msgTag(8byte,消息的tag的哈希值)。
  • IndexFile:消息索引文件,主要存储消息Key与offset的对应关系,提升消息检索速度。
    如果生产者在发送消息时设置了key,那么RocketMQ会将消息Key值和消息的物理偏移量(offset)存储在IndexFile文件中,这样消费者需要根据消息Key查询消息时,就可以直接在IndexFile文件中查找对应的offset,然后通过ConsumeQueue文件快速定位并消费消息。
    IndexFile文件大小固定400M,可以保存2000w个索引。

在这里插入图片描述

如何保证消息的顺序性?

队列有序

发送顺序
消费顺序
发送到同一个队列中

内存队列:同一个订单的消息存储到一个队列中 再由消费线程消费

如何保证消息队列的高可用?

高可用的,如果整个系统仅仅靠着一个 Broker 来维持的话,那么这个 Broker 的压力会不会很大?
Nameserver提供Broker 管理 和 路由信息管理。使用多个 Broker 来保证 负载均衡 。

如何保证消息不被重复消费?如何保证消息消费时的幂等性?

业务端做幂等性 唯一ID

你说被重复消费的话能设立唯一ID,那么设立唯一ID是怎么做的?

消息积压怎么解决

先修复Consumer的问题
将堆积的消息写入到另外的主题中
用更多的机器部署Consumer,消费消息

XXL-JOB

路由策略

在这里插入图片描述

任务执行失败怎么解决?

在这里插入图片描述
在这里插入图片描述

如果有大数据量的任务同时都需要执行,怎么解决?

在这里插入图片描述

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

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

相关文章

C++ priority_queue简单源码剖析:priority_queue模拟实现

文章目录 1. priority_queue介绍2. priority_queue模拟实现3. 适配器与虚函数 大家好!本文会用C模拟一个基本的priority_queue类,帮助我们更好的理解priority_queue的内置函数的实现与规则。 1. priority_queue介绍 priority_queue被叫做优先队列&#…

ESP使用巴法云远程OTA(VScode + Platform io)

ESP使用巴法云远程OTA(Platform) 什么是OTA: OTA(Over-the-AirTechnology)即空中下载技术,是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。OTA升级是物联网(IOT&am…

【C++初阶学习】第十二弹——stack和queue的介绍和使用

C语言栈:数据结构——栈(C语言版)-CSDN博客 C语言队列:数据结构——队列(C语言版)-CSDN博客 前言: 在之前学习C语言的时候,我们已经学习过栈与队列,并学习过如何使用C语言来实现栈与队列&…

企业软件产品和服务 之 设计保证安全 七项承诺

1. 引言 公司如何保护自己免受数据泄露的影响?标准答案就是: “启用多因素身份验证”——MTA(Enable multifactor authentication)。 但是,目前很多公司仍然盲目地只使用密码作为唯一的身份来源。 网络安全的核心是…

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中,Bug 是一个我们无法回避的话题。 2、Bug,简单来说,就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…

步进电机双闭环细分控制(matlab仿真)内含课设等参考文件

1.1 步进电机工作原理 步进电机是一种用电脉冲进行控制,将电脉冲信号转换成相位移的电机,其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比,每一个脉冲信号可使步进电机旋转一个固定的角度。脉冲的数量决定了旋转的总角度,脉…

英伟达开源新利器NV-Embed向量模型,基于双向注意力的LLM嵌入模型,MTEB 56项任务排名第一

前言 文本嵌入模型能够将文本信息转化为稠密的向量表示,并在信息检索、语义相似度计算、文本分类等众多自然语言处理任务中发挥着关键作用。近年来,基于解码器的大型语言模型 (LLM) 开始在通用文本嵌入任务中超越传统的 BERT 或 T5 嵌入模型&#xff0c…

企业打款验证API在Java、Python、PHP中的使用教程

随着企业银行账号数量的增加和银行间的连接方式不断丰富,企业在进行资金交易时需要确保所填写的收款方账户信息的准确性和合法性,以避免资金损失和风险。然而,由于银行数量众多、地域分布广泛,不同银行间的账户验证机制和信息交互…

网络编程(八)

网络编程(八) 数据库数据库的分类基于嵌入式的数据库什么是SQLite?为什么使用SQLite?sqlite3数据库的安装 sqlite3中的点命令.open 数据库文件名字.tables [数据库文件名].schema 表名.database.quit.head on.mode column SQLite数据库中的数据类型SQL…

【Linux】Linux环境基础开发工具_4

文章目录 四、Linux环境基础开发工具gcc和g动静态库的理解 make和MakefileLinux小程序---进度条 未完待续 四、Linux环境基础开发工具 gcc和g 动静态库的理解 动态库的优点:比较节省资源,不会出现太多重复代码。 动态库的缺点:对库的依赖性…

C语言 数组——数组的其他应用之筛法求素数

目录 数组的其他应用 求100以内的所有素数 筛法求100以内的所有素数 自顶向下、逐步求精设计算法 数组的其他应用 求100以内的所有素数 筛法求100以内的所有素数 自顶向下、逐步求精设计算法 step 1:设计总体算法  初始化数组a,使a[2]2, a[3]3,..…

算法 java 排序和查找

排序和查找 冒泡排序(稳定)选择排序(不稳定)插入排序(稳定)希尔排序(不稳定)归并排序(稳定)快速排序(不稳定)堆排序计数排序桶排序基数…

C++设计模式——Adapter适配器模式

一,适配器模式简介 适配器模式是一种结构型设计模式,用于将已有接口转换为调用者所期望的另一种接口。 适配器模式让特定的API接口可以适配多种场景。例如,现有一个名为"Reader()"的API接口只能解析txt格式的文件,给这…

【AR开发-开源框架】使用Sceneform-EQR快速开发AR应用,当前接入了AREngine、ORB-SLAM,可快速地适配不同的安卓设备

Sceneform-EQR Sceneform 概览 Sceneform是一个3D框架,具有基于物理的渲染器,针对移动设备进行了优化,使您可以轻松构建增强现实应用程序,而无需OpenGL。 借助 Sceneform,您可以轻松地在 AR 应用和非 AR 应用中渲染…

Caused by: java.rmi.server.ExportException: Port already in use: 1100;解决方案

Caused by: java.rmi.server.ExportException: Port already in use: 1100; 根据端口号找占用程序的进程号 netstat -ano|findstr 1100 最右边那个数字就是进程号 在任务管理器中 详细信息,点击pid即可按照进程号排序,找到相应的进程,判断…

盲盒小程序预售机制的设计与实施

随着盲盒市场的不断发展,预售机制逐渐成为商家吸引用户、提升销售额的重要手段。本文将探讨盲盒小程序预售机制的设计与实施,以帮助商家更好地满足用户需求并优化库存周转率。 一、预售机制设计原则 在设计预售机制时,商家需要遵循以下几个…

基于 vue-element-template 框架添加 tagsview

1. 需求 vue-element-template 是一个基础模板,默认没有 tagsview。所以要手动添加。 参考最全面的集成方案框架 vue-element-admin ,拷贝和修改相关文件到你的项目中。 2. 修改 复制如下文件或文件夹 \src\layout\components\TagsView\src\store\mo…

Docker基础篇之本地镜像发布到阿里云

文章目录 1. 本地镜像发布到阿里云的流程2. 阿里云开发平台3. 将自己的本地镜像推送到阿里云 1. 本地镜像发布到阿里云的流程 阿里云ECS Docker生态如下图所示: 2. 阿里云开发平台 在控制台找到容器和镜像服务: 然后创建一个个人实例: 下面…

号称超级增程电动,领克07EM-P带来技术变革?

近年来,自主品牌在新能源汽车领域百花齐放,尤其是在混合动力市场上,比亚迪的DM-i技术引领了风潮,秦L的一经亮相,整个车圈都沸腾了,“超级混动”的概念深入人心。 各大自主品牌都有了自己的混动平台和技术。…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一:大乐透号码生成器 使用Random模块模拟大乐透号码生成器。选号规则为:前区在1~35的范围内随机产生不重复的…