写点什么

【架构师训练营第 1 期 11 周】 作业

用户头像
Bear在挨踢
关注
发布于: 2020 年 12 月 06 日

【架构师训练营第 1 期 11 周】 作业



作业一:

(至少完成一个)

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

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



导致系统不可用的原因可以分为以下几种类型:

硬件故障:比如服务器宕机、硬盘损坏之类的;

软件bug:比如空指针、查询不走索引导致请求阻塞、代码逻辑错误问题;

系统发布:合并冲突导致代码异常、无法回滚到正确的分支;

并发压力:多线程处理推送出现异常导致OOM、库存超卖、并发过大系统阻塞无法响应;

网络攻击:DDOS攻击导致正常请求无法进入、被入侵篡改首页或添加脚本;

外部灾害:传说中的雷劈网卡、挖掘机挖断光纤、机房空调坏了过热宕机;



保障系统稳定高可用的方案针对上面的各种原因而产生的:

一、从应用代码架构的层面

1.解耦:

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

面向对象基本设计原则

面向对象设计模式

领域驱动设计建模

2.隔离:

业务与子系统隔离

微服务与中台架构

生产者消费者隔离

虚拟机与容器隔离

3.异步:

多线程编程

反应式编程

异步通信网络编程

事件驱动异步架构

4.备份:

集群设计

数据库复制:CAP原理

失效转移(Failover)

数据库主主失效转移

负载均衡失效转移

5.故障失效转移思路

根据系统特性设置故障判断条件,并且做好故障转移的方案。

设计无状态的服务

6.幂等

事务补偿:

传统事务的ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

分布式事务的BASE:基本可用(Basic Availability)、软状态(Soft-state)、最终一致性(Eventual consistency)

事务补偿:通过执行业务逻辑逆操作,使事务回滚到事务前状态

7.故障处理手段

重试:注意上下游超时时间设置

熔断:三种状态:关闭、打开、半开。

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

自适应限流

降级

异地多活



二、从系统运维的角度

1.规范代码版本控制

使用Git或者SVN控制代码;

分支开发,主干发布,而且发布后打上每个稳定版的target,方便回滚;

规范代码提交规范,减少合并代码带来的风险;

2.引入持续部署工作流程

持续部署:持续集成->持续交付->持续部署

自动化部署:Jenkins

自动化代码扫描:Sonar

自动化测试:Selenium

3.预发布验证

配置预发布环境进行测试

灰度发布上线,逐步上线;

4.监控

网站运行监控:用户行为日志收集、服务器性能监控、

监控管理:报警、自动控制

6.责任落实

引入故障分机制,确保每个人都对故障负责,并纳入绩效考核



最终引用老师的话总结

高可用的价值观:

保持简单,使问题易于发现,快速解决。

目标明确,解决特定环境下的具体问题。

价值回归,成本收益要合理。



============================分割线===============================



使用JAVA进行密码校验



校验类


import java.io.UnsupportedEncodingException;
import org.springframework.util.DigestUtils;

public class Security {


/**
* 对入参进行MD5编码
*
* @param text
* @return
*/
public static String createMD5(String text) {
if (CommonUtils.isEmpty(text)) {
text = "";
}
try {
return DigestUtils.md5DigestAsHex((text).getBytes("UTF-8"));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
return null;
}
}

/**
* 对密码进行校验
*
* @param textPwd
* 用户输入的明文密码
* @param encodePwd
* 数据库中存储的加密的密码
* @return
*/
public static Boolean checkPW(String textPwd, String encodePwd) {
if (textPwd == null) {
textPwd = "";
}
if (encodePwd == null) {
encodePwd = "";
}
String md5Result = createMD5((textPwd));
Boolean result = md5Result.equals(encodePwd);
return result;
}

/**
* 对密码进行校验
*
* @param textPwd
* 用户输入的明文密码
* @param encodePwd
* 数据库中存储的加密的密码
* @param salt
* 盐
* @return
*/
public static Boolean checkPW(String textPwd, String encodePwd, String salt) {
if (textPwd == null) {
textPwd = "";
}
if (encodePwd == null) {
encodePwd = "";
}
String md5Result = createMD5((textPwd + salt));
Boolean result = md5Result.equals(encodePwd);
return result;
}
public static void main(String[] args) {
//System.out.println(createMD5("123456saltdemo"));
System.out.println("密码123456的不加盐MD5加密校验结果:"+checkPW("123456", "e10adc3949ba59abbe56e057f20f883e"));
System.out.println("密码123456的加盐MD5加密校验结果:"+checkPW("123456", "3db2f561ce0f158b7a395d04758ff9d9", "saltdemo"));
}

}





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

Bear在挨踢

关注

还未添加个人签名 2019.02.16 加入

还未添加个人简介

评论

发布
暂无评论
【架构师训练营第 1 期 11 周】 作业