说明
公司的 Ficus 基础框架中的 ficus-starter-server 使用本地网关对路由做了统一的规划。比如:AdminGateway 统一使用 /admin-api/**路径,使用管理用户鉴权过滤器,会注册所有标记为 adminApi 的组件接口;AppGateway 统一使用 /app-api/**路径,使用会员鉴权过滤器,会注册所有标记为 appApi 的组件接口;而OpenGateway 统一使用 /open-api/**路径,则增加了签名校验的过滤器,会注册所有标记为 openApi 的组件接口。

一体机服务也是基于 Ficus 基础框架开发,但是因为是一个独立运行的服务,而不是基于平台的微服务,因此需要调整自己的本地 Gateway 配置。
问题
一体机增加自己的本地网关的配置。
@Component
@Mapping("/admin-api/**")
public class AioAdminGateway extends Gateway {
@Inject private SecurityProperties securityProperties;
/** index 越小优先级越高 */
@Override
protected void register() {
filter(-1, new FicusTraceFilter());
filter(0, new FicusAdminExceptionFilter());
filter(4, new AioAdminFilter(securityProperties));
filter(5, new LicenseFilter());
// 添加Bean
addBeans(bw -> "adminApi".equals(bw.tag()));
}
}
测试的时候发现,虽然 swagger 里可以看到接口,但是请求的时候提示 404,把断点打在 Controller 或者 Filter 上都没有进入。
原因
经过一段时间的排查时找到原因了。ficus-starter-server 组件,会先执行AdminGateway,但因为 autoScanRoute=false 关闭了 Filter 和 Action 的注册,所以 /admin-api/**是没有接口的,也就无法访问了。
而 AioAdminGateway 虽然也注册到 /admin-api/**,但是更晚注册的,可能地址重复了,实际上没有真正注册 Action。
而 Swagger 没有做判断,只要是 adminApi 标记的就会加载到接口列表中,所以出现了接口可见,但请求不了的怪异现象。
/**
* @author airhead
*/
@Component
@Mapping("/admin-api/**")
public class AdminGateway extends BaseGateway {
@Inject private TenantProperties tenantProperties;
@Inject private SecurityProperties securityProperties;
@Inject private WebProperties webProperties;
/** index 越小优先级越高 */
@Override
protected void register() {
// 部分情况不希望server来自动扫描路由,手动添加
if (!webProperties.getAutoScanRoute()) {
return;
}
filter(-1, new FicusTraceFilter());
filter(0, new FicusAdminExceptionFilter());
filter(2, new FicusTenantFilter(tenantProperties));
filter(3, new FicusAdminFilter(securityProperties));
// 添加Bean
addBeans(bw -> "adminApi".equals(bw.tag()));
}
}
处理
使用 Condition 注解,如果autoScanRoute=false不创建对应的 bean。Condition 的使用参考 https://solon.noear.org/article/434。
/**
* @author airhead
*/
@Mapping("/admin-api/**")
@Component
@Condition(onProperty = "${ficus.web.autoScanRoute:true} == true")
public class AdminGateway extends BaseGateway {
@Inject private TenantProperties tenantProperties;
@Inject private SecurityProperties securityProperties;
@Inject private WebProperties webProperties;
/** index 越小优先级越高 */
@Override
protected void register() {
filter(-1, new FicusTraceFilter());
filter(0, new FicusAdminExceptionFilter());
filter(2, new FicusTenantFilter(tenantProperties));
filter(3, new FicusAdminFilter(securityProperties));
// 添加Bean
addBeans(bw -> "adminApi".equals(bw.tag()));
}
}
后续
登记了个 issue,如果路由冲突的时候增加打印告警日志。https://gitee.com/opensolon/solon/issues/ID7MWK
391

被折叠的 条评论
为什么被折叠?



