什么是工厂模式?
简单工厂
所有的产品都共有一个工厂,如果新增产品,则需要修改代码,违反开闭原则● 是一种编程习惯,可以借鉴这种编程思路
工厂方法模式
给每个产品都提供了一个工厂,让工厂专门负责对应的产品的生产,遵循开闭原则
项目中用的最多
抽象工厂方法模式
如果有多个纬度的产品需要配合生产时,优先建议采用抽象工厂(工厂的工厂)
一般的企业开发中的较少
什么是策略模式?
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户
一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中
案例(工厂方法+策略)
介绍业务(登录、支付、解析excel、优惠等级...)
提供了很多种策略,都让spring容器管理
提供一个工厂:准备策略对象,根据参数提供对象
责任链设计模式?
责任链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止,
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
单点登录这块怎么实现的?
先解释什么是单点登录
单点登录的英文名叫做:Single Sign On(简称SSO)
介绍自己项目中涉及到的单点登录(即使没涉及过,也可以说实现的思路)
介绍单点登录的解决方案,以JWT为例
用户访问其他系统,会在网关判断token是否有效
如果token无效则会返回401(认证失败)前端跳转到登录页面
用户发送登录请求,返回浏览器一个token,浏览器把token保存到cookie
再去访问其他服务的时候,都需要携带token,由网关统一验证后路由到目
标服务
权限认证是如何实现的?
后台管理系统的开发经验
介绍RBAC权限模型5张表的关系(用户、角色、权限)
权限框架:Spring security
上传数据的安全性你们怎么控制?
使用非对称加密(或对称加密),给前端一个公钥让他把数据加密后传到后台,后台负责解密后处理数据
文件很大建议使用对称加密,不过不能保存敏感信息
文件较小,要求安全性高,建议采用非对称加密
你负责项目的时候遇到了哪些比较棘手的问题?怎么解决的
1,什么背景(技术问题)
2,过程(解决问题的过程)
3,最终落地方案
- 设计模式:工厂、策略、责任链
- 线上BUG:CPU飙高、内存泄漏、线程死锁
- 调优:慢接口、慢SQL、缓存方案
- 组件封装:分布式锁、接口幂等、分布式事务、支付通用
你们项目中日志怎么采集的?
我们搭建了ELK日志采集系统
介绍ELK的三个组件:
Elasticsearch是全文搜索分析引擎,可以对数据存储、搜索、分析
Logstash是一个数据收集引擎,可以动态收集数据,可以对数据进行过滤、分析,将数据存储到指定的位置
Kibana是一个数据分析和可视化平台,配合Elasticsearch对数据进行搜索,分析,图表化展示
查看日志的命令?
实时监控日志的变化
实时监控某一个日志文件的变化: tail -f xx.log;
实时监控日志最后100行日志: tail -n 100 -f xx.log
按照行号查询
查询日志尾部最后100行日志: tail -n 100 xx.log
查询日志头部开始100行日志: head -n 100 xx.log
查询某一个日志行号区间: cat -n xx.log | tail -n +100 | head -n 100(查询100行至200行的日志)
按照关键字找日志的信息
查询日志文件中包含debug的日志行号: cat -n xx.log l 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 l grep "debug" | more
筛选过滤以后,输出到一个文件: cat -n xx.log l grep "debug" > debug.txt
生产问题怎么排查?
已经上线的bug排查的思路:
1,先分析日志,通常在业务中都会有日志的记录,或者查看系统日志,或者查看日志文件,然后定位问题
2,远程debug(通常公司的正式环境(生产环境)是不允许远程debug的。一般远程debug都是公司的测试环境,方便调试代码)
怎么快速的定位系统的瓶颈?
压测(性能测试)
压测目的:给出系统当前的性能状况;定位系统性能瓶颈或潜在性能瓶颈
指标:响应时间、QPS、并发数、吞吐量、CPU利用率、内存使用率、磁盘10、错误率
压测工具:LoadRunner、Apache Jmeter ...
后端工程师:根据压测的结果进行解决或调优(接口慢、代码报错、并发达不到要求..)
监控工具、链路追踪工具
监控工具:Prometheus+Grafana
链路追踪工具:skywalking、Zipkin
线上诊断工具:Arthas(阿尔萨斯)
Arthas核心功能:
1. 这个类从哪个jar 包加载的?为什么会报各种类相关的 Exception?
2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5. 是否有一个全局视角来查看系统的运行状况?
6. 有什么办法可以监控到 IVM 的实时运行状态?
7. 怎么快速定位应用的热点,生成火焰图?
8. 怎样直接从 JVM 内查找某个类的实例?