spring gateway 鉴权_通过spring实现service变成controller,代码得到了简化

在网上发现了一个牛X的思路,在做restful的时候,如果业务改变,需要每次都修改controller,后来方便了,直接透传的方式,其实也比较麻烦,每次都要写controller。需求变了接口也发生了改变,长期这样的结果,就是维护成本越来越高,直接service 通过spring 让他变成controller不就少写很多代码了。源码:https://github.com/limingios/netFuture/tree/master/api网关/idig8-api-gateway

61d52a48f4b5b8fb2bd7a19c48f18fb8.png

背景

移动互联时代,都在追寻一个万能的解,其实这个解可能不存在。其实后端开发的挑战越来越多。里面很多个controller,如果系统越来越庞大,导致的结果维护困难。

3a3f98846416f7c3fd895d9d30d2cb84.png

什么是API网关

API网关是一个轻量的java http 接口组件,可无缝将普通的 Serive 方法转换成 http 接口。并从已下几点来达到提高开发效率与接口质量的目的。

  1. 去掉mvc控制器,将http请求直接无缝接入JAVA服务接口
  2. 统一出入参格式
  3. 统一异常规范
  4. 自动检测服务接口规
  5. 负责路由协议的转换
  • 普通的http接口
97f022022fe7a5b7bbc1017360d780e5.png
  • API网关接口的实现
4609081ad172514f2a867e25f6f296c3.png

当初一个接口开发一个控制器,1000个接口开发1000个控制器。一个一个封装参数,质量也提高了统一规范,出问题统一的方式回馈。不规范的代码也会被api网关拦截掉。

代码讲解

就5个类,不到500行代码。开发的人最喜欢又小又精湛的代码,不容易软。方便理解,方便使用,又粗又大的代码,很不方便迁移,不好控制容易软。

1.ApiGatewayHandler.java

转换器和调用加载器

2.ApiGatewayServlet.java

类似springboot的一个入口类

3.APIMapping.java

注解暴露类

4.ApiRequest.java

请求封装类

5.ApiStore.java

API IOC 大仓库
2648288a6878c8571b67bc372d37a91f.png

代码的方式流程图

4b5211e5ed118e3f1f7705b96fe0d89e.png
  • 请求参数说明:

名称类型描述methodstring方法名称paramterjson业务参数timestamplong请求时间戳

  • 实现技术:
  1. java servlet
  2. spring Ioc
  3. Json 转换工具的使用

接口安全的业务需求

  • 接口安全级别分组
  1. 黑名单组

我的,账户信息

  1. 白名单组

商品展示,商品列表

3.黑白名单组

商品详情内的展示,已登录和未登录之间的区别

  • 基于Token安全机制认证要求
  1. 登录鉴权
  2. 防止业务参数串改

fiddler抓包工具。可以实现。

  1. 保护用户敏感信息

用户Id,在网络上是不进行传输的,都是用token来代替

  1. 防签名伪造

客户端和服务端都有一套token和Secret的,传输的时候不是用secret传输,是的签名

  • Token 认证机制整体架构

整体架构分为Token生成与认证两部分:

  1. Token生成指在登陆成功之后生成 Token 和密钥,并其与用户隐私信息、客户端信息一起存储至Token表,同时返回Token 与Secret 至客户端。
  2. Token认证指客户端请求业务接口时,认证中心基于Token生成签名。
0042966dce4fde2124714b25d536c9ce.png
  • Token表结构说明:

其实如果token加入索引的话,查询也比较快,但是相对于redis来说肯定是没有redis快的。

e7ea74ef5e2f5171c555ff3dc9c1ffd3.png
  • 业务请求具体参数:
76b1c2a4977c2488f770566ab1e93280.png

签名规则:

  1. 已指定顺序拼接字符串 secret+method+param+token+timestamp+secret
  2. 使用MD5进行加密,在转化成大写

签名的目的:

  1. 防串改
  2. 防伪造
  3. 防重复使用签名

服务端签名验证的具体流程:

7b67d33a5957eef7f11531ec8d572895.png

签名认证与API网关的整体认证流程

e17a56ea7410f637c0b52dfedaaed8d7.png

PS:主要是了解思路,对于性能我建议先别考虑,先实现之后才能谈性能问题,性能问题没有绝对的只有相对的。最主要是签名的获取生成的思路。源码在github上。

看到这里,点了关注吧!

10c9ae77caf1e2203c16405cede7da6a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中return返回值_Java中return的用法

