分布式服务接口设计注意点

1、水平权限校验

水平权限漏洞一般出现在一个用户对象关联多个其他对象(订单等)、并且要实现对关联对象的CRUD的时候。
请求包含用户ID及关联对象ID时、务必校验关联对象是否属于该用户;

2、幂等

幂等操作的特点是任意多次执行所产生的影响均与一次执行的影响相同。
幂等操作的基本处理思路是: 调用者给消息一个唯一请求ID标识。ID标识一个工作单元,这个工作单元只应执行一次; 接收者在执行一个工作单元必须先检验该工作单元是否已经执行过。检查是否执行的逻辑通常是根据唯一请求ID ,在服务端查询请求是否有记录,是否有对应的响应信息,如果有,直接把响应信息查询后返回或者返回重复操作错误信息;如果没有,那么就当做新请求去处理。

3、防并发

防并发基本思路是使用锁:1、分布式锁(redis锁);2、乐观锁(版本号);3、状态锁定(对数据进行修改前判断前置状态)。

4、异步任务

慎用EventBus、ThreadPool等处理异步任务,服务宕机或者重启时会丢失任务。建议采用mq自发自收。

5、最终一致性

最终一致性为弱一致性、在需要强一致性的场景务必不能采用tmc等方式实现。(例如下单扣减额度等)

6、防重放

常用的防止重放的机制是使用timestamp和nonce做重放机制。timestamp用来表示请求的当前时间戳,nonce是随机数与timestamp加密生成,sign是对整个url的签名。
服务端接到这个请求:
1 )先验证sign签名是否合理,证明请求参数没有被中途篡改。
2 )再验证timestamp是否过期,证明请求是在最近60s被发出的。
3 )最后验证nonce是否已经有了,证明这个请求不是60s内的重放请求。

7、降级处理

当系统出现故障或压力过大时保证核心功能。
Hystrix的设计原则包括:资源隔离、熔断器、命令模式。
资源隔离:Hystrix利用Bulkheads(舱壁隔离模式), 将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩。
熔断器:设置错误率阈值,当请求错误率超过阈值,请求被禁止通过。经过一段时间后, 熔断器会自动进入半开状态, 允许一个请求通过,当该请求调用成功时, 熔断器恢复到关闭状态,若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过。
命令模式:Hystrix使用命令模式(继承HystrixCommand类)来包裹具体的服务调用逻辑(run方法), 并在命令模式中添加了服务调用失败后的降级逻辑(getFallback)。


转载于:https://juejin.im/post/5bac48f9f265da0aa52914b4

你可能感兴趣的:(分布式服务接口设计注意点)