写点什么

系统高可用

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

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


一、系统不可用的原因,主要从这几个方面来考虑:

  • 硬件故障

  • 软件 bug

  • 系统发布

  • 并发压力

  • 网络攻击

  • 外部灾害


1、系统自身的原因

  • 程序 bug-代码问题造成的 OOM 异常等,可通过 codereview 等手段

  • 日志太多磁盘空间不足,可采用系统监控检查来避免

2、系统架构的原因

  • 带宽不够-高峰期网络拥堵,没做限流熔断等

  • 缓存雪崩、缓存穿透,可采用缓存时间粒度随机,对没有数据的返回空对象。

  • 运维发布失败 ,可采用代码版本控制,灰度发布等

  • 证书到期,不可访问,用脚本提前通知来避免

3、外在的原因

黑客攻击:

  • 网络攻击,可采用加防火墙的方式。

  • xss 攻击

  • sql 注入攻击

  • CSRF 攻击

  • errorCode 回显

  • 文件上传

  • 路径遍历

  • 第三方组件/插件漏洞攻击

以上的预防手段可以用个安全渗透测试来验证系统是否安全可用来解决。

4、其它

地震、火灾等 可用异地多活的方式解决。

保证系统高可用的方案:

1、集群部署,关键系统采用熔断、降级、限流等措施

2、灰度发布

3、代码 review

4、安全漏洞扫描,包含模拟安全攻击等

5、完善的监控和报警机制

6、根据需求做好压测和安全渗透测试


二、工具类如下

public class Md5Util {		private static final Logger LOGGER = LoggerFactory.getLogger(Md5Util.class);	public static final String CHARSET_UTF8="utf-8";
/** * md5 加密 * @return */ public static String md5(String source) { return md5(source,CHARSET_UTF8); } /** * md5 加密 * @return */ public static String md5(String source, String charset) { if (source == null){ return null; } if (StringUtil.isEmpty(charset)) { charset = CHARSET_UTF8; } StringBuilder sb = new StringBuilder(); try { byte[] digest = md5(source.getBytes(charset)); String tmp; for (byte b : digest) { tmp = Integer.toHexString(b & 0XFF); if (tmp.length() == 1) { sb.append("0"); sb.append(tmp); } else { sb.append(tmp); } } } catch (UnsupportedEncodingException e) { LOGGER.error("UnsupportedEncodingException e is {} ", e); } return sb.toString(); }
/** * * @param bytes * @return */ public static byte[] md5(byte[] bytes) { byte[] result = null; try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(bytes); result = md.digest(); } catch (NoSuchAlgorithmException e) { LOGGER.error("NoSuchAlgorithmException {} ", e); throw new IzkException(e); } return result; } }
复制代码


具体调用方法为:

    public boolean checkPW(String userId,String password,String encrptPw){        String pwd;        try {            pwd = Md5Util.md5(new String(Base64.getDecoder().decode(password), "utf-8"));        } catch (Exception e) {            return false;        }        if (pwd.equals(encrptPw)){            //dao.exsit(userId);            return true;        }        return false;    }
复制代码


用户头像

ashuai1106

关注

还未添加个人签名 2017.10.20 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
可以考虑加盐来提升密码安全性,https://www.jianshu.com/p/f1954e6142ee
2020 年 08 月 29 日 21:40
回复
没有更多了
系统高可用