API设计和数据库设计原则有哪些?

547 阅读3分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

面试官: 技术方案一般要遵守哪些原则? 候选人: SOLID 原则?

此时,脑海中浮现出这么一张图: 在这里插入图片描述

言归正传:

API 设计原则有哪些?

Rest API 设计中,要正确使用 Http Verb

http 的 verb 语义:

# GET:读取(Read)
# POST:新建(Create)
# PUT:更新(Update)
# PATCH:更新(Update),通常是部分更新
# DELETE:删除(Delete

错误码返回规范:datatracker.ietf.org/doc/html/rf…

API 设计中一般需要向前兼容, 一般需要遵守如下原则:

  • 不要删除已有字段
  • 新增字段,必须是 optional (选填)
  • thrift 定义的 idl 序号不允许变更
  • 字段类型不允许变更
  • 整数全部使用有符号类型,不要使用无符号类型
  • 除了定义正常的网络 status Code 还要定义业务的 Error Code

常用的错误状态码如下:

400 Bad Request:服务器不理解客户端的请求,未做任何处理
401 Unauthorized:用户未提供身份验证凭据,或者没有通过身份验证
403 Forbidden:用户通过了身份验证,但是不具有访问资源所需的权限
404 Not Found:所请求的资源不存在,或不可用
405 Method Not Allowed:用户已经通过身份验证,但是所用的 HTTP 方法不在他的权限之内
410 Gone:所请求的资源已从这个地址转移,不再可用
415 Unsupported Media Type:客户端要求的返回格式不支持。比如,API 只能返回 JSON 格式,但是客户端要求返回 XML 格式
422 Unprocessable Entity :客户端上传的附件无法处理,导致请求失败
429 Too Many Requests:客户端的请求次数超过限额
500 Internal Server Error:服务器内部错误
503 Service Unavailable:服务不可用

数据库怎么设计?

数据库使用原则
  • 尽可能避免分布式事务, 主要是分布式事务代价很高, 能避免就避免吧
  • 不要在数据库事务中做比较耗时的操作,比如不要在事务中做 RPC 服务
db.Transaction(func(tx *gorm.DB) error {
   tx.Create(xxxxx)
   tx.Update(xxxxx)
   rpc.Service1()    //!!!!call rpc in a transaction
   return nil
})
  • 一般不要使用 select * 避免 select 出不需要的字段, 提高性能。如果数据表中有大字段, 查询出来却不使用,会给服务器带来内存的压力,也会给应用服务带来 GC 压力。
  • 数据库查询,需要返回列表的, SQL 语句中必须有 LIMIT, 因为无法预计线上列表是否会有大列表。
  • 拒绝未使用索引的慢查询,必须要对代码中的 SQL 进行审核,最好养成看执行计划, explain 的习惯。
  • 对业务一致性比较敏感的业务,不要读从库, 主从有延迟,但是要评估对主库的读写压力。
数据表设计原则
  • 尽量不使用自增字段做主键,可以新搞一个主键,否则分库分表情况下会带来一些影响。
  • 对于状态字段,可以采用数字类型,不要使用字符串或者 char 类型。
数据库变更原则:
  • 数据库表也要做兼容, 不要删除字段
  • 新增字段, 要允许为 null , 或者 NOT NULL 但有默认值,需要兼容次存量数据
  • 一般不允许新增唯一索引, 因为有可能会违反唯一约束。
  • 设计复合索引时,区分度最大的索引字段必须放到前面

欢迎关注:程序员财富自由之路

参考资料