• Java面试题基础第十一天


    一、java面试题第十一天

    1.跨域问题怎么解决呢?

    有以下有几种方法

    CORS跨域资源共享

    我们可以通过springboot 为每一个请求设置它的请求头,来设置它的可以跨域 的路径,

    这样可以为每一个请求都可以跨域了

    @CrossOrigin注解

    我们可以通过springboot 来设置Controller类加个@CrossOrigin注解就可以进行跨域了,

    注意SpringMVC的版本要在4.2或以上版本才支持@CrossOrigin。

    nginx反向代理接口跨域

    nginx反向代理跨域原理如下: 首先同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题。

    2.设计接口要注意什么?

    接口参数校验。接口必须校验参数,比如入参是否允许为空,入参长度是否符合预期。

    设计接口时,充分考虑接口的可扩展性。思考接口是否可以复用,怎样保持接口的可扩展性。

    串行调用考虑改并行调用。比如设计一个商城首页接口,需要查商品信息、营销信息、用户信息等等。如果是串行一个一个查,那耗时就比较大了。这种场景是可以改为并行调用的,降低接口耗时。

    接口是否需要防重处理。涉及到数据库修改的,要考虑防重处理,可以使用数据库防重表,以唯一流水号作为唯一索引。

    日志打印全面,入参出参,接口耗时,记录好日志,方便甩锅。

    修改旧接口时,注意兼容性设计

    异常处理得当。使用finally关闭流资源、使用log打印而不是e.printStackTrace()、不要吞异常等等

    是否需要考虑限流。限流为了保护系统,防止流量洪峰超过系统的承载能力

    3.过滤器和拦截器有什么区别?

    1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

    2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

    3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射

    4、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。

    5、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。

    6、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

    4.对接第三方接口要考虑什么?

    确认接口对接的网络协议,是https/http或者自定义的私有协议等。

    约定好数据传参、响应格式(如application/json),弱类型对接强类型语言时要特别注意

    接口安全方面,要确定身份校验方式,使用token、证书校验等

    确认是否需要接口调用失败后的重试机制,保证数据传输的最终一致性。

    日志记录要全面。接口出入参数,以及解析之后的参数值,都要用日志记录下来,方便定位问题(甩锅)。

    5.后端接口性能优化有哪些方法?

    有以下这些方法:

    1、优化索引。给where条件的关键字段,或者order by后面的排序字段,加索引。

    2、优化sql语句。比如避免使用select *、批量操作、避免深分页、提升group by的效率等

    3、避免大事务。使用@Transactional注解这种声明式事务的方式提供事务功能,容易造成大事务,引发其他的问题。应该避免在事务中一次性处理太多数据,将一些跟事务无关的逻辑放到事务外面执行。

    4、异步处理。剥离主逻辑和副逻辑,副逻辑可以异步执行,异步写库。比如用户购买的商品发货了,需要发短信通知,短信通知是副流程,可以异步执行,以免影响主流程的执行。

    5、降低锁粒度。在并发场景下,多个线程同时修改数据,造成数据不一致的情况。这种情况下,一般会加锁解决。但如果锁加得不好,导致锁的粒度太粗,也会非常影响接口性能。

    6、加缓存。如果表数据量非常大的话,直接从数据库查询数据,性能会非常差。可以使用Redismemcached提升查询性能,从而提高接口性能。

    7、分库分表。当系统发展到一定的阶段,用户并发量大,会有大量的数据库请求,需要占用大量的数据库连接,同时会带来磁盘IO的性能瓶颈问题。或者数据库表数据非常大,SQL查询即使走了索引,也很耗时。这时,可以通过分库分表解决。分库用于解决数据库连接资源不足问题,和磁盘IO的性能瓶颈问题。分表用于解决单表数据量太大,sql语句查询数据时,即使走了索引也非常耗时问题。

    8、避免在循环中查询数据库。循环查询数据库,非常耗时,最好能在一次查询中获取所有需要的数据

  • 相关阅读:
    为什么哈希加密后还要加盐?
    条件欧几里得聚类
    [LC 总结] 前缀和(Prefix Sum)总结& 10 道相关练习题
    多线程概述(线程创建,方法(等待,通知,加入,睡眠,礼让,中断),上下文切换,死锁,守护线程与用户线程)
    欧几里得算法证明,最小公倍数求法证明
    Springboot——使用ThreadLocal进行请求前后参数数据传递
    【强化学习论文合集 | 2021年合集】三. AAMAS-2021 强化学习论文
    二次封装View Design的table组件,实现宽度自适应,内容在一行展示
    dpdk-19.11 中 simd 指令使用现状分析
    ZigBee 3.0理论教程-通用-1-02:协议架构-总
  • 原文地址:https://blog.csdn.net/Afu1021/article/details/133152084