connectrpc/connect-go
GitHub: connectrpc/connect-go
Connect 的 Go 实现,提供基于 Protobuf 的轻量级 RPC 框架,同时兼容 gRPC、gRPC-Web 和 Connect 协议。
Stars: 3996 | Forks: 148
# 连接
[](https://github.com/connectrpc/connect-go/actions/workflows/ci.yaml)
[](https://goreportcard.com/report/connectrpc.com/connect)
[](https://pkg.go.dev/connectrpc.com/connect)
[][slack]
[](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框架, 内核驱动, 安全编程, 日志审计, 网络协议