写点什么

架构师训练营 11 周 -- 命题作业

用户头像
骏马
关注
发布于: 2020 年 12 月 05 日
  • 导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

  1. 导致系统不可用的原因如下:

  • 硬件故障:服务器硬件故障导致宕机

  • 软件缺陷:中间件或者应用程序出现bug,导致服务停止

  • 系统发布:因为发布的新系统中有bug,或者发布过程中出现问题(比如应用更新了,但是数据库没有更新),导致不可用,应该立刻回滚至上一个版本

  • 并发压力:大量的用户并发,导致应用服务承受不了,触发熔断或者限流,或者缓存被击穿,数据库被频繁访问,响应时间变长

  • 网络攻击:网络攻击占用大量带宽,正常访问无法进入。

  • 外部灾害:机房停电,光缆断掉,等



  1. 针对以上的原因,保障高可用的方案有:

  • 使用集群备份服务,通过负载均衡器,将请求分散路由到不同的机器上

  • 遵循面向对象的软件设计原则,采用微服务架构,降低耦合,做好业务上的隔离

  • 制定代码版本控制规范,才有自动化部署,自动化测试,做好灰度发布,正式上线前做好预发布验证。

  • 根据业务设置熔断、限流策略;做好运维监控,自动化失效转移和扩容;做好数据库主主备份,缓存集群,保证存储的高可用

  • 通过散列加密存储用户密码;使用非对称加密保证敏感信息网络上的传输;采用对称加密,保证敏感信息在硬盘上的存储;使用web防火墙应对常见的网络攻击。

  • 采用异地多活应对机房级别的故障。



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



import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class PasswordValidation {
public Boolean checkPW(String userId, String pwd, String storedEncryptedPwd) {
Boolean isValidPwd = false;
String salt = "geektime";
try {
String encryptedPwd = encrypt(pwd, salt);
if (encryptedPwd.equals(storedEncryptedPwd)) {
isValidPwd = true;
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return isValidPwd;
}
public String encrypt(String clearText, String salt) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(salt.getBytes());
byte[] encryptedText = digest.digest(clearText.getBytes());
return Base64.getEncoder().encodeToString(encryptedText);
}
}



发布于: 2020 年 12 月 05 日阅读数: 20
用户头像

骏马

关注

还未添加个人签名 2020.01.15 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 11 周 -- 命题作业