HTTP 状态码这东西, 其实就是服务器用来给客户端发来的请求做出表态的一个标识编号。它这个东西, 能够直接决定你调用的那个接口到底是成功了的还是没成功的, 还有你说的那个网页, 到底能不能够正常地加载出来。
那么当我们开始排查在线上出现故障的那些问题的时候, 你得在最快的那一秒时间里就读懂这些 HTTP 状态码到底是个什么意思。你要知道, 这是一个帮你去定位具体是什么问题的关键性的第一个起点。
接下来给你呈现的这个对照表, 是把它覆盖到的范围说清楚了, 覆盖了那些由 RFC 9110 这个标准文件定义的所有五类状态码。这个表你可以直接拿着用在你日常的代码开发还有运维方面的故障排除过程里, 都是非常方便的。
一、状态码五大分类
二、高频状态码速查
2xx 成功类
200OK: 这表明请求已经成功完成了, 响应体部分包含了对应的结果数据。
201 Created:资源已创建HTTP状态码查询工具,常见于POST提交。
204NoContent这个结果表示, 那个请求是处理成功了, 只是不会返回任何具体的内容给你。
3xx 重定向类
它被标作301MovedPermanently, 这个状态代码的意思就是资源已经永久地迁移到了新的位置, 并且搜索引擎会去更新他们的索引信息。
这个302Found状态代码代表的是一个临时跳转的情况, 意思就是在未来的某个时候, 访问者应该再次回去请求原先的那个地址。
这个状态码的意思是, 它通常会和ETag或者是Last Modified这两个东西配合着使用, 然后客户端那边就会直接使用自己本地的缓存。
4xx 客户端错误
出现了400BadRequest这种情况, 通常是因为请求参数的格式搞错了, 或者是少了那些必填的字段内容。
出现了401Unauthorized这个情况, 意思是当前没有携带有效的身份凭证, 或者是因为Token缺失, 又或者Token已经过期了。
403Forbidden, 这个状态码的意思是, 你的身份已经被核实了, 但是你没有权利去访问这个资源。
404NotFound: 这个请求里的路径, 在服务器的那边, 是不存在的。
405MethodNotAllowed这个错误意思就是, 如果你用get请求去访问一个只同意post请求的接口, 那么就会发生这种情况。
发生了409 Conflict, 这种状况叫作资源状态冲突。举个例子, 就是你进行了重复提交操作。
422UnprocessableEntity: 这是一种语义方面的错误情况。虽然所提交的请求在语法格式上并没有什么问题, 是合法有效的。但是在具体的逻辑处理层面上却出现了不符合规定的地方, 就是说整体的逻辑结构是不正确的。
出现了429TooManyRequests这个情况, 意思是触发了限流的机制, 所以是需要去等待然后重试的。
5xx 服务端错误
出现500InternalServerError。这是因为服务端没有捕获到具体的异常信息。大家需要去查看服务端的日志记录, 以便进行排查。
502BadGateway 这个情况的意思是, 前端的网络请求已经发出去了, 但是后面的那个服务要么是根本连不上去, 要么就是返回来一些乱七八糟的、不符合规矩的回答数据。
这意思是服务变得不可用, 错误代码是五百零三, 这种情况通常是因为系统负载太重或者正在做维护操作, 一般情况下面前都会带着重试之后这个头部信息。
504GatewayTimeout这个错误的意思是上游服务的响应时间太长了, 发生了超时情况, 因此需要去检查一下相关的依赖链路。
三、快速查询与排查方法
在日常开发的过程当中, 大家普遍被推荐去把这个上面讲到的那个对照表给收藏起来, 好让它变成自己平时经常用的一个参考资料。
如果说你碰到需要批量地去查询内容, 或者是想要按照某个编码去反过来查出它对应的定义的话, 你就可以去点击访问由 gz88.cn 这个平台专门提供出来的那个关于 HTTP 状态码的在线查询工具。
当你进到那个工具界面以后, 只要你输入进去任意一个四位数的编码, 系统那边马上就会给你返回出来关于这个具体状态码的所有完整定义, 还有它适合用在哪种场合以及它标准的 RFC 出处在哪里等等这些信息, 这个工具同时还支持去按照类别来进行筛选的操作, 这样做的目的就是为了让大家在需要进行 Code Review 这种代码审查或者是做故障复盘总结的时候, 能够更加方便并且快速地引用这些相关的内容。
在进行对线上异常的排查工作的时候, 建议按照如下的这样一个路径去进行操作。
1. 先判类别: 对于4xx问题, 应该优先检查客户端请求参数、鉴权Token以及请求方法;对于5xx问题, 应该优先查看服务端日志与依赖服务健康状态。
2. 大家去看那个响应头, 要特别注意里面的Location, 这个是用来说明重定向的目标在哪里的, 还要看Retry-After, 这个是告诉我们要等多久才能进行限流重试的, 另外还得看WWW-Authenticate, 这个是说明鉴权挑战的方式是什么。
3. 用curl或者Postman来单独把这个请求再出现一边, 去对比一下正常的请求和那个有问题的请求之间在参数上面有什么不同的地方, 好把需要考虑变化的范围缩小。
四、易混淆状态码辨析
当访问资源时, 会涉及到401状态码和403状态码的区别。这里的401表示“你是谁? 请证明”, 意味着身份没有得到验证。而403则表示“你身份没问题, 但不让你进”, 说明权限不足。
301vs302: 301是永久搬迁。客户端或者浏览器的地址会被永久更新。302是临时出门。下次访问的时候仍然要找原来的地址。
502vs504: 当上游服务器直接拒绝了连接, 或者返回了不属于HTTP协议的内容时, 这种情况被称为502错误。另一种情况是, 虽然上游服务器成功建立了连接, 但是迟迟没有给出后续的响应数据, 这种情况则被定义为504错误。
大家要把上面说的对照关系还有排查逻辑给弄明白, 这样的话, 在绝大多数接口出现异常状况的时候, 都能在两分钟之内就把根因的方向给定位到, 就不需要再去反复地翻看文档了。


