Go gRPC 拦截器项目教程

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))

通过这种方式,可以灵活地配置项目的行为,而无需修改代码。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值