Go gRPC 拦截器项目教程
1. 项目的目录结构及介绍
go-grpc-interceptor/
├── README.md
├── go.mod
├── go.sum
├── interceptor/
│ ├── auth.go
│ ├── logging.go
│ ├── recovery.go
│ └── validator.go
├── server/
│ ├── main.go
│ └── server.go
└── client/
├── main.go
└── client.go
- README.md: 项目说明文件,包含项目的基本信息和使用指南。
- go.mod 和 go.sum: Go 模块文件,用于管理项目的依赖。
- interceptor/: 包含各种拦截器的实现,如认证、日志、恢复和验证拦截器。
- server/: 包含服务器端的代码,包括启动文件和服务器逻辑。
- client/: 包含客户端的代码,包括启动文件和客户端逻辑。
2. 项目的启动文件介绍
服务器端启动文件 (server/main.go
)
package main
import (
"log"
"net"
"google.golang.org/grpc"
"github.com/mercari/go-grpc-interceptor/server"
)
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer(
grpc.UnaryInterceptor(server.UnaryInterceptorChain),
grpc.StreamInterceptor(server.StreamInterceptorChain),
)
// 注册服务
// ...
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
客户端启动文件 (client/main.go
)
package main
import (
"log"
"google.golang.org/grpc"
"github.com/mercari/go-grpc-interceptor/client"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithUnaryInterceptor(client.UnaryInterceptor), grpc.WithStreamInterceptor(client.StreamInterceptor))
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
// 创建客户端
// ...
}
3. 项目的配置文件介绍
项目中没有显式的配置文件,但可以通过环境变量或命令行参数进行配置。例如,服务器端监听的端口可以通过以下方式配置:
port := os.Getenv("SERVER_PORT")
if port == "" {
port = "50051"
}
lis, err := net.Listen("tcp", ":"+port)
客户端连接的服务器地址也可以通过环境变量配置:
serverAddress := os.Getenv("SERVER_ADDRESS")
if serverAddress == "" {
serverAddress = "localhost:50051"
}
conn, err := grpc.Dial(serverAddress, grpc.WithInsecure(), grpc.WithUnaryInterceptor(client.UnaryInterceptor), grpc.WithStreamInterceptor(client.StreamInterceptor))
通过这种方式,可以灵活地配置项目的行为,而无需修改代码。