我有一个问题。 我使用这个权威规则来保护我的项目的配音服务。 但另一个项目不使用sentinel,也从不导入sentinel dubbo适配器。 所以在我的项目调试点方法AuthorityRuleChecker-passCheck中:
class AuthorityRuleChecker { static boolean passCheck(AuthorityRule rule, Context context) { String requester = context.getOrigin(); // Empty origin or empty limitApp will pass. if (StringUtil.isEmpty(requester) || StringUtil.isEmpty(rule.getLimitApp())) { return true; } }
我发现这个请求者的值为null。因为{getOrigin}来自dubbo附件{dubboApplication} dubbo jar从不使用此附件。 所以我必须在另一个项目中导入sentinel dubbo适配器才能获得{dubboApplication}。 否则,它将不会在所有AuthorityRule中使用
public static final String SENTINEL_DUBBO_APPLICATION_KEY = "dubboApplication"; public static String getApplication(Invocation invocation, String defaultValue) { if (invocation == null || invocation.getAttachments() == null) { throw new IllegalArgumentException("Bad invocation instance"); } return invocation.getAttachment(SENTINEL_DUBBO_APPLICATION_KEY, defaultValue); } }
中文意思是:为什么要用dubboApplication这个属性来获取dubbo name,如果客户端没有引入sentinel的dubbo适配包,这里永远为空,加上判断,永远进不去AuthorityRuleChecker 这段逻辑. 我认为应该去的StringUtil.isEmpty(requester),否则会漏掉其他没有适配到的包.因为不一定每个项目都会引入这个包.所以配置了黑白名单,还是有其他系统能调用到服务端接口的.
这一点想请教一下这样设计的目的是为什么呢?盼复,Thanks♪(・ω・)ノ
原提问者GitHub用户cookiejoo
在我看来,这个适配器只是可能的实现之一,并且仅适用于成对集成的sentinel-dubo适配器。
对于那些我们不想引入适配器的消费者,我们可以自己填充附件(遵循原则),或者我们可以随意实现一个全新的适配器。
原回答者GitHub用户jasonjoo2010
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。