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

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

1、定义2个组件

API_0

@Component(tag = "api")
public class API_0 {
@Mapping
public 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 {
@Override
protected void register() {
addBeans(bw -> "api".equals(bw.tag()));
}
}

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

3、在 Gateway 上做点什么

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

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

Solon2 接口开发: 熟悉 Gateway的更多相关文章

  1. Solon2 接口开发: 强化 Gateway 模式

    一般可以从这几方面对 Gateway 模式进行强化: 定制异常状态码 定制基类 将一些处理独立封装成类 接口只返回数据部份,异常状态用抛 强化之后,具体的网关即简单,又功能强大.同时会对团队开发形成一 ...

  2. Solon2 接口开发: 分布式 Api Gateway 开发预览

    建议使用专业的分布式网关产品,比如: nginx apisix [推荐] k8s ingress controller 等... 对 Solon 来讲,只有 Gateway:它调用本地接口时,则为本地 ...

  3. 支付宝WAP支付接口开发(Node/Coffee语言)

    此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...

  4. 支付宝WAP支付接口开发

    支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...

  5. 《Web接口开发与自动化测试 -- 基于Python语言》 ---前言

    前    言 本书的原型是我整理一份Django学习文档,从事软件测试工作的这六.七年来,一直有整理学习资料的习惯,这种学习理解再输出的方式对我非常受用,博客和文档是我主要的输出形式,这些输出同时也帮 ...

  6. 支付宝(alipay)即时到账收款接口开发中的那些事儿

    不会做,看看也可以会,要做好就还是需要多学习 国庆回来就一直没状态,看完<银河护卫队>,印象最深的竟然是只有两句台词的呆萌groot,昨天才休息一天,大耍大吃,今天还是把昨天的知识学习一下 ...

  7. 【转】支付宝WAP支付接口开发

    支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...

  8. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

  9. 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  10. 《Python Web 接口开发与测试》---即将出版

    为什么要出这样一本书? 首先,今年我有不少工作是跟接口自动化相关的,工作中的接口自动化颇有成效. 我一直是一个没有测试大格局的人,在各种移动测试技术爆发的这一年,我却默默耕耘着自己的一亩三分地儿(We ...

随机推荐

  1. 如何在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1

    安装python3.8.1 步骤 1:检查Python版本 在终端中输入以下命令来检查当前安装的Python版本: python --version 步骤 2:安装编译Python所需的依赖项 更新系 ...

  2. 解码注意力Attention机制:从技术解析到PyTorch实战

    在本文中,我们深入探讨了注意力机制的理论基础和实际应用.从其历史发展和基础定义,到具体的数学模型,再到其在自然语言处理和计算机视觉等多个人工智能子领域的应用实例,本文为您提供了一个全面且深入的视角.通 ...

  3. 多维详述MediaBox互动直播AUI Kit低代码开发方案

    本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构.技术性能.开发能效和最佳实践,一起开启音视频的开发之旅.本文为MediaBox最佳实践篇,重点从互动直播AUI ...

  4. mysql group by 执行原理及千万级别count 查询优化

    大家好,我是蓝胖子,前段时间mysql经常碰到慢查询报警,我们线上的慢sql阈值是1s,出现报警的表数据有 7000多万,经常出现报警的是一个group by的count查询,于是便开始着手优化这块, ...

  5. Node.js精进(12)——ElasticSearch

    ElasticSearch(简称 ES)是一款基于 Lucene 的分布式.可扩展.RESTful 风格的全文检索和数据分析引擎,擅长实时处理 PB 级别的数据. 一.基本概念 1)Lucene Lu ...

  6. 本地MinIO存储服务Java远程调用上传文件

    MinIO是一款高性能.分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等低成本机器也能够很好的运行MinIO.它的优点包括高性能.高可用性.易于部署和管理.支持多租户等. Cpola ...

  7. MySQL-管理员root@'locahost' 丢失,怎么处理?

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 跳过授权表 ----> 不开启验证功能(无密码登录) --skip-grant-tables 阻止所有tcp/i ...

  8. [CF1168C] And Reachability

    And Reachability 题面翻译 题目描述 Toad Pimple 有一个整数数组 \(a_1,\dots,a_n\). 当 \(x < y\) 且存在 \(x = p_1 < ...

  9. 【scikit-learn基础】--『预处理』之 标准化

    数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...

  10. Python 中如何编写类型提示

    哈喽大家好,我是咸鱼 我们知道 Python 是一门具有动态特性的语言,在编写 Python 代码的时候不需要显式地指定变量的类型 这样做虽然方便,但是降低了代码的可阅读性,在后期 review 代码 ...