0308 软件系统的非功能需求
李福春 人气:3
![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232605454-1247497152.png)
故事开始。
> 小李是一个一线的java程序员,做软件开发多年,有一天,被邀请去参加一个大厂的面试,面试前他做了各种准备,有软件原理方面的,软件设计方面的,还有软件架构方面的知识。并不断总结提炼成了一张知识图谱。想着即使不成功,也是一次不错的技术交流,至少可以知道目前大厂需要的程序员具备的技能深度和广度,给自己定定位。下面是技术一面。
小李:你好,我是李x,今年y岁,做一线开发z年,我来面试。
大厂牛逼架构师:你好,小李。我是a厂的面试官b,我来给你面试。直接开门见山了。**问题1,简单说一下软件研发的过程?**
小李:按照软件工程的瀑布模型.
软件研发分为可行性分析,需求分析,概要设计,详细设计,编码,测试,发布,交付,维护,下线等节点。但是这些流程比较重,往往当软件开发完成交付的时候,客户的需求已经发生了变更,软件需要重新打回需求分析和概要设计阶段开始,导致软件的工期远远超出预期,而且开发方耗时间耗人力,客户方并不满意。
那么怎么破呢?
按照当下流行的敏捷研发模式,软件在需求分析阶段,按照优先级别分批次设定发布计划,然后基于发布计划规划迭代,针对单个小迭代,开发,测试同一时间点参与,研发完成立马发布交付客户验收,客户快速反馈,针对反馈的问题,及时调整规划的需求,这样小步快跑,快速迭代的而方式去管理软件的研发过程,解决研发方研发的时间和人力成本高,客户还不满意的难题。
![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232608858-1314539652.png)
大厂牛逼架构师:**问题2:系统概要设计阶段的非功能需求有哪几种?**
小李:软件除了实现客户的基本功能需求之外,还要满足预设的非功能性需求,好比冰山下的庞大底座,看不见的东西往往最耗费和考验软件工程师的功力,对架构能力,编码能力要求比较高。主要包含高性能,安全,高可用等。
![冰山](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232609369-1602160547.webp)
# 高性能
大厂牛逼架构师:**问题3:简单介绍一下高性能的指标?你使用过的性能调优方法?以及你的一个性能调优经历?**
小李:高性能是软件系统的核心非功能需求,性能调优是软件架构师的核心职责,一般由高并发引起性能问题。要进行系统的性能优化,必须先进行性能测试。
软件系统的性能指标如下。
第一,响应时间,即用户发出请求到获得响应的总时间;
第二,并发数,即软件系统可以同时处理的请求数量,即HPS;
第三,吞吐量,有两个个基本指标,TPS(每秒处理事物数),QPS(每秒处理查询数);
第四,操作系统的性能计数器,比如CPU,内存的使用率,磁盘IO,系统负载,对象数和线程数量;
性能调优的原动力是提升用户体验,比如在异步显示资源,等待的时候可以转菊花;
性能调优的客观方法分为7种:
从软件系统的范围由大到小分别说明。
1,多数据中心,让用户访问离他最近的数据中心,可以显著降低响应时间。
2,使用高配置的硬件,比如更高的cpu,内存,对系统进行垂直扩展。
3,操作系统的参数调优,比如调大TCP的连接数,调小TCP的默认等待时间等;
4,JVM调优,设置合适的jvm的存储参数,选择合适的垃圾回收算法等;
5,软件系统的依赖组件调优,比如web服务器的配置调优,数据库的调优等;
6,软件架构调优,比如可以引入集群,缓存,消息队列等;
7,代码层面的优化,比如使用更优的数据结构,使用线程池连接池,sql语句调优,反应式框架,异步io,设计模式写出更简洁易读的代码等;
性能调优的流程是:
1,对要调优的软件系统进行性能测试,工具有很多比如jmeter,loadrunner等,使用多线程的方式模拟用户并发访问系统;
2,观察软件系统的性能指标,分析得到产生性能的问题的瓶颈点,需要非常了解整个系统的结构,然后解决这个瓶颈点;
3,然后继续跑性能测试,对比调优前后的性能指标。如果提高了则结束,没有提高则重复1步骤;
![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232614813-1556863796.png)
# 安全
大厂牛逼架构师:**问题4:简单介绍一下数据加密的种类?以及常见的软件安全漏洞?最后讲讲实际工作中应该如何保证软件的系统安全?**
小李:软件系统系统只有被攻击,数据泄漏之后才意识到安全的重要性。
数据加密的种类有3种:
1,单向加密,比如常用的md5,一般使用的时候还要加个salt,并增加输入的密码复杂性检查,防止彩虹表破解密码;
2,对称加密,常见的比如RSA加密,通过一个秘钥进行加密和解密,只要秘钥不泄漏就是安全的;
3,非对称加密,常见的比如公钥私钥对,数字签名是非对称加密的应用,使用私钥加密获得密文,发送出去,只有配对的公钥才能解密,以此来验证数据来源的合法性。但是性能比较差。
除了数据加密,还需要保证数据在传输过程加密,那就要说到https协议了,它是结合使用了对称加密和非对称加密,首先使用非对称加密,产生一个秘钥,客户端拿到秘钥之后,对数据进行对称加密,服务端根据生成的秘钥进行数据解密。充分保证了数据处理的性能和传输数据的安全。
常见的安全漏洞:
HTTP安全漏洞:
1, SQL注入,解决方法使用Preparestatement替代statement处理传输过来的参数;
2,xss攻击,上传攻击脚本到服务器,别的用户获取数据的时候会解析这个攻击脚本,达成攻击目的,解决方式是字符串转义;
可以通过在网关中增加web防火墙或者在代码中增加过滤器来处理。
此外还有硬件和操作系统的安全漏洞,使用软件和组件的安全漏洞等。
实际工作中,应该应该及时升级依赖的软件和组件的版本,
升级版本一般修复了对应的安全漏洞,此外我们应该在程序中做好参数过滤,
最后,应该对最终存储的数据和传输的数据进行加密,提高黑客攻击的难度。
![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232615894-138497262.png)
# 高可用
大厂牛逼架构师:**问题5:简单说一下如何保证软件系统的高可用?**
小李:高可用即要求软件系统在各种故障发生的时候做到可用或者大部分可用,软件系统的可用率一般采用N个9的方式来衡量。
各种故障都可能影响软件系统的可用性,比如:
1,自然灾害
2,人为原因
3,高并发访问
4,硬件故障
5,软件故障
保证系统的高可用有5种方法:
1,冗余备份,即多准备几个服务器,比如多个web服务器(故障转移),数据库服务器(多主模式集群);
2,异地多活,即通过域名的方式,把请求分发到多个地域的不同机房;
3,限流降级,限流即限制HPS,降级即关闭非核心功能让出有限资源;
4,失败隔离:消息队列削峰填谷,转移写压力,隔离失败;
5,运维方法:自动测试,自动监控,灰度,预发布等;
![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232617325-1451864244.png)
# 小结
大厂牛逼架构师:
小李架构功夫很扎实。简单的点评一下。
1,不愧是多年的一线开发人员,软件研发流程非常熟悉,而且敏捷研发模式有一定经验;
2,高性能是非常重要的非功能需求,调优方式7中都答的很到位;
3,安全性也是非常重要的,数据加密分类清晰,http的攻击防护手段有所了解;
4,高可用的手段总结的很到位;
小李:感谢您的评价,希望有机会合作,为企业打造数字化产品帝国。
故事讲完。
> 原创不易,转载请注明出处。
加载全部内容