很久没有更新博客了,实在太忙。
最近升级Eureka 发现 CPU 经常跑满,导致很多Eureka Client 实例连接 Eureka Server 出现异常。跟了一下代码发现罪魁祸首竟然是 Spring Security 的 PasswordEncoder 出现性能问题;
默认 PasswordEncoder 是 BCryptPasswordEncoder 每次encode 需要几百毫秒,慢的时候甚至超过一秒。所以觉得降低安全性使用 MessageDigestPasswordEncoder("MD5");
修改的代码如下:
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); //关闭csrf
super.configure(http);
}
/**
* 注入自定义的PasswordEncoder
* 这个代码改写官方的DelegatingPasswordEncoder 工厂 将默认的 encodingId 改为 MD5
*
* @return
*/
@Bean
public PasswordEncoder passwordEncoder() {
//记一个性能坑,默认提供的 BCryptPasswordEncoder 使用 BCrypt encode 时会把CPU跑慢 从而导致大量请求失效
//目前有两种做法第一种 在 BCryptPasswordEncoder 做缓存、第二