写点什么

架构师训练营 -week11- 作业

用户头像
大刘
关注
发布于: 2020 年 12 月 03 日
架构师训练营 -week11-作业

本周作业:

  • 导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

  • 请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文),返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。


作业 1:

导致系统不可用的原因可能有如下这些(包括但不限于):

  1. 内部原因导致:

  2. 应用系统的配置错误(发布过程中可能出现)

  3. 系统 bug(例如:慢 SQL、缓存中存在大对象、Java 应用的内存泄露造成频繁的 FullGC 等)

  4. 系统中的中间件故障(网关, MQ 等中间件不可用)

  5. 系统超过容量

  6. 外部原因导致:

  7. 大并发请求造成应用系统过载

  8. 硬件和网络故障

  9. 系统漏洞被黑客攻击, 比如 SQL 注入后删除了关键业务表或者数据库, XSS 攻击造成系统的页面执行恶意的脚本

  10. 不可抗拒的自然灾害, 如数据中心被破坏, 到数据中心的网络光纤被挖掘机挖断


保证系统高可用的方案有:

  1. 系统间解耦:通过减少依赖,逻辑上减小故障的影响范围,一方面从软件设计层面来进行优化;一方面从架构设计层面来优化,例如引入消息队列等中间件。

  2. 冗余: 避免系统应用集群的单点故障问题,小规模系统采用负载均衡,大规模系统可以考虑使用异地多活。

  3. 引用灰度发布机制:在版本升级的过程中引入预发环境发现和避免验证系统配置问题。

  4. 引入监控系统:监控系统的关键参数: 应用服务宿主机的负载, 内存, CPU, 硬盘, Linux 服务的 INode 信息; 应用服务的堆栈信息, 线程池信息,Java 进程的 GC 状况,接口的异常信息, 接口服务的调用链路节点耗时信息, 中间件和数据存储的关键参数等。

  5. 性能测试:了解系统容量的瓶颈, 在监控系统中设置合理的关键参数的预警阈值。

  6. 安全防护:防止系统被攻击,比如在网关中引入 WAF 等设备, 在 Java 应用数据库访问层适用 PrepareStatement 防止 SQL 注入,并且对系统要定期做漏扫,补丁升级等工作。

  7. 限流熔断:在系统过载的时候引入服务的限流和降级的机制防止系统过载。


作业 2:
public class ValidateDemo {  public static String SALT = "20201204";  public static String ALGORITHM = "SHA-256";
/** * 加盐进行加密,实际中,可以使用用户的手机号的几位作为salt * 采用SHA-256算法 * @param pwd * @return * @throws NoSuchAlgorithmException */ public String encrypt(String pwd) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance(ALGORITHM); byte[] srcBytes = (pwd + SALT).getBytes(); md.reset(); //使用srcBytes更新摘要 md.update(srcBytes); //完成哈希计算,得到result byte[] resultBytes = md.digest(); //BASE64,把二进制转换为字符串 String resultStr = Base64.getEncoder().encodeToString(resultBytes); System.out.println("plain text: " + pwd); System.out.println("encrypt text: " + resultStr); return resultStr; }
public boolean checkPW(String userId, String pwd, String encryptPwd) throws NoSuchAlgorithmException { String tempPwd = encrypt(pwd); if (tempPwd.equals(encryptPwd)) return true; return false; }
public static void main(String[] args) throws NoSuchAlgorithmException { ValidateDemo demo = new ValidateDemo(); String encryptPwd = demo.encrypt("admin123"); boolean result = demo.checkPW("admin", "admin123", encryptPwd); System.out.println(result); }
复制代码


用户头像

大刘

关注

大道至简,知易行难 2017.12.27 加入

想成为合格架构师的架构师

评论

发布
暂无评论
架构师训练营 -week11-作业