核心是通过运行时注解+反射实现动态路由:定义@apiroute注解声明路径、方法等元数据,启动时扫描注册到内存路由表,请求由filter按key匹配并反射调用,支持热加载、灰度与多版本并行。

核心在于用注解声明路由意图,靠反射在启动时扫描、注册,再由统一拦截器按需调用——整个过程不写死类名、不改配置、不重启服务。
定义清晰的路由注解
注解是路由规则的“说明书”,必须带运行时保留策略:
- 用@Retention(RetentionPolicy.RUNTIME)确保反射能读到
- 标注在类或方法上,比如@ApiRoute(path = "/user/detail", method = "GET")
- 属性尽量精简:path(必填)、method(默认GET)、auth(是否鉴权)、timeout(超时毫秒)等
- 避免嵌套或复杂类型,只放字符串、枚举、基本类型,方便反射安全读取
启动时扫描并注册路由表
系统初始化阶段,主动发现所有带路由注解的类和方法:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 用ClassGraph或Spring Boot的ResourcePatternResolver扫描指定包路径
- 对每个候选类,调用cls.getDeclaredMethods()遍历方法
- 对每个方法,执行method.getAnnotation(ApiRoute.class)提取元数据
- 把path + method → 实例 + 方法对象存进内存路由表(如ConcurrentHashMap
)
请求到达时动态分发执行
不需要 Spring MVC 的完整 DispatcherServlet,一个轻量 Filter 就够用:
- Filter 拦截请求,拼出唯一 key,例如"GET:/user/detail"
- 从路由表查出对应RouteHandler(含目标对象实例与Method引用)
- 调用method.invoke(instance, request, response)执行业务逻辑
- 异常时统一包装返回,不暴露反射细节
支持热加载与灰度切换
注解+反射天然适配运行期变更:
- 新组件打上@ApiRoute放入 classpath,扫描器下次刷新即可识别
- 旧路由可加enabled = false临时下线,无需删除代码
- 同一 path 不同 method 可指向不同实现类,靠注解属性区分版本或租户
- 配合类加载器隔离,甚至能实现单接口多版本并行运行










