-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feature] 性能优化--重构默认鉴权插件中的JWT相关功能 #9859
Comments
另一份测试结果:
|
做了一个测试,结果如下: 测试环境信息服务端配置:OS: Ubuntu22.04 其他测试接口: login / getConfig Nacos服务端参数: java \
-server -Xms4g -Xmx4g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m \
-Xlog:gc*:file=/home/ywz/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400 \
-Dnacos.standalone=true \
-Ddb.url.0="jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC" \
-Ddb.user="nacos" \
-Ddb.num=1 \
-Ddb.password="xxx" \
-Dnacos.core.auth.enabled=true \
-Dnacos.core.auth.plugin.nacos.token.secret.key="U2VjcmV0S2V5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=" \
-Dnacos.core.auth.system.type=nacos \
-Dnacos.core.auth.caching.enabled=true \
-Dspring.sql.init.platform=mysql \
-jar nacos-server.jar Nacos服务端版本: 2.2.1-rc: 基于最新的 测试结果查询配置接口2.2.1-rc:
优化登陆鉴权逻辑:
优化jwt:
对比
登陆接口(all with keep-alive)2.2.1-rc:
优化登陆鉴权逻辑:
优化jwt:
对比测试过程中当并发线程达到100后,服务端cpu使用率达到90%以上,其响应时间由于等待时间过长,个人认为没有参考意义.
对于登陆接口, 更多的性能损耗在于使用Bcrypt算法加密密码. |
[Feature] 性能优化--重构默认鉴权插件中的JWT相关功能
Is your feature request related to a problem? Please describe.
在多个压测中都出现开启鉴权后性能下降的情况.
默认鉴权插件支持基于用户名-密码/jwt令牌两种鉴权方式,在大部分情况下客户端-服务端交互时使用jwt令牌,且会针对每个请求进行鉴权.
因此有必要对jwt相关功能进行优化.
Describe the solution you'd like
默认鉴权插件中,其jwt令牌由其生成,同时也由其验证.因此, 没有必要使用jwt框架--尽管
jjwt
(当前默认鉴权插件使用的第三方依赖)支持的签名算法更加丰富, 但默认插件只使用HmacSHA256
算法进行签名,因此完全可以自定义jwt验证逻辑,从而提供更好的性能.以下是使用
jjwt
和自实现的生成/验证jwt令牌的性能测试(该性能测试基于jmh
):总览:
详细测试结果:
结果对比
从以上测试结果可以看到,
jjwt
生成令牌平均每个操作耗时159066.727ns左右;验签操作平均耗时4494.201ns.而自定义解析器生成令牌平均耗时3436.895us左右;验签操作平均耗时3436.895ns.
完整测试结果参考 此处
Describe alternatives you've considered
当然也有必要对鉴权逻辑进行优化--但那是另一部分.
Additional context
生成jwt令牌:
自定义的jwt解析器支持
HmacSHA256
/HmacSHA384
/HmacSHA512
三种签名算法,具体使用哪种算法根据密钥nacos.core.auth.plugin.nacos.token.secret.key
的长度决定:验证jwt令牌:
自定义的jwt解析器支持
HmacSHA256
/HmacSHA384
/HmacSHA512
三种签名算法, 可以对jwt令牌进行签名验证.如果不是这三种签名算法生成的jwt令牌则无法验签--但这没关系,因为jwt令牌完全由鉴权插件自己生成,它总是能对自己生成的jwt令牌进行验签!The text was updated successfully, but these errors were encountered: