Solon 本地网关配置不当引起的 404 问题

说明

公司的 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值