展开全部一、return语句总是用在方法中,有两个作用。一个是返回方法指定类型的值(这个值总62616964757a686964616fe59b9ee7ad9431333366306434是确定的)。一个是结束方法的执行(仅仅一个return语句)。二、实例1 。返回一个String。private String gets(){String s …

Magento 模块详解

模块(module)是Magento的核心。站点上的任何 一个动作(action),无论是在前台和还是在后台的每一个操作都是通过模块来实现的。模块是可以视为一个容器,它可包 含下面这几项:设置(settings)&…

python运行别人的项目_pycharm实现在虚拟环境中引入别人的项目

如果你想引入别人的项目,但是呢引入的项目可能与自己原先装的模块的版本产生冲突,而且如果引入一个项目就在本地进行运行使用,每个项目用的依赖包都不大相同,就会导致解释器安装包过多,就会导致加载过慢,甚…

java 事件分发线程_深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) [转载]...

本系列文章导航本文主要解决的问题是:如何使其Swing程序只能运行一个实例?抛开Swing, 我们的程序是通过java 命令行启动一个进程来执行的,该问题也就是说要保证这个进程的唯一性,当然如果能够访问系统的接口&#xff0…

java redis 分布式锁_使用Redis单实例实现分布式锁

一、前言在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就无能无力了,这时候就需要分布式锁了。常见…

设计一个按优先数调度算法实现处理器调度的程序_计算机中的程序都是怎么运行的,来深入了解一下吧...

在现代计算机操作系统中,总是会保持多道程序环境。一个作业被提交后,通常经过作业调度和进程调度后,才能获得处理机。有时为提高内存利用率,还会设置中程调度。那我们先来了解一下处理机调度的层次吧。高级调度,又称作…

从数据库加载程序集

有的做MSCRM2011开发的朋友会奇怪,注册的Plugin可以注册在数据库中,那么它如何去加载这个dll呢。最近正好有空,简单地实现了一下从数据库加载程序集,关键的地方是需要使用Assembly.Load方法的一个重载: Assembly.Load(…

Android 获取包名,版本信息及VersionName名称

话不多说,直接上代码,此处,主要是在版本升级的时候,使用较多。private String getAppInfo() {try {String pkName this.getPackageName();String versionName this.getPackageManager().getPackageInfo(pkName, 0).versionName;…

mysql 查看锁_SQL-mysql锁等待与死锁

一 前言本篇是MYSQL高级进阶篇内容第二篇,学习本篇的基础是知识追寻者之前发布过的文章,尤其是《MYSQL架构入门篇》重中之重;《SQL-你真的了解什么SQL么?》《SQL-小白最佳入门sql查询一》《SQL-小白最佳入门sql查询二》《SQL- 多年…

easyui datagrid java_EasyUI DataGrid 显示不了数据????

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Struts2:text/htmlaction:public String getList() throws Exception {// TODO Auto-generated method stubLong count (long) recruitBiz.countRecruitInfo();List list recruitBiz.findRecruitBySearch(page,rows, null);JSONO…

sed 手册阅读笔记转

原文链接sed 手册阅读笔记摘要sed 手册本身不太适合初学者,我在看的过程中加了一些 自己的注释和一些例子,帮助理解,如有偏差或错误,请指出,多谢。目录1. sed的工作原理 2. sed中如何选择特定的行 3. sed的命令行选项 …

java -cp 引用多个包_Java -cp 命令行引用多个jar包的简单写法(Windows、Linux)

1、Windows下用法在Windows上,可以使用java your-jar-lib-fold/* your-main-classyour-jar-lib-fold为存放一堆jar文件的路径。your-main-class为要运行的具有main方法的主类。JDK 1.7及以上版本支持该写法。2、Linux下用法在Linux上,这样写似乎并不支持…

python bytearray转为byte_Python3 bytearray() 函数详解 将参数转为可变的字节数组

Python3 bytearray() 函数详解 将参数转为可变的字节数组bytearray()函数的主要用途是将参数转换为一个新的字节数组&#xff0c;它是一个可变的整数序列&#xff0c;它的取值范围是0 < x < 256(0~255)&#xff0c;它具有可变序列的大多数方法。它是Python的内置函数&…

第三方库添加记录

1 ASIHTTPRequest&#xff1a; a.下载asihttprequest b.  把Classes里的文件&#xff0c;拖到XCode中  External/Reachbility也拖进去 ->这是Apple 官方用来检查网络链接是否正常的类库 c.导入框架  SystemConfiguration.framework  MobileCoreServices.framewo…