API的架构风格选择取决于可扩展性、速度、灵活性、兼容性和API消费者的特定需求。
// 协议描述 service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } // 实现 func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello " + req.Name}, nil }
可以用GraphQL替代所有REST或gRPC API吗?
不,GraphQL并不总是合理的——它使缓存、日志记录复杂化,增加了保护API的难度,并且对于简单任务,REST或gRPC更简单可靠。
REST能保证严格的类型吗?
只能部分保证。REST通过合同一致性(Swagger/OpenAPI)来定义,但本质上处理的是不严格的格式(JSON/HTTP),而gRPC通过Protobuf架构提供严格的静态类型。
在哪些情况下不建议将gRPC用于公共API?
gRPC与浏览器的兼容性较差,且与HTTP/1.1基础架构(例如,代理、防火墙)的集成较差。对于公共Web API,REST或GraphQL更好。