目录
RESTful是什么
- RESTful就是根据HTTP的请求方法去匹配服务器上面的API接口。
- 相当于把服务器上面的服务进行了资源化,具有统一的URL地址,然后提供了增删改查四个功能。
WebService/WCF/WebAPI
- WebService是基于SOAP协议实现的,数据格式是XML,在网络传输的过程中只支持HTTP协议。
- WCF也是基于SOAP协议实现的,数据格式也是XML,但是在网络传输的过程中可以支持HTTP,HTTPS, TCP多种协议。
- WebAPI是基于HTTP协议实现的,在网络传输的过程中可以支持HTTP和HTTPS这两种协议,数据格 式是JSON。
WebAPI常用特性
- FromForm对应的Content-Type是application/x-www-form-urlencoded类型,获取的是HTTP请求体中 的表单数据。
- FromBody对应的Content-Type是application/json类型,获取的是HTTP请求体中的JSON格式的数据。
- FromServices是从IOC容器里面找到这个类型的对象,并把它设置到方法的参数中,不需要通过构造函 数的方式进行注入,属于方法注入。
API接口设计规范
API接口要使用Token
- 使用Token能做到单点登录,也能保证接口的安全性。
- 鉴权中心根据账号和密码生成Token,HTTP请求带着Token就可以访问API接口,API接口也认可这个 Token,不需要再去鉴权中心进行校验,第三方的API接口也认可这个Token,这种模式就是单点登录, 也叫做SSO。
尽量使用POST作为接口的请求方式
- 接口最常用的两种请求方式就是GET和POST。
- 但是GET请求会将参数暴露在浏览器的URL地址中,浏览器对URL的地址长度也有限制。
- 所以为了更高的安全性,尽量都采用POST方式发送HTTP请求。
- POST方法比GET方法更安全,它也仅限于数据在浏览器的地址栏上不可见。
- 从数据传输的角度来说,它们都是不安全的,因为HTTP在网络上是明文传输的,如果在网络节点上被 抓包,就能够获取完整的数据报文。
- 所以想要比较安全的数据传输,就只能加密,也就是使用HTTPS。
客户端IP白名单
- 有些接口比较特殊,对于公司来说,这部分接口只能让一部分用户进行使用。
- 所以可以将这些接口的访问权限只对部分的IP进行开放。
- Nginx和Ocelot都可以设置IP的白名单。
- 如果想要简单一点,可以使用服务器的防火墙规则进行白名单的设置。
单接口限流
- 有些接口用户调用的次数非常频繁,再加上用户的数量非常庞大,会导致消耗比较多的网络带宽,对 数据库也会造成不小的压力。
- 所以可以对这些接口进行限流,限制这些接口单位时间内的访问量。
- Nginx和Ocelot都可以进行IP限流。
- 也可以使用Redis对接口的调用次数进行统计,可以将IP地址加上接口地址作为Key,访问的次数作 为Value,每次请求成功Value就加1,然后设置一个过期时长来限制接口的调用频率。
记录接口请求日志
- 可以使用Interceptor拦截器来记录进入某个方法前后的日志。
- ActionFilterAttribute也可以记录进入方法前后的日志。
- 还可以使用ExecptionFilterAttribute记录接口的异常信息。
敏感数据脱敏
- 在接口的调用过程中,可能会涉及到一些敏感的数据,这些数据通常需要进行脱敏处理,最常用的方 式就是加密。
- 加密的方式可以使用安全性比较高的RSA非对称可逆加密。
- 对方把加密之后的数据,通过公钥解密成功之后才能获取到明文的信息。
接口的幂等性
什么是幂等性
- 幂等性是指一个方法被多次重复执行时,结果要和第一次执行的结果保持一致。
- 再说的直白一点,就是查询的操作无论查询多少次都不会影响数据本身的结果,所以查询的操作就是 幂等的。
- 但是新增的操作,每执行一次数据库就会发生变化,所以新增的操作就是非幂等的。
为什么要考虑幂等性
- 在网络通信的过程中,有两种行为都有可能会导致接口被重复的执行。
- 第一种是用户的重复提交或者用户的恶意攻击。
- 第二种就是为了避免数据丢失,采用的超时重试机制。
- 这两种情况都有可能会导致服务的接口被重复的调用。
- 所以在程序的设计过程中,对于数据变更类的接口,需要保证接口的幂等性。
WebAPI中哪些动作是幂等的?
- GET是安全并且幂等的,适合查询类接口使用。
- POST是不安全并且不幂等的,适合提交类接口使用。
- PUT是不安全但是幂等的,适合更新类接口使用。
- DELETE是不安全但是幂等的,适合删除类接口使用。
如何解决幂等性问题
- 使用数据库的唯一约束实现幂等,对于数据插入类的场景,如果进行多次调用就会触发数据库的唯一 约束异常,从而能避免一个请求创建多条数据的问题。
- 使用乐观锁。
- 使用Redis数据库提供的SETNX指令,对于MQ消费的场景,为了避免MQ重复消费导致数据多次被 修改的问题,可以在接受到MQ的消息时,把这个消息通过SETNX指令写入到Redis数据库中,一旦 这个消息被消费过了,就不会再次消费了。
- 可以提供一个生成随机数的接口,随机数全局唯一,调用接口的时候带入随机数。
- 第一次调用的时候,等业务处理完成之后,将随机数作为Key,操作的结果作为Value,存入到 Redis中,同时设置过期时长。
- 第二次调用的时候,查询Redis,如果Key存在,说明是重复的提交,直接返回错误。
分布式ID生成器
是什么
- 如果是分布式的环境,不能使用数据库本身的自增ID来生成主键值,在分布式的环境中可能会导致有 重复的ID值。
- 可以考虑使用GUID,或者雪花ID来生成唯一的主键值。
雪花算法原理
雪花ID就是使用一个64位的long型数字作为全局唯一的ID。
雪花算法结构
- 第一个bit表示0,long在C#中是带符号的,最高位是符号位,正数是0,负数是1。因为生成的 ID 都是正数,所以第一个bit统一都是0。
- 接下来的41个bit表示毫秒级的时间戳,换算成年就是69年时间。
- 再接下来的10个bit用来记录服务器的ID,表示服务最多可以部署在1024台服务器上面。
最后的12个bit用来记录同一个毫秒内产生的不同ID,能生产的最大ID数量是4096。
雪花算法优点
- 雪花ID在高并发的分布式环境中能保证主键的ID值不重复。
- 雪花算法是在内存中进行的,所以生成的效率也比较高。
- 雪花算法也是基于时间戳的,所以可以保证最基本的有序递增。
雪花算法缺点
雪花算法主要依赖于服务器的时间,如果服务器的时间回拨可能会产生重复的ID。
响应状态码
- 1开头的表示服务器收到了请求,需要请求者继续执行操作。
- 2开头的表示成功。比如200表示常规的请求。201表示创建成功。
- 3开头的表示重定向,需要进一步的操作才能完成请求。比如301表示永久的重定向。302表示暂时的 重定向。
- 4开头的表示客户端的错误,请求包含错误或者无法完成请求。比如401表示鉴权失败,需要进行身 份认证。403表示授权失败,当前的请求没有权限。404表示请求的路径不存在。405表示请求的方法 不存在。
- 5开头的表示服务器的错误。比如500表示服务器的异常。