-
Notifications
You must be signed in to change notification settings - Fork 7.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
rule.setResource(resourceName)中的resourceName关于前后空格是否trim在系统中处理不一致 #369
Comments
按重新步骤试了,点保存只有1条规则; 程序里 确实你说的对,要么不处理要么统一处理; 可否将重现步骤描述得详细些,比如配置中心用的什么,有什么代码改动没有 |
并未修改代码,我的意思是整个流程涉及到两个不同的资源名称,点击保存前和保存后按照正常逻辑资源名称不能改变,如果改变了就应该是两条才对,但是如果是两条又与编辑这个语义冲突 |
这个要看有空格的资源名称是怎么加的了; 如果在其它地方把有空格的资源名添加好了,那控制台编辑后名称改变了,这属于正常的吧,你觉得呢 |
如果是按照id更新的,那应该是点保存后资源名称也被改变了,如果是按资源名称查询,查询到的就是空值,因为不存在trim之后的资源名称;关于推不推荐用空格这个肯定是不推荐的,这个问题是我不小心复制了个空格但是又没发现,最终调试了几个小时才找到原因,这种又不明显又很花时间 |
我是这样觉得的,假设定义资源时采用的外部数据源或者不是通过dashboard定义的,那么规则在修改一次之后就再也不会生效了,因为与规则关联的资源名称已经发生了变化,我这种情况是在试验Apollo配置中心时出现的 |
恩,理解你说的,因为空格不容易发现,所以影响调试定位问题。 |
明白你意思了。那这样的话,就是说修改的时候,不要trim资源名,这样应该就符合需求对吗? |
对,一旦修改了,规则就再也不能生效了,但是用户看来界面上根本没发生任何变化,只是改了流控配置而已,但是流控又不生效 |
还有配置中心推送规则时,资源名称是带空格的,原样传输的,但是修改却能反馈在没有空格的规则上,我猜测应该是FindRuleByResourceName时也做了trim,这样才能匹配到,这种现象看起来是推送成功了,但是其实不能生效,你可以测试下:先定义一个带空格的资源名称,把对应规则放到Apollo里去,在dashboard里修改一次,这时资源名称已经没了空格,再修改Apollo里的流控配置,本来dashboard中的值不应该变化的,因为名称不能equal,实际情况却是配置中心的更改生效了 |
恩,app名称也是trim处理的。这个空格修改确实太细节了,等官方同学再确认下哈。理论上确实不应该修改资源名称,保持前后端处理一致比较好。 以后如果规则不生效,建议检查资源名称和埋点这两个要素,这样方便定位原因。 |
主要想表达两个意思: |
两者有关系吧,资源id是相同的,指一个规则。 Apollo是push方式数据源,控制台修改的话, 参考: |
在配置中心不修改资源名称,修改其他配置时,两个资源是没有关系的,实际效果来看,sentinel合并修改的时候也有trim操作 |
因为Apollo推送的时候推送的是: [
{
"resource": "TestResource",
"controlBehavior": 0,
"count": 5.0,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
] 没有id这个概念,肯定是按resource匹配的,我看下源码吧,合并的时候应该有问题 |
看了下确实是在按 在控制台编辑保存,这个时候Apollo上的resource有空格吗,在Apollo修改其它属性保存之前 |
apollo修改之前假设在控制台修改过一次,之后Apollo在推送,Apollo是先推到连接Apollo的客户端,dashborad看到的已经是客户端内存中的值了,效果是会把没空格的更新了,而且流控不生效 |
控制台改过,然后程序会trim,如果没有改动控制台逻辑,这时控制台推送给客户端resource空格没了,规则不生效; 之后Apollo在推送,这时Apollo推送前,Apollo配置中心上的resource有空格吗? |
这个描述起来有点麻烦,还可能说不清楚,等我明天写个例子,一跑bug就现形了 |
谢谢回复,早点休息吧 |
客气了,正好在看控制台保存规则。 我觉得你描述得挺清楚的,可能是我哪没理解到,Apollo还没用过。感觉就差最后点就水落石出了。。 你也早点休息,晚安: ) |
ok,找了一下午,还是在调试sentinel源码的时候才发现多写了个空格,但是控制台给人的感觉就像是一切正常,但是新流控规则不生效,搞得我都要怀疑Apollo没有刷新了 |
关于配置中心规则推送后,规则定义的处理是我理解错了 Sentinel/sentinel-core/src/main/java/com/alibaba/csp/sentinel/property/DynamicSentinelProperty.java Line 55 in 9c2683e
代码里是直接用新的数组替换旧的数组,我还以为是合并了两个资源 这样也就是说在现在的策略下,如果在dashboard中添加了一个规则,当配置中心修改推送后会被配置中心的完全覆盖,也就是说不能再两个地方同时修改,外部动态数据源会覆盖dashboard的修改 |
那我总结下,目前的问题就是规则绑定资源时资源名称的空格问题了,有两种情况:
|
总结得挺清晰的。你提到两个地方改,所以像Apollo这种push模式数据源,wiki上官方推荐的方式: 1.如果改造控制台,就可以参考这个数据流向,在控制台修改点保存后,不直接推送给客户端,而是保存到配置中心,配置中心再把变动推给客户端。这种方式就支持两边都同时修改。这里要注意的是,前面提到的,界面改了发http请求到后端,空格已被angular框架trim掉了; 2.如果暂时不想改造控制台,建议就只在配置中心修改,控制台仅查看或者少量临时性修改; 3.如果什么都不作改动,把资源名称的空格去掉是最简单的解决方式。 参考:
|
对,目前在不做任何扩展的情况下,最好就是在使用资源名称时不要加空格,否则会出现莫名其妙的问题,因此建议dashboard中编辑时不要做trim(新建可以trim),用户定义的是什么就是什么,这样其实很容易就会发现多了个空格,因为对于第一种情况不管如何修改都是可以匹配的,而对于第二种情况不管在哪修改,流控始终不生效,使用者很快就会意识到是资源名称不匹配,而不是改了某个地方就生效,这种会把简单的错误隐藏的很深,不深入源码调试难以发现,我觉得不应该trim不能编辑的东西,应该把用户的错误或者意图完整保留,由用户自己去发现控制 |
就是编辑保存时后端代码不trim resource,因为前端界面资源名称是不能编辑的; 还是请@CarpenterLee @sczyh30确认下吧 |
对,正常的名称是没问题的,就怕手抖,多打了个空格,可能会出现莫名其妙的情况 |
感谢两位的讨论。这个地方新建的时候应该是要 trim 的(之前是有的,1.4.0 改造时搞丢了),防止空格的问题。我们会在 1.4.1 版本中修复这个问题。 |
@sczyh30 新增规则,资源名有空格,点保存后发现也没空格。查看http请求,前端已经trim了;在控制台新增是没有空格的; @techzealot 他是在配置中心上新增的,新增时填资源名有空格,然后希望在控制台编辑规则的时候,不trim掉,保存资源名称不变。逻辑上说还是有道理的,因为前端界面资源名都不能改,那么后端按理说在update时不应当trim |
Already resolved in 1.4.1. Thanks for discussion. |
Issue Description
例如:假设存在资源“/hello/test”,在配置中心或者设置规则时resourceName带了空格"[n ]/hello/test[n]"(方括号标识空格,n表示若干),则在dashboard上无法明显看出,但是当修改该资源的其它属性时,由于
Sentinel/sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/view/FlowControllerV1.java
Line 168 in 0059b1a
这行代码会trim掉空格,就会导致资源名称悄悄发生了改变,保存之后刚好可以匹配,流控生效,但是若修改配置中心中该规则的配置,这条不带空格的规则也会跟着变化,导致看起来配置中心的规则已生效,实际情况是修改并未生效,此时资源名称又变回了带空格的,因此无法匹配,而且相当难以发现,实际上整个流程中产生了两条规则,但是它们却并没有以两条的形式展示出来,而且用户点击了编辑按钮,资源名也无法编辑,也不应生成新的规则,令人相当困惑
Type: bug report
Describe what happened (or what feature you want)
dashboard修改规则时去除了资源名称前后的空格导致规则发生了变化但是却又未在界面上有所区分
Describe what you expected to happen
资源名称要么都不处理空格,要么整个系统中都要统一处理空格
How to reproduce it (as minimally and precisely as possible)
Tell us your environment
win 10,idea,jdk 8,sentinel 1.4
Anything else we need to know?
no
The text was updated successfully, but these errors were encountered: