架构师训练营第 11 周——练习

用户头像
李伟
关注
发布于: 2020 年 08 月 26 日
架构师训练营第 11 周——练习

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



导致系统不可用的原因

  • 硬件故障

  • 软件bug

  • 系统发布

  • 并发压力

  • 网络攻击

  • 外部灾害



保障系统稳定高可用的方案

解耦

  • 高内聚、低耦合的组件设计原则

  • 面向对象基本设计原则

  • 面向对象设计模式

  • 领域驱动建模

隔离

  • 业务与子系统隔离

  • 微服务与中台架构

  • 生产者消费者隔离

  • 虚拟机与容器隔离

异步

  • 多线程编程

  • 反应式编程

  • 异步通信网络编程

  • 事件驱动异步架构

备份

  • 集群设计

  • 数据库复制

失效转移

幂等

事务补偿

重试

熔断

限流:计数器算法、令牌桶算法、漏桶算法

自适应限流

降级

异地多活



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



public class Test {
public boolean checkPW(String userId, String orgPassword, String secPassword) {
// 利用userId作为salt,计算MD5值
String md5 = getMD5String(userId + orgPassword);
return md5.equals(secPassword);
}
private String getMD5String(String str) {
try {
// 加密对象,指定加密方式
MessageDigest md5 = MessageDigest.getInstance("md5");
// 准备要加密的数据
byte[] b = str.getBytes();
// 加密
byte[] digest = md5.digest(b);
// 十六进制的字符
char[] chars = new char[]{'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
StringBuffer sb = new StringBuffer();
// 处理成十六进制的字符串(通常)
for (byte bb : digest) {
sb.append(chars[(bb >> 4) & 15]);
sb.append(chars[bb & 15]);
}
// 打印加密后的字符串
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.getMD5String("001123456"));
System.out.println(test.checkPW("001", "123456", "D2E94DD634AB69D6BCEA03200A663EC1"));
}
}



用户头像

李伟

关注

还未添加个人签名 2018.05.07 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 11 周——练习