1.说一说工厂模式
- 简单工厂
– 所有的产品都共有一个工厂,如果新增产品,则需要修改代码,违反开闭原则
– 是一种编程习惯,可以借鉴这种编程思路 - 工厂方法模式
– 给每个产品都提供了一个工厂,让工厂专门负责对应的产品的生产,遵循开闭原则
– 项目中用的最多 - 抽象工厂方法模式
– 如果有多个纬度的产品需要配合生产时,优先建议采用抽象工厂(工厂的工厂)
– 如果要新增维度需要改动所有工厂,工作量大。 一般的企业开发中的较少
2.说一说策略模式
策略模式是一种行为设计模式,核心思想是将一组算法封装成独立的类,并让它们彼此之间可以互换。它通过三个角色实现:
- 抽象策略(Strategy):定义算法的公共接口
- 具体策略(Concrete Strategy):实现具体的算法逻辑,例如不同的交通方式
- 环境类(Context):持有策略对象,并在运行时动态切换策略
3.说一说责任链模式
在责任链模式中,通常每个接收者都包含对下一个接收者的引用。如果一个接收者不能处理某个请求,它会把这个请求传给下一个接收者,以此类推。这种模式非常适合用于实现过滤器或拦截器等应用场景,也可以用来处理GUI事件、web请求预处理等。
组成部分
- Handler(抽象处理者):定义一个处理请求的接口。如果有需要,还可以实现后继处理器的属性。
- ConcreteHandler(具体处理者):处理它所负责的请求。可以访问它的后继者,以备请求需被转发时使用。
- Client(客户端):向链上的具体处理者提交请求。
优点
- **降低耦合度:**责任链中的对象只与自己的后继者有联系,这降低了系统的耦合度。
- 增强灵活性: 可以根据条件动态地添加或修改责任链中的节点。
- 简化职责分配: 通过设置不同的处理器来处理特定类型的请求,使得职责分配更加清晰。
缺点
- 如果没有明确的责任链结构,可能会导致循环引用的问题。
- 责任链过长可能会导致性能问题,因为每个请求都要遍历整个链条直到找到能够处理该请求的对象。
4.单点登录如何实现
单点登录的英文名叫做:Single Sign On(简称SSO)
实现单点登录以jwt为例:
- 用户访问其他系统,会在网关判断token是否有效
- 如果token无效则会返回401(认证失败)前端跳转到登录页面
- 用户发送登录请求,返回浏览器一个token,浏览器把token保存到cookie
- 再去访问其他服务的时候,都需要携带tokn,由网关统一验证后路由到目标服务
5.权限认证如何实现
后台的管理系统,最常见的就是RBAC模型来指导实现权限,RBAC(Role-BasedAccessControl)就是基于角色的访问控制
- 3个基础部分组成:用户、角色、权限
- 具体实现一般是两种
– 5张表(用户表、角色表、权限表、用户角色中间表、角色权限中间表)
– 7张表(用户表、角色表、权限表、菜单表、用户角色中间表、角色权限中间表、权限菜单中间表) - 一般用Spring security框架实现
6.如何保证上传数据的安全
使用非对称加密(或对称加密),给前端一个公钥让他把数据加密后传到后台,后台负责解密后处理数据
- 文件很大建议使用对称加密,不过不能保存敏感信息
- 文件较小,要求安全性高,建议采用非对称加密
7.项目遇见哪些棘手问题,如何解决的
从四个大方面回答,选择其一即可
- 设计模式
– 工厂
– 策略
– 责任链等等 - 线上bug
– CPU彪高
– 内存泄露
– 线程死锁等等 - 调优
– 慢接口
– 慢SQL
– 缓存方案 - 组件封装
– 分布式锁
– 接口幂等
– 分布式事务
– 支付通用等
8.如何采集项目中的日志
搭建ELK日志采集系统
ELK三个组件:
- Elasticsearch: 是全文搜索分析引擎,可以对数据存储、搜索、分析
- Logstash: 是一个数据收集引擎,可以动态收集数据,可以对数据进行过滤、分析,将数据存储到指定的位置
- Kibana: 是一个数据分析和可视化平台,配合Elasticsearch对数据进行搜索,分析,图表化展示
9.查看日志的命令
实时监控日志的变化
- 实时监控某一个日志文件的变化
tail -f xx.log;
- 实时监控日志最后100行日志
tail -n 100 -f xx.log
按照行号查询
- 查询日志尾部最后100行日志
tail -n 100 xx.log
- 查询日志头部开始100行日志
head -n 100 xx.log
- 查询某一个日志行号区间(查询100行至200行的日志)
cat - n xx.log | tail -n +100 | head -n 100
按照关键字找日志的信息(查询日志文件中包含debugl的日志行号)
cat -n xx.log | grep "debug"
按照日期查询
sed -n '/2023-05-18 14:22:31.070/,/2023-05-18 14:27:14.158/p' xx.log
日志太多,处理方式
- 分页查询日志信息:
cat -n xx.log | grep "debug" more
- 筛选过滤以后,输出到一个文件
cat -n xx.log | grep "debug" >debug.txt
10.如何排查生产日志
- 先分析日志,通常在业务中都会有日志的记录,或者查看系统日志,或者查看日志文件,然后定位问题
- 远程debug(通常公司的正式环境(生产环境)是不允许远程debug的。一般远程debug都是公司的测试环境,方便调试代码)
11.怎么快速定位系统瓶颈
- 压测(性能测试)
– 压测目的:给出系统当前的性能状况;定位系统性能瓶颈或潜在性能瓶颈
– 指标:响应时间、QPS、并发数、吞吐量、CPU利用率、内存使用率、磁盘IO、错误率
– 压测工具:LoadRunner、Apache Jmeter.
– 后端工程师:根据压测的结果进行解决或调优(接口慢、代码报错、并发达不到要求) - 监控工具、链路追踪工具
– 监控工具:Prometheus+Grafana
– 链路追踪工具:skywalking、Zipkin - 线上诊断工具Arthas(阿尔萨斯)
– 实时监控(Dashboard):实时查看 JVM 的 CPU、内存、GC、线程等状态。支持定时刷新,提供系统运行的全局视角。
– 线程分析:查看所有线程的堆栈信息,快速定位阻塞或死锁。自动检测线程死锁并输出详细堆栈。
– 性能分析:监控指定方法的执行时间、调用次数及耗时分布。:通过 profiler 命令生成火焰图,定位性能瓶颈。
– 动态代码修改:无需重启应用,可动态重新加载类(redefine 命令)。通过 JavaAgent 技术修改运行时字节码,支持在线调试。
– 类与方法操作:查看类的加载路径、加载器及依赖的 JAR 包。反编译运行中的类(jad 命令),查看代码逻辑。监控方法入参、返回值及异常(watch、monitor 命令)。
– 调试与日志:跟踪方法执行的输入输出(trace 命令)。实时捕获指定方法抛出的异常。在运行时动态修改日志级别(如 logger 命令)。
– 内存与对象分析:查看堆内存使用情况、GC 日志。定位 JVM 中特定类的实例对象(sc 命令)。
– 问题排查工具:快速定位类加载问题(如 class 命令查看类来源)。提供丰富的命令(如 thread、stack、sm 等),支持快速排查问题。