问题发生我测试的是 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}
- 测试为解决问题
- 修改未生效
- 改参数不是连接超时的配置
- 询问开发群时,有人问了我设置的
规则设置的超时时间是多少?
- 最开始的方向正确
- 最终发现是修改数据库后未同步到缓存
- 询问开发群时,有人问了我设置的
问题追述
不可能每次都去修改数据库参数
发现官方文档有关于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) {
} ```if (Objects.isNull(rpcType)) {
return null;
}
Class<? extends RuleHandle> clazz = RPC_TYPE_TO_RULE_HANDLE_CLASS.getOrDefault(rpcType, DEFAULT_RULE_HANDLE);
try {
// DivideRuleHandle
return clazz.newInstance().createDefault(path);
} catch (InstantiationException | IllegalAccessException e) {
throw new SoulException(
String.format("Init RuleHandle failed with rpc type: %s, rule class: %s, exception: %s",
rpcType,
clazz.getSimpleName(),
e.getMessage()));
}
3000ms的参数在 Constants 中写死的org.dromara.soul.common.constant
最终结果
- 处理修改数据库的方法,其他暂时不好弄
由于写死的想要改动只能改源码
- 将 private long timeout = Constants.TIME_OUT; 变成读取配置文件
- 手动将默认值3000改大点
- 将divide加上插件处理属性
小注
plugin-handler功能
- 如果时其他插件可以使用 plugin-handler功能,就可以处理上面发生的问题
- divide 跟 histrix 都还没实现这个功能我测试的是 2.2.0版本
- https://dromara.org/zh/projects/soul/plugin-handle-explanation/