1,什么是过滤器
回答:
过滤器(Filter),是 Servlet 规范规定的,在 Servlet 前执行的。用于拦截和处理 HTTP 请求和响应,可用于身份认证、授权、日志记录和设置字符集(CharacterEncodingFilter)等场景。
过滤器位于整个请求处理流程的最前端,因此在请求到达 Controller 层前,都会先被过滤器处理。
过滤器可以拦截多个请求或响应,一个请求或响应也可以被多个过滤器拦截。
2,什么是拦截器
回答:
拦截器(Interceptor),和Servlet无关,由Spring框架实现。可用于身份认证、授权、日志记录、预先设置数据以及统计方法的执行效率等。
一般基于 Java 的反射机制实现,属于AOP的一种运用。
HandlerInterceptor 拦截器
HandlerInterceptor 类似 Filter,拦截的是请求地址,但提供更精细的的控制能力,这里注意下必须过DispatcherServlet 的请求才会被拦截。
它允许你在请求处理前、处理后以及视图渲染完成前执行自定义逻辑,可以用来对请求地址做一些认证授权、预处理,也可以计算一个请求的响应时间等,还可以处理跨域(CORS)问题。
简单的执行流程描述:
请求到达 DispatcherServlet,然后发送至 Interceptor,执行 preHandler;
请求到达 Controller,请求结束后,执行 postHandler。
3.Eureka和nacos和区别,介绍Eureka,怎么介绍,架构的时候怎么在这两个直接进行选择
回答:介绍:
Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。
Eureka,springcloud的组件
Nacos主要提供了服务注册、发现、配置管理、动态DNS服务等功能。
而Eureka则主要关注于服务注册与发现
Nacos支持CP(一致性)和AP(可用性)两种模式,而Eureka只支持AP模式。
Nacos使用netty,是长连接;而Eureka是短连接,定时发送。
Nacos提供了统一的配置管理平台,可用于管理和动态更新分布式系统中的配置信息,如数据库连接、参数设置等。
而Eureka主要关注于服务注册与发现。
Nacos支持动态DNS服务,允许根据服务名动态解析到具体的IP地址,为服务调用提供更灵活的选择。
而Eureka在这方面的支持相对较少。
选择:
如果你只需要一个简单的服务发现和配置管理解决方案,那么 Eureka就可以了。
而如果你需要一个更全面的平台来管理你的应用,并且希望有更多的功能和灵活性,那么Nacos 更合适,
Nacos主要提供了服务注册、发现、配置管理、动态DNS服务等功能等。
4.mq主要的场景,
回答:主要三种功能
1,异步处理:场景说明:用户注册后,需要发注册邮件和注册短信
2,应用解耦 :场景说明:用户下单后,订单系统需要通知库存系统
3,流量削峰:秒杀活动,一般会因为流量过大,导致流量暴增,应用容易挂掉。为解决这个问题,一般需要在应用前端加入消息队列
5.使用分布式锁,注意什么
回答:使用redis分布式锁:
1、锁的一致性:在Redis集群中,锁的数据会被分布在多个节点上。由于网络延迟和节点间的数据同步延迟,可能会导致锁的一致性问题。
2、节点故障:Redis集群中的节点可能会发生故障,导致锁的不可用或丢失。当一个节点故障时,可能会导致锁的无法释放或锁的状态丢失,进而影响到其他客户端的锁获取和系统的一致性。
3、锁的有效期:在Redis集群中,由于数据分布在多个节点上,可能导致锁的有效期无法得到及时更新。
6.rocketmq和rabbitmq的区别,怎么挑选
回答:
区别:
RabbitMQ: 基于AMQP(高级消息队列协议)构建,支持多种消息协议,如STOMP、MQTT等。
RocketMQ: 阿里巴巴开源,满足其大规模电商交易系统的需求,主要支持其自定义的灵活的消息模型
RabbitMQ: 适合于一般的消息队列需求,但在高吞吐量和大规模分布式系统场景下可能不是最优选择。
RocketMQ: 优化了高吞吐量和大规模集群的性能,特别是在阿里巴巴的电商交易场景中得到了验证
怎么选择:
RabbitMQ: 适用于需要多种消息协议支持和复杂路由功能的场景。
RocketMQ: 更适合于需要高性能、高吞吐量和大规模分布式系统的场景。
7.mysql怎么用事务保持数据的一致性(一个事务里查多个表,一个表成功,两个表失败,怎么保持数据一致性)
回答:
1,了解事务的ACID属性:一致性、持久性、原子性、隔离性,只有当前三条性质都满足了,才能保证事务的一致性。
2,要保证一个事务内操作多个表时的数据一致性,可以使用事务控制语句如BEGIN, COMMIT, ROLLBACK。
当任何一个表的操作失败,应该立即执行ROLLBACK来回滚整个事务中的所有更改,以恢复到开始事务时的状态。
8.代码中用的设计模式,自己在代码中用的多的设计模式,举出场景。
回答:
1,单例模式;配置管理器,线程池,缓存,IO 、数据库连接、Redis 连接等
2,观察者模式 事件监听,状态更新通知
3,模板方法模式,将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
9.什么时候使用异步请求异步请求
回答:
长时间运行的任务:例如文件上传、复杂计算、大量数据处理等。
I/O操作:例如数据库查询、调用外部API、文件读写等。
资源密集型任务:例如图像处理、视频编码等。