写点什么

架构训练营第十一周 - 作业

用户头像
无心水
关注
发布于: 2020 年 08 月 16 日
架构训练营第十一周 - 作业

作业



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

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



作业一

系统不可用,一般来说有几个原因

  • 硬件故障

  • 网络带宽不够或者极端情况,网线被挖

  • 系统性当机

  • 服务调用链路未做服务降级,导致故障扩散



为保证高可用,硬件方面,一般都选择多个供应商。



网络会选择专线,机房可以同城异区,跨城异地。



利用熔断机制,适当服务降级,保证主要服务可用,次要服务短暂不可用。



业务高峰时,可以采取同城分流,次要服务请求异地机房。

作业二

核心代码:

private final static BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
private final static CustomizedPasswordEncoder customizedPasswordEncoder = new CustomizedPasswordEncoder();
private final static ConcurrentHashMap<String, String> saltMap = new ConcurrentHashMap<>();

//模拟数据库存储
static {
saltMap.put("12", "Asd");
}

/**
* Spring security
* <p>
* bCryptPasswordEncoder
*
* @param userId 用户ID
* @param passwordPlaintext 密码明文
* @param passwordCiphertext 密码密文
* @return
*/
public static boolean checkPW1(String userId, String passwordPlaintext, String passwordCiphertext) {
//获取加密盐值
String salt = saltMap.get(userId);
return bCryptPasswordEncoder.matches(salt + passwordPlaintext, passwordCiphertext);
}

/**
* Spring security
* customizedPasswordEncoder
*
* @param userId 用户ID
* @param passwordPlaintext 密码明文
* @param passwordCiphertext 密码密文
* @return
*/
public static boolean checkPW2(String userId, String passwordPlaintext, String passwordCiphertext) {
//获取加密盐值
String salt = saltMap.get(userId);
return customizedPasswordEncoder.matches(salt + passwordPlaintext, passwordCiphertext);
}

public static void main(String[] args) {
String userId = "12";
String passwordPlaintext = "gkbbbb123";
//bCryptPasswordEncoder
String passwordCiphertext = "$2a$10$oiBY44m3HsE/K9eY.NlHwujMDavaV8JIuMqqOy5v7kLsVeQSE6umW";
//customizedPasswordEncoder
String passwordCiphertext2 = "ef23d52d33dca4788b4d92f00c50dbdd";

System.out.println(checkPW1(userId, passwordPlaintext, passwordCiphertext));
System.out.println(checkPW2(userId, passwordPlaintext, passwordCiphertext2));
}



自定义Encoder实现

public class CustomizedPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence rawPassword) {
return DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes());
}

@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return encodedPassword.equals(DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes()));
}
}



代码参考:https://github.com/wuxinshui/architecture-trains/tree/master/week11/src/main/java/com/wxs/pwd

发布于: 2020 年 08 月 16 日阅读数: 50
用户头像

无心水

关注

路漫漫其修远兮 2018.08.16 加入

熟悉Java,略懂Python

评论

发布
暂无评论
架构训练营第十一周 - 作业