问题发生我测试的是 2.2.0版本

  • 某个接口使用了第三方接口导致处理时间超过3s
    • 前端发现报连接超时
    • 后端发现一切正常并且接口执行成功
    • 网关发现报错
      • Did not observe any item or terminal signal within 3000ms in 'peekTerminal' (and no fallback has been configured)

问题解决

  • 接口注册到网关时发现了有个字段 handle 中存储有 timeout 3000

    修改参数为10000 rule表 handle 字段 {“loadBalance”:”random”,”retry”:0,”timeout”:3000}

    • 测试为解决问题
  • 修改未生效
  • 改参数不是连接超时的配置
    • 询问开发群时,有人问了我设置的 规则设置的超时时间是多少?
      • 最开始的方向正确
      • 最终发现是修改数据库后未同步到缓存
      • image.png

问题追述

不可能每次都去修改数据库参数

  • 发现官方文档有关于handle的自定义参数配置 配置插件额外的配置参数

    • 经测试发现配置无法生效

      官方回复: histrix 和divide 没有必须的默认属性,所以就没有对应值就加载不出

  • 源码调试 (2.3.0-SNAPSHOT),自动注册 ```java

/**

  • 设置默认 handle 的方法
  • Get a RuleHandle object with given rpc type and path.
  • (获取具有给定rpc类型和路径的RuleHandle对象。)
  • @param rpcType rpc type.
  • @param path path.
  • @return RuleHandle object. */ public static RuleHandle ruleHandle(final RpcTypeEnum rpcType, final String path) {
    1. if (Objects.isNull(rpcType)) {
    2. return null;
    3. }
    4. Class<? extends RuleHandle> clazz = RPC_TYPE_TO_RULE_HANDLE_CLASS.getOrDefault(rpcType, DEFAULT_RULE_HANDLE);
    5. try {
    6. // DivideRuleHandle
    7. return clazz.newInstance().createDefault(path);
    8. } catch (InstantiationException | IllegalAccessException e) {
    9. throw new SoulException(
    10. String.format("Init RuleHandle failed with rpc type: %s, rule class: %s, exception: %s",
    11. rpcType,
    12. clazz.getSimpleName(),
    13. e.getMessage()));
    14. }
    } ```

    3000ms的参数在 Constants 中写死的org.dromara.soul.common.constant

最终结果

  • 处理修改数据库的方法,其他暂时不好弄

    由于写死的想要改动只能改源码

    1. 将 private long timeout = Constants.TIME_OUT; 变成读取配置文件
    2. 手动将默认值3000改大点
    3. 将divide加上插件处理属性

小注

plugin-handler功能

image.png