Java实现系统统⼀对外开放⽹关⼊⼝设计
Java系统开放接⼝统⼀⽹关设计
springboot结构本⽂主要讲解开放接⼝设计,主要是以SpringBoot web 项⽬,基于⾃定义注解+反射+⾮对称加密RSA签名等实现的灵活的统⼀开放接⼝设计,⽂末附源码地址。
1.背景
互联⽹公司随着业务的发展,系统间或多或少会开放⼀些对外接⼝,这些接⼝都会以API的形式提供给外部。
为了⽅便统⼀管理,统⼀鉴权,统⼀签名认证机制,流量预警等引⼊了统⼀⽹关。API⽹关是⼀是对外接⼝唯⼀⼊⼝。
2.开放接⼝需要有哪些功能?需要注意什么?
除了业务功能还需要有
统⼀鉴权
流量监控
路由分发
架构简单易懂,⽅便维护
⽅便追加功能,不需要重复写鉴权等逻辑代码
对外开放的接⼝,数据安全性是第⼀位
如何保证安全通信,防⽌数据被恶意篡改等攻击呢?
怎么证明是你发的请 求呢?
⽐较流⾏的⽅式⼀般是
加密 -> 密⽂传输,接收⽅需要解密
加签 -> 双⽅建⽴秘钥-请求⽅加签,接收⽅验签防⽌数据中途被篡改
# 3.开放接⼝设计 **本⽂⽤到的主要技术点**
反射机制
RSA签名算法
SpringBoot
Hibernate-validator注解式参数校验
3.1统⼀⽹关接⼝参数
公共参数
参数类型是否必填最⼤长度描述
app_id String是32业务⽅appId
method String是200请求⽅法
version String是10默认:1.0 api_request_id String是32随机请求标识,⽤于区分每⼀次请求charset String是16默认:UTF-8
sign_type String是10签名类型:RSA或RSA2 sign String是-签名
content String是-业务内容 :json 格式字符串
返回内容
参数类型是否必填最⼤长度描述
success boolean是16是否成功
data Object是-返回业务信息(具体见业务接⼝)error_code String是10错误码(success为false时必填)error_msg String是128错误信息码(success为false时必填)**
3.1签名规则
这⾥是使⽤的是RSA签名
规则如下:
签名参数剔除sign_type 、 sign ;
将剩余参数第⼀个字符按照ASCII码排序(字母升序排序),遇到相同字母则按第⼆个字符ASCII码排序,以此类推;
将排序后的参数按照组合“参数=参数值”的格式拼接,并⽤&字符连接起来,⽣成的字符串为待签名字
符串;
使⽤RSA算法通过私钥⽣成签名
RSA === SHA1 --> base64
RSA2 === SHA256 --> base64
3.3代码实践
注:源码见⽂章末,依赖这⾥只简单列出了⽗pom中部分依赖,,详见源码⼯程结构图:
3.3.1Maven依赖
注:依赖这⾥只列举了⼀部分,⽂末附源码地址
open-api-project > pom
<properties>
<project.version>1.0.0</project.version>
&porting.outputEncoding>UTF-8</porting.outputEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<fasterxml.version>2.10.2</fasterxml.version>
<commons-lang3.version>3.4</commons-lang3.version>
<commons-collections.version>3.2.2</commons-collections.version>
<fastjson.version>1.2.70</fastjson.version>
<slf4j.version>1.7.25</slf4j.version>
<guava.version>21.0</guava.version>
<javax.servlet.version>3.1.0</javax.servlet.version>
<alipay-sdk.version>4.8.10.ALL</alipay-sdk.version>
<hutool.version>5.0.0</hutool.version>
<lombok.version>1.16.4</lombok.version>
<hibernate-validator.version>5.4.1.Final</hibernate-validator.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>${fasterxml.version}</version>
</dependency>
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons-collections.version}</version>
</dependency>
<!--fastjson json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- guava -->
<dependency>
<groupId&le.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<!-- 校验⼯具 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>${alipay-sdk.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
open-api-web > pom
<dependencies>
<dependency>
<groupId>com.open.api</groupId>
<artifactId>open-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- spring boot starters -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.3.2配置⽂件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论