4、网络基础与集成:TCP/IP、HTTP/HTTPS、RESTful API设计原则、gRPC入门

做系统集成,网络是绕不开的坎。我见过太多项目,业务逻辑写得漂漂亮亮,一上线就卡在网络通信上。说白了,网络基础不牢,集成就是空中楼阁。

这一章,我们聊聊四个核心话题:TCP/IP协议栈、HTTP/HTTPS、RESTful API设计,以及gRPC入门。嗯,都是实战中天天要用的东西。

4.1 TCP/IP协议栈:集成的地基

TCP/IP不是单个协议,而是一组协议的集合。我习惯把它看成四层模型:应用层、传输层、网络层、网络接口层。

你想想看,两个系统要通信,数据是怎么从A跑到B的?

  • 应用层:HTTP、FTP、SSH这些,负责“说什么”
  • 传输层:TCP、UDP,负责“怎么传”
  • 网络层:IP协议,负责“往哪传”
  • 网络接口层:以太网、Wi-Fi,负责“物理上怎么走”

我在项目中遇到过一个问题:两个服务之间偶尔丢包,查了半天发现是MTU设置不一致。嗯,这就是网络接口层的问题,但表现却在应用层——数据莫名其妙就断了。

核心要点:TCP提供可靠连接,有三次握手、四次挥手、重传机制。UDP只管发,不保证到。集成场景下,90%用TCP,实时音视频才考虑UDP。

避坑指南:我曾经在配置防火墙时忘了放开TCP的端口,结果服务一直连不上。排查了整整两个小时,最后发现是安全组规则没配。记住:网络不通,先查防火墙。

4.2 HTTP/HTTPS:集成的主力军

HTTP是应用层最常用的协议。说白了,就是客户端发请求,服务端给响应。简单,但够用。

HTTPS就是在HTTP外面套了一层TLS/SSL加密。为什么要加密?你想想看,如果明文传输,中间人随便抓包就能看到你的密码、Token、业务数据——这谁受得了?

我建议,所有生产环境的集成,一律用HTTPS。别图省事用HTTP,出事就是大事。

HTTP的核心方法就几个:

方法 用途 是否幂等
GET 获取资源
POST 创建资源
PUT 更新资源(全量)
PATCH 更新资源(部分)
DELETE 删除资源

状态码也要记牢:2xx成功,3xx重定向,4xx客户端错误,5xx服务端错误。我见过有人把500当业务错误码用,这是大忌。

注意:HTTP是无状态的。每次请求都是独立的,服务端不记得你是谁。所以需要Token、Session、Cookie这些机制来维持状态。集成时,Token是最常用的方式。

4.3 RESTful API设计原则

RESTful API,说白了就是一套设计规范。让API看起来像在操作资源,而不是在调用函数。

我个人习惯遵循这几个原则:

  • 资源路径用名词/users/orders,不要用动词
  • 用HTTP方法表达动作:GET查、POST增、PUT改、DELETE删
  • 版本号放路径里/v1/users,方便迭代
  • 返回统一格式:成功失败都有固定结构
  • 使用合适的HTTP状态码:别所有情况都返回200

举个例子,一个用户资源的API设计:

GET    /v1/users          # 获取用户列表
GET    /v1/users/{id}     # 获取单个用户
POST   /v1/users          # 创建用户
PUT    /v1/users/{id}     # 全量更新用户
PATCH  /v1/users/{id}     # 部分更新用户
DELETE /v1/users/{id}     # 删除用户

返回格式我建议这样:

// 成功响应
{
  "code": 0,
  "message": "success",
  "data": { ... }
}

// 失败响应
{
  "code": 1001,
  "message": "用户不存在",
  "data": null
}

避坑指南:我曾经设计API时,把删除接口做成了POST请求,结果前端同事疯狂吐槽。记住:RESTful的核心就是用HTTP方法表达语义,别自己发明轮子。

4.4 gRPC入门:高性能的替代方案

RESTful API虽然好用,但有些场景性能不够。比如微服务之间的高频调用、流式数据传输。这时候,gRPC就派上用场了。

gRPC基于HTTP/2,使用Protocol Buffers(protobuf)作为序列化协议。说白了,就是比JSON更小、更快、更严格。

一个简单的gRPC服务定义:

syntax = "proto3";

service UserService {
  rpc GetUser (GetUserRequest) returns (User);
  rpc ListUsers (ListUsersRequest) returns (stream User);
}

message GetUserRequest {
  int32 user_id = 1;
}

message User {
  int32 user_id = 1;
  string name = 2;
  string email = 3;
}

gRPC支持四种通信模式:

  • 一元RPC:客户端发一个请求,服务端回一个响应。和REST差不多。
  • 服务端流式RPC:客户端发一个请求,服务端持续返回数据流。适合大文件下载。
  • 客户端流式RPC:客户端持续发送数据,服务端最后返回一个响应。适合批量上传。
  • 双向流式RPC:双方同时发送和接收数据。适合实时聊天。

我建议,内部服务之间的集成,优先考虑gRPC。对外暴露的API,还是用RESTful更通用。

核心对比:gRPC比RESTful快3-5倍,但调试起来麻烦。RESTful用curl就能测,gRPC需要专门的工具(如grpcurl)。选哪个,看场景。

注意:gRPC的负载均衡和健康检查需要额外配置。我曾经在生产环境忘了配健康检查,结果某个节点挂了,流量还在往那发——惨痛的教训。

知识体系总览

下面这张图,把本章的核心内容串起来了。你可以看到,从底层协议到上层API,层层递进。

网络基础与集成知识体系 TCP/IP协议栈 应用层 → 传输层(TCP/UDP) → 网络层(IP) → 网络接口层 HTTP/HTTPS 方法(GET/POST/PUT/DELETE) | 状态码(2xx/4xx/5xx) | HTTPS加密 RESTful API设计 资源路径 | 统一格式 | 版本管理 gRPC入门 Protobuf | HTTP/2 | 四种通信模式 集成实践 内部服务用gRPC | 对外API用RESTful | 安全用HTTPS

嗯,网络基础这块,说难不难,说简单也不简单。关键是理解每一层在做什么,以及它们之间怎么配合。TCP/IP保证数据能到,HTTP/HTTPS规定数据怎么包装,RESTful和gRPC则是两种不同的集成风格。

我个人建议,先把TCP/IP和HTTP吃透,再学RESTful和gRPC。基础不牢,后面全是坑。