Skip to main content

设计模式

1.工厂模式

首先,工厂模式总结下来就是利用工厂去生产我们想要的类,让业务代码只需要和这种工厂打交道。因此,工厂模式他最大的好处或者说优点就是去进行解耦和遵循开闭的原则,也就是以后去扩展的时候特别方便,并且不需要去修改原来的代码。

然后工厂模式其实包括很多种,第一种就是简单工厂模式,这个更严格只算一种编程思想吧,他就是创建了一个具体的工厂类,在这个工厂类里面去实现了公众对象的生产方法,这座虽然,这种业务代码和这个生产的对象类产生了解耦,但是工厂和生产类并不解耦,假设这个时候我需要去生产一个全新的类,那我是不是就去要修改这个工厂类里面的代码。所以这个在实际的企业中用的比较少。第二种就是这种工厂方法模式,相比于这种简单工厂只有一个实体工厂类,他多了一个抽象工厂类,以及具体工厂类,总共有两个这种工厂,其中抽象工厂类规定了抽象的方法,有这个具体的工厂类去实现,这样假设我们需要不同的类,比如说这种芒果奶茶已经有了,我还要生产草莓奶茶,那我只要再去这种实现一个这种草莓奶茶工厂类就好了,之前的工厂类都不需要改动,这样拓展性更高,也符合了开闭的原则。但是这样的话,有一个类爆炸的问题,如果类本省就特别多,并且每一个类都要去创建一个这种对象的工厂,就更多了。所以有了第三种的工厂模式就做,抽象工厂模式,这里面有了两个概念叫做产品等级和产品线/族的概念,同一类的产品算作一个等级,但是不同风格的算作不同的产品线,我们依然会有一个抽象工厂,但是我们的具体工厂不再是一个单一的工厂,而是一整条产品线的工厂,比如说,我有一个泰国风味的工厂,可以生产泰国风味的麻辣烫和火锅和奶茶这三个等级的产品,我们也可以去创建韩国风味的工厂,它一定程度解决了类爆炸的问题,但是当你增加一个等级的产品的时候,也需要改所有的产品线的工厂。

2.策略模式

策略模式,就是可以堆不同的算法进行一个封装,需要使用不同的算法就去使用不同的策略类就好了,一般用这个策略模式 + 工厂模式多一点,比如说这个登录D功能,前端的登录接口,会穿两个关键值,一个是type,比如email或者phone,还有一个对应的值,不用任何策略模式的花,我们就需要在业务代码中堆type进行判断,走不同的逻辑,但是用了这个策略家工厂的话,我们可以定义一个抽象工厂,和两个具体的工厂,按照不同策略,可以实现为手机号登录和这个邮箱登录,我们不用去关心内部实习,只要获取不同的工厂就行了,后续如果增加,也只需要增加不同的策略,不需要改动原来的代码

3.责任链模式

责任链模式将业务的代码按照顺序进行拆分,降低了各个模块的耦合,以后调整顺序或者修改,只需要修改各个责任的模块,实现了解耦。具体来说里面有三个关键的角色,一个就是客户端,这个说白了就是调用责任链的各个模块的业务代码,第二个就是抽象责任链条,第三个就是具体责任链对象。比如这个下单的业务场景,就有一个下单的抽象责任链,其中可以具体到四个具体责任链对象,比如参数校验,价格计算,库存计算,和最后的落库。在客户端代码中,就去依次调用这个模块,每次规定号next参数

,指向像一个责任链。当然每个设计模式都不是完美的,比如这个模式的缺点就是,客户端需要指定明确的调用顺序,并且可能出现死循环的问题使用不当,链条过长,这个性能也会有一定下降

技术场景问题

1.单点登录了解吗?

了解过,单点登录又称为SSO,指的是一次登录,就可以获取信任访问其他的这个系统,之前采用这个session的时候都有这个单点登录的问题,比如微服务架构下,有多个服务和多个tomcat,就无法实现tomcat之间的session共享,后来有了很多解决方案,比如这个JWT的技术,我的项目中其中也用到了这个JWT的技术,它在登录成果的时候会获取到一个token,这个token会存到这个localstorage中,以后访问其他的功能模块,比如投稿,他都会带上这个token,后端会对这个token做一个合法性校验,非法的话会提示登录无效,要求重新登录。

2.权限认证是如何实现的?

RABC权限控制模型 + AOP切面编程 , 然后有一个线程的权限控制的框架Spring Security

3.上传数据的安全性,你们是怎么控制的?

对称加密 + 非对称加密

4.你负责项目的时候遇到了哪些比较棘手的问题,如何解决的?(频率非常高,提前准备)

1.什么背景?(技术问题)

2.过程(解决问题的过程)

3.最终落地方案

(1:设计模式

工厂、策略、责任链

(2:线上的bug

CPU飙高、内存泄漏、线程死锁

(3:调优

慢接口、慢SQL(比如说能不能加索引)、缓存方案

(4:组件封装

分布式锁、接口幂等、分布式事务、支付通用

5.你们项目的日志是怎么采集的?

有两种方式,第一种就是这个ELK日志采集系统,也就是ElasticSearch、LogStash和这个Kibana,第一个就是一个全文搜索引擎,第二个就是收集数据的,第三个就是把这个数据可视化的一个工具。我们最终可以在kibana上去查看日志,利用es的语法去筛选想要的日志,比如筛选为Error的日志.第二种就是直接通过这个命令行的方式去查看日志。

6.查看日志的命令,你知道吗?

首先如果不用这个kibana去看,用这种命令行,我觉得关键是这么去看,就是看这个日志实时发生变化的部分,或者尾部,或者具体哪一行到那一行,或者这个根据关键词去搜索,第一个实时看的命令是 tail -f xx.log ,看最后100行是tail -n 100xx.log 想看区间就是

cat -n xx.log | tail -n + 100 | head -n 100 ,这个比如就可以去查看这个100行到200行,按照这个关键词搜索就是 tail -n xx.log | grep "x"

7.生产问题如何排查?

第一个就是去分析日志,通过日志的一些无论是报错还是别的信息来定位代码的位置,进而阅读代码的上下文。第二个就是去远程debug,不过这个一般公司的生产环境是不允许这么干的,主要是利用比如idea的工具配置远程主机的uo以及端口,进行打断点,不过这也的前提是线上部署的代码要和本地的代码去保持一致

8.如何快速定位系统的瓶颈

1.压测,线上项目上线之前,去系统评估系统的瓶颈或者未来可能的瓶颈,一般是必须要做的,而且由测试人员来去执行

测试的指标包裹qps,响应时间,并发数等等,后端工程师配合压测暴露出的问题,去进一步调优

2.监控工具、链路追踪工具,项目上线之后可以进行监控

3.线上诊断工具Arthas(阿尔萨斯),项目上线之后进行监控和排查