Solon2 接口开发: 熟悉 Gateway
创始人
2025-05-31 17:25:05

Gateway 是 Solon 框架的特殊控制器(也是Handler 的一个实现类)。它通过注册收集之后,在局部范围内提供:二级路由拦截过滤融断异常处理等功能,并统一到网关处理。

另一个作用:可以为同一批接口安排多个网关,进而定制不同的协议效果。

1、定义2个组件

API_0

@Component(tag = "api")
public class API_0 {@Mappingpublic Result exec() {return Result.failure(404, "Interface does not exist");}
}

API_hello_world

@Component(tag = "api")
public class API_hello_world {@Mapping("hello")public Result exec(String name) {return Result.succeed("Hello " + name);}
}

这2个组件,很特别???有@Mapping,看起来像控制器类。但它确用@Component注解,而且还有tag属性。

其实它们跟平常开发的控制器类是一样的。改用 @Component ,是为了不被根路由器扫描进去。而增加tag属性,是为了方便 Gateway 做局部扫描。

@Mapping 值为空时,会被 Gateway 做为默认接口对待。即找不到别的接口时,就用它。

2、定义 Gateway

ApiGateway

@Mapping("/api/**")
@Component
public class ApiGateway extends Gateway {@Overrideprotected void register() {addBeans(bw -> "api".equals(bw.tag()));}
}

最简单的 Gateway 只需要完成注册即可,输出效果跟普通的控制器差不多。启动服务后,我们就可以访问 http://localhost:8080/api/hello

3、在 Gateway 上做点什么

加一个前置处理,做令牌验证。再重写渲染,对未处理异常做控制。

@Mapping("/api/**")
@Component
public class ApiGateway extends Gateway {@Overrideprotected void register() {//添加个前置处理before(c -> {//检测有没有token(用 param 替代;方便手浏览器测试)if (c.param("t") == null) {//如果没有令牌;直接设定结果c.result = Result.failure(403, "Missing authentication information");//设为已处理(主接口就不会进去了)c.setHandled(true);}});//添加BeanaddBeans(bw -> "api".equals(bw.tag()));}//重写染处理异常@Overridepublic void render(Object obj, Context c) throws Throwable {if (obj instanceof Throwable) {c.render(Result.failure("unknown error"));} else {c.render(obj);}}
}

相关内容

热门资讯

8个月暴涨10倍,最火AI巨头... 光模块/CPO,又创历史新高了。再创新高,“易中天”大爆发今年以来,AI板块缔造了太多大牛股,而AI...
“祥源系”掌舵人俞发祥被刑拘!... 富豪沦为阶下囚,谁该为百亿兑付“埋单”?作者 | 于婞编辑丨高岩来源 | 野马财经一场涉及上百亿资金...
【视频】超级行动派:如何保卫财... 文 | 清和 智本社社长社长,这种经济环境,该怎么降低风险?怎么配置资产?这几年,经常有社友问我这两...
持续亏损、第三次增资,深蓝汽车... 从成立至今,深蓝汽车经历了销量快速增长的喜悦,也面临着持续亏损的困境,其发展历程折射出传统车企向新能...
“00后”体育生用AI做外贸,... 当下入局做外贸,要想赚到第一桶金,靠的是一个无所不能的“超级个体”,还是分工明确的“系统战队”?两年...