connectrpc/connect-go

GitHub: connectrpc/connect-go

Connect 的 Go 实现,提供基于 Protobuf 的轻量级 RPC 框架,同时兼容 gRPC、gRPC-Web 和 Connect 协议。

Stars: 3996 | Forks: 148

# 连接 [![构建](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/connectrpc/connect-go/actions/workflows/ci.yaml) [![报告卡](https://goreportcard.com/badge/connectrpc.com/connect)](https://goreportcard.com/report/connectrpc.com/connect) [![GoDoc](https://pkg.go.dev/badge/connectrpc.com/connect.svg)](https://pkg.go.dev/connectrpc.com/connect) [![Slack](https://img.shields.io/badge/slack-buf-%23e01563)][slack] [![OpenSSF 最佳实践](https://www.bestpractices.dev/projects/8972/badge)](https://www.bestpractices.dev/projects/8972) Connect 是一个轻量级的库,用于构建浏览器和 gRPC 兼容的 HTTP API。 你只需编写一个简短的 [Protocol Buffer][protobuf] schema 并实现你的应用逻辑,Connect 就会生成代码来处理 marshaling、路由、压缩和内容类型协商。它还会生成一个符合语言习惯且类型安全的客户端。Handler 和客户端支持三种协议:gRPC、gRPC-Web 和 Connect 自有的协议。 [Connect 协议][protocol] 是一个简单的协议,适用于 HTTP/1.1 或 HTTP/2。它汲取了 gRPC 和 gRPC-Web 的精华部分,包括流式传输,并将它们打包成一个在浏览器、单体应用和微服务中都能同样出色运行的协议。调用 Connect API 就像使用 `curl` 一样简单。试试我们的实时演示: ``` curl \ --header "Content-Type: application/json" \ --data '{"sentence": "I feel happy."}' \ https://demo.connectrpc.com/connectrpc.eliza.v1.ElizaService/Say ``` Handler 和客户端还支持 gRPC 和 gRPC-Web 协议,包括流式传输、header、trailer 和错误详情。兼容 gRPC 的 [server reflection][grpcreflect] 和 [健康检查][grpchealth] 作为独立的 package 提供。除了 cURL,我们还可以使用 gRPC 客户端来调用我们的 API: ``` go install github.com/bufbuild/buf/cmd/buf@latest buf curl --protocol grpc \ --data '{"sentence": "I feel happy."}' \ https://demo.connectrpc.com/connectrpc.eliza.v1.ElizaService/Say ``` 在底层,Connect 只使用了 [Protocol Buffers][protobuf] 和标准库:没有自定义的 HTTP 实现,没有新的名称解析或负载均衡 API,也没有任何意外。你已经了解的关于 `net/http` 的一切知识仍然适用,任何适用于 `http.Server`、`http.Client` 或 `http.Handler` 的 package 都可以与 Connect 配合使用。 有关 Connect 的更多信息,请参阅[发布公告博客][blog]、[connectrpc.com][docs] 上的文档(特别是面向 Go 的 [入门指南])、[演示服务][examples-go] 或 [协议规范][protocol]。 ## 一个小示例 想知道这些在实践中是什么样子的吗?我们从一个 [Protobuf schema](internal/proto/connect/ping/v1/ping.proto) 生成了[一个小型 RPC package](internal/gen/simple/connect/ping/v1/pingv1connect/ping.connect.go)。使用该 package,我们可以构建一个服务端。此示例可在 [internal/example](internal/example) 中找到: ``` package main import ( "context" "log" "net/http" "connectrpc.com/connect" pingv1 "connectrpc.com/connect/internal/gen/connect/ping/v1" "connectrpc.com/connect/internal/gen/simple/connect/ping/v1/pingv1connect" "connectrpc.com/validate" ) type PingServer struct { pingv1connect.UnimplementedPingServiceHandler // returns errors from all methods } func (ps *PingServer) Ping(ctx context.Context, req *pingv1.PingRequest) (*pingv1.PingResponse, error) { return &pingv1.PingResponse{ Number: req.Number, }, nil } func main() { mux := http.NewServeMux() // The generated constructors return a path and a plain net/http // handler. mux.Handle( pingv1connect.NewPingServiceHandler( &PingServer{}, // Validation via Protovalidate is almost always recommended connect.WithInterceptors(validate.NewInterceptor()), ), ) p := new(http.Protocols) p.SetHTTP1(true) // For gRPC clients, it's convenient to support HTTP/2 without TLS. p.SetUnencryptedHTTP2(true) s := &http.Server{ Addr: "localhost:8080", Handler: mux, Protocols: p, } if err := s.ListenAndServe(); err != nil { log.Fatalf("listen failed: %v", err) } } ``` 在该服务端运行的情况下,你可以使用任何 gRPC 或 Connect 客户端发起请求。要使用 Connect 编写客户端: ``` package main import ( "context" "log" "net/http" pingv1 "connectrpc.com/connect/internal/gen/connect/ping/v1" "connectrpc.com/connect/internal/gen/simple/connect/ping/v1/pingv1connect" ) func main() { client := pingv1connect.NewPingServiceClient( http.DefaultClient, "http://localhost:8080/", ) req := &pingv1.PingRequest{Number: 42} res, err := client.Ping(context.Background(), req) if err != nil { log.Fatalln(err) } log.Println(res) } ``` 当然,`http.ListenAndServe` 和 `http.DefaultClient` 并不适合在生产环境中使用!请参阅 Connect 的[部署文档][docs-deployment],了解有关配置超时、连接池、可观测性和 h2c 的指南。 ## 生态系统 * [grpchealth]:用于 connect-go 的兼容 gRPC 的健康检查 * [grpcreflect]:用于 connect-go 的兼容 gRPC 的 server reflection * [validate]:用于 connect-go 的 [Protovalidate][protovalidate] interceptor * [examples-go]:支持 [demo.connectrpc.com](https://demo.connectrpc.com) 的服务,包括双向流式传输 * [connect-es]:使用 Protobuf 和 TypeScript 的类型安全 API * [Buf Studio]:用于临时 RPC 的 Web UI * [conformance]:Connect、gRPC 和 gRPC-Web 的互操作性测试 ## 状态:稳定 此模块是稳定的。它支持: * Go 的两个最新的主要版本(即继续[接收安全补丁][go-support-policy]的 Go 版本)。 * Go 中 Protocol Buffers 的 [APIv2] (`google.golang.org/protobuf`)。 在这些参数范围内,`connect` 遵循语义化版本控制。我们_不会_在 1.x 系列版本中做出破坏性变更。 ## 法律 基于 [Apache 2 许可证][license] 提供。
标签:API, EVTX分析, Golang, gRPC, Protobuf, RPC框架, 内核驱动, 安全编程, 日志审计, 网络协议