一、系统设计概述
系统设计面试的步骤:
- 了解需求:包括功能性(functional)需求和非功能性(non-functional)需求。功能性需求一般指软件需要实现的具体功能,非功能性需求一般指系统运行时的特性,例如安全性、可靠性、互操作性、健壮性、易使用性、可维护性、可移植性、可重用性、可扩充性。
- 容量估计(capacity estimation):通过估计用户总数、活跃用户总数等指标来估计存储空间、带宽大小、服务器规模,通常不需要花费太多时间
- API设计:指应用程序接口的设计,通常指Web API,参见 API 设计的原则
- 高级结构设计(high-level design):通过不同的微服务设计来介绍总体设计,应包括不同微服务之间的关联等
- 设计细节:不同的设计模式
二、分布式系统
1.分布式系统概述
分布式系统设计原则:容错率、高可用性、可扩展性、数据重复性
一个简单的分布式系统结构如上图所示,不同用户通过HTTP经过网关来对应用服务进行访问。LB表示负载均衡,在图中我们有三个服务器,当某个服务器宕机时可通过LB来进行控制访问,这样做可以增加容错率。服务、数据库和文件系统在三个不同的设备上,可以增加可用性。我们使用多个数据库和文件系统存储数据可以增加可扩展性和数据重复性。
2.分布式系统的安全
数据的编码主要分为两张,对称密钥加密和非对称密钥加密
(1)对称密钥加密
用户一将想要发送的消息使用密钥加密后发送给用户二,用户二使用相同的密钥来解码信息,因为加密和解密用的密钥相同,所以是对称密钥加密。对称密钥的缺点就是容易被攻击。
(2)非对称密钥加密
非对称密钥可分为公有密钥和私有密钥,私有密钥仅仅用户本人可使用。
使用非对称加密密钥的功能主要包括两种,加密解密信息、签名验证信息。
加密解密的流程如下图,首先用户一和用户二交换自己的公有密钥,具体方式为通过一个CA(certificate authority)来获取证书并通过证书来交换密钥。之后用户一使用用户二的公有密钥加密信息发送给用户二,用户二使用自己的私有密钥进行解密,这样做能够很大程度增加了安全性。
签名与验证信息如下图,首先对消息使用私有密钥可以得到一个签名,之后将签名,消息和私有密钥进行验证。