在日常生活开发中,协进会碰触到各种USB。其间端传输USB,服务端销售业务网络平台USB。两个网络平台的其间端传输USB通常单厢其中网自然环境下通讯,所以会采用安全可靠架构,所以可靠性能得到较好的为保护。这首诗重点谈谈提供给服务端网络平台的销售业务USB应怎样结构设计?我们应该考虑什么样难题?
主要就从以上三个方面来结构设计两个安全可靠的APIUSB。
一 可靠性难题
可靠性难题是两个USB必须要确保的规范化。假如USB确保没法可靠性,那么你的USB相等于间接曝露在奥梅利自然环境Haveri人摧残。
1.1 初始化USB的必要条件-token
控制系统的凭据。
appid和appkey能间接通过网络平台圣戈当斯区提出申请,也能实体店间接颁授。appid是自上而下惟一的,每个appid将相关联两个顾客,appkey需要度秘密性。
timestamp是天数戳,采用控制系统当前的unix天数戳。天数戳的目的是为的是减低DOS反击。避免允诺被截击后一直试著允诺USB。服务端增设天数戳danger,假如允诺天数戳和伺服器天数超过danger,则积极响应失利。
nonce是乱数值。乱数值主要就是为的是增加sign的博戈达,也能为保护USB的幂等性,交界处的三次允诺nonce不容许多次重复,假如多次重复则认为是多次重复递交,积极响应失利。
sign是模块亲笔签名,将appkey,timestamp,nonce堆叠起来展开md5身份验证(当然采用其他形式展开不可逆身份验证也没难题)。
更高),也能增设及时性,这里所推荐增设及时性。假如一次有效的话这个USB的允诺振幅可能会极高。token所推荐加到允诺身上,这样能跟销售业务模块完全界定开去。
1.2 采用POST作为USB允诺形式
通常初始化USB最常见的两种形式是GET和POST。二者的差别也很明显,GET允诺会将模块曝露在应用程序URL中,所以对宽度也有限制。为的是更高的可靠性,所有USB都采用POST形式允诺。
1.3 顾客端IP白名单
ip白名单是指将USB的访问权限对部分ip展开开放。这样就能避免其他ip展开访问反击,增设ip白名单比较麻烦的一点是当你的顾客端展开迁移后,就需要重新联系服务提供者添加新的ip白名单。增设ip白名单的形式很多,除了传统的防火墙之外,spring cloud alibaba提供的组件sentinel也支持白名单增设。为的是降低api的复杂度,所推荐采用防火墙规则展开白名单增设。
1.4 单个USB针对ip限流
限流是为的是更好的维护控制系统稳定性。采用redis展开USB初始化次数统计,ip+USB地址作为key,访问次数作为value,每次允诺value+1,增设过期时长来限制USB的初始化振幅。
1.5 记录USB允诺日志
采用aop自上而下记录允诺日志,快速定位异常允诺位置,排查难题原因。
1.6 敏感数据脱敏
在USB初始化过程中,可能会涉及到订单号等敏感数据,这类数据通常需要脱敏处理,最常见的形式是身份验证。身份验证形式采用可靠性比较高的RSA非对称身份验证。非对称身份验证算法有两个密钥,这两个密钥完全不同但又完全匹配。只有采用匹配的一对公钥和私钥,才能完成对明文的身份验证和解密过程。
二 幂等性难题
幂等性是指任意多次允诺的执行结果和一次允诺的执行结果所产生的影响相同。说的直白一点是查询操作无论查询多少次都不会影响数据本身,因此查询操作本身是幂等的。但是新增操作,每执行一次数据库就会发生变化,所以它是非幂等的。
幂等难题的解决有很多思路,这里讲一种比较严谨的。提供两个生成乱数数的USB,乱数数自上而下惟一。初始化USB的时候带入乱数数。第一次初始化,销售业务处理成功后,将乱数数作为key,操作结果作为value,存入redis,同时增设过期时长。第二次调用,查询redis,假如key存在,则证明是多次重复递交,间接返回错误。
三 数据规范化难题
3.1 版本控制
一套成熟的API文档,一旦发布是不容许随意修改USB的。这时候假如想新增或者修改USB,就需要加入版本控制,版本号能是整数类型,也能是浮点数类型。通常USB地址单厢带上版本号,http://ip:port//v1/list。
3.2 积极响应状态码规范化
两个牛逼的API,还需要提供简单明了的积极响应值,根据状态码就能大概知道难题所在。我们采用http的状态码展开数据封装,例如200表示允诺成功,4xx表示顾客端错误,5xx表示伺服器内部发生错误。状态码结构设计参考如下:
状态码枚举类:
3.3 统一积极响应数据格式
为的是方便给顾客端积极响应,积极响应数据会包含三个属性,状态码(code),信息描述(message),积极响应数据(data)。顾客端根据状态码及信息描述可快速知道USB,假如状态码返回成功,再开始处理数据。
积极响应结果定义及常见方法:
public class R implements Serializable {
private static final long serialVersionUID = 793034041048451317L;
private int code;
private String message;
private Object data = null;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
/**
* 放入积极响应枚举
*/
public R fillCode(CodeEnum codeEnum){
this.setCode(codeEnum.getCode());
this.setMessage(codeEnum.getMessage());
return this;
}
/**
* 放入积极响应码及信息
*/
public R fillCode(int code, String message){
this.setCode(code);
this.setMessage(message);
return this;
}
/**
* 处理成功,放入自定义销售业务数据集合
*/
public R fillData(Object data) {
this.setCode(CodeEnum.SUCCESS.getCode());
this.setMessage(CodeEnum.SUCCESS.getMessage());
this.data = data;
return this;
}
}
总结
本首诗从可靠性、幂等性、数据规范化等方面讨论了API结构设计规范化。除此之外,两个好的API还少没法两个优秀的USB文档。USB文档的可读性非常重要,虽然很多程序员都不喜欢写文档,所以不喜欢别人不写文档。为的是不增加程序员的压力,所推荐采用swagger或其他USB管理工具,通过简单配置,就能在开发中测试USB的连通性,上线后也能生成离线文档用于管理API。