golang实现gRPC日志监控认证追踪的中间件插件库rk-grpc的使用
以下是关于如何使用rk-grpc库实现gRPC日志监控认证追踪的中间件插件的完整示例和说明:
rk-grpc简介
rk-grpc是一个Golang库,可以从YAML文件注入gRPC和grpc-gateway的中间件和服务器配置。它属于rk-boot家族,建议与rk-boot一起使用。
架构图
快速入门示例
1. 安装
go get github.com/rookie-ninja/rk-grpc/v2
2. 准备.proto文件
syntax = "proto3";
package api.v1;
option go_package = "api/v1/greeter";
service Greeter {
rpc Greeter (GreeterRequest) returns (GreeterResponse) {}
}
message GreeterRequest {
bytes msg = 1;
}
message GreeterResponse {}
3. 创建boot.yaml配置文件
grpc:
- name: greeter # 必填
port: 8080 # 必填
enabled: true # 必填
enableReflection: true # 可选,默认: false
enableRkGwOption: true # 可选,默认: false
commonService:
enabled: true # 可选,默认: false
docs:
enabled: true # 可选,默认: false
sw:
enabled: true # 可选,默认: false
prom:
enabled: true # 可选,默认: false
middleware:
logging:
enabled: true # 可选,默认: false
prom:
enabled: true # 可选,默认: false
meta:
enabled: true # 可选,默认: false
4. 创建main.go
package main
import (
"context"
"embed"
_ "embed"
"github.com/rookie-ninja/rk-entry/v2/entry"
"github.com/rookie-ninja/rk-grpc/v2/boot"
proto "github.com/rookie-ninja/rk-grpc/v2/example/boot/simple/api/gen/v1"
"google.golang.org/grpc"
)
//go:embed boot.yaml
var boot []byte
//go:embed api/gen/v1
var docsFS embed.FS
//go:embed api/gen/v1
var staticFS embed.FS
func init() {
rkentry.GlobalAppCtx.AddEmbedFS(rkentry.DocsEntryType, "greeter", &docsFS)
rkentry.GlobalAppCtx.AddEmbedFS(rkentry.SWEntryType, "greeter", &docsFS)
rkentry.GlobalAppCtx.AddEmbedFS(rkentry.StaticFileHandlerEntryType, "greeter", &staticFS)
}
func main() {
// 从boot配置引导基本入口
rkentry.BootstrapPreloadEntryYAML(boot)
// 从boot配置引导grpc入口
res := rkgrpc.RegisterGrpcEntryYAML(boot)
// 获取GrpcEntry
grpcEntry := res["greeter"].(*rkgrpc.GrpcEntry)
// 注册gRPC服务器
grpcEntry.AddRegFuncGrpc(func(server *grpc.Server) {
proto.RegisterGreeterServer(server, &GreeterServer{})
})
// 注册grpc-gateway函数
grpcEntry.AddRegFuncGw(proto.RegisterGreeterHandlerFromEndpoint)
// 引导grpc入口
grpcEntry.Bootstrap(context.Background())
// 等待关机信号
rkentry.GlobalAppCtx.WaitForShutdownSig()
// 中断gin入口
grpcEntry.Interrupt(context.Background())
}
// GreeterServer实现GreeterServer接口
type GreeterServer struct{}
// Greeter处理Greeter方法
func (server *GreeterServer) Greeter(context.Context, *proto.GreeterRequest) (*proto.GreeterResponse, error) {
return &proto.GreeterResponse{}, nil
}
5. 启动服务器
go run main.go
验证功能
1. gRPC & grpc-gateway服务
# 访问通用服务
curl localhost:8080/rk/v1/ready
2. Swagger UI
默认访问地址:http://localhost:8080/sw
3. 文档UI
默认访问地址:http://localhost:8080/docs
4. Prometheus指标
默认访问地址:http://localhost:8080/metrics
支持的中间件
rk-grpc支持多种中间件,包括:
- 日志(Logging)
- 监控(Metrics)
- 追踪(Tracing)
- 认证(Auth)
- 限流(RateLimit)
- 超时(Timeout)
- CORS
- JWT
- 安全(Secure)
- CSRF等
所有中间件都可以通过YAML或代码配置,用户可以根据需要启用。
完整YAML配置选项
grpc:
- name: greeter # 必填
port: 8080 # 必填
enabled: true # 必填
# 其他可选配置...
middleware:
logging:
enabled: true
prom:
enabled: true
meta:
enabled: true
# 其他中间件配置...
这个示例展示了如何使用rk-grpc快速搭建一个具有日志、监控和认证追踪功能的gRPC服务。通过YAML配置可以轻松启用或禁用各种中间件功能。
更多关于golang实现gRPC日志监控认证追踪的中间件插件库rk-grpc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现gRPC日志监控认证追踪的中间件插件库rk-grpc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用rk-grpc实现gRPC日志、监控、认证和追踪中间件
rk-grpc是一个功能强大的Go语言gRPC中间件库,它提供了日志记录、监控、认证和分布式追踪等企业级功能。下面我将详细介绍如何使用rk-grpc来增强您的gRPC服务。
安装
首先安装rk-grpc库:
go get github.com/rookie-ninja/rk-grpc
基础使用
1. 创建带有rk-grpc中间件的gRPC服务
package main
import (
"context"
"github.com/rookie-ninja/rk-grpc/v2/boot"
"google.golang.org/grpc"
)
// 定义gRPC服务
type Greeter struct{}
func (s *Greeter) SayHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
return &HelloReply{Message: "Hello " + req.Name}, nil
}
func main() {
// 创建gRPC服务器并添加rk-grpc中间件
server := rkgrpc.GetGrpcServer(
rkgrpc.WithServerOptions(grpc.ConnectionTimeout(time.Second*5)),
rkgrpc.WithUnaryInterceptor(rkgrpc.UnaryServerInterceptor()),
rkgrpc.WithStreamInterceptor(rkgrpc.StreamServerInterceptor()),
)
// 注册服务
RegisterGreeterServer(server, &Greeter{})
// 启动服务器
boot.AddGrpcServer("greeter-server", server)
boot.Bootstrap()
// 等待中断信号
boot.WaitForShutdownSig()
}
核心功能
1. 日志记录
rk-grpc会自动记录请求和响应的日志:
// 配置日志
rkgrpc.WithLoggerEntry("greeter-logger", rkentry.LoggerEntryNoop)
2. 监控指标
自动收集和暴露Prometheus格式的监控指标:
// 启用Prometheus监控
rkgrpc.WithPromEntry("greeter-metrics")
3. 认证
支持多种认证方式,如Basic Auth、JWT等:
// 配置JWT认证
rkgrpc.WithJwtEntry("greeter-jwt", &rkauth.JwtEntry{
SigningKey: "my-secret-key",
TokenLookup: "header:Authorization",
AuthScheme: "Bearer",
})
4. 分布式追踪
集成OpenTelemetry实现分布式追踪:
// 配置Jaeger追踪
rkgrpc.WithZipkinEntry("greeter-trace", &rkentry.ZipkinEntry{
Endpoint: "http://localhost:9411/api/v2/spans",
})
完整示例
package main
import (
"context"
"github.com/rookie-ninja/rk-grpc/v2/boot"
"github.com/rookie-ninja/rk-grpc/v2/middleware"
"google.golang.org/grpc"
)
func main() {
// 1. 创建gRPC服务器
server := rkgrpc.GetGrpcServer(
rkgrpc.WithServerOptions(grpc.ConnectionTimeout(time.Second*5)),
// 添加日志中间件
rkgrpc.WithUnaryInterceptor(middleware.UnaryServerInterceptor(
middleware.WithLoggerEntry("greeter-logger"),
)),
// 添加监控中间件
rkgrpc.WithPromEntry("greeter-metrics"),
// 添加认证中间件
rkgrpc.WithJwtEntry("greeter-jwt", &rkauth.JwtEntry{
SigningKey: "my-secret-key",
}),
// 添加追踪中间件
rkgrpc.WithZipkinEntry("greeter-trace", &rkentry.ZipkinEntry{
Endpoint: "http://localhost:9411/api/v2/spans",
}),
)
// 2. 注册服务
RegisterGreeterServer(server, &Greeter{})
// 3. 启动服务器
boot.AddGrpcServer("greeter-server", server)
boot.Bootstrap()
// 4. 等待中断信号
boot.WaitForShutdownSig()
}
配置选项
rk-grpc支持通过YAML文件进行配置:
grpc:
- name: greeter-server # 服务名称
port: 8080 # 监听端口
enabled: true # 是否启用
interceptors:
loggingZap:
enabled: true # 启用日志
metricsProm:
enabled: true # 启用监控
auth:
enabled: true # 启用认证
basic: ["user:pass"] # Basic认证凭据
trace:
enabled: true # 启用追踪
exporter:
jaeger:
agent:
enabled: true
host: "localhost"
port: 6831
然后在代码中加载配置:
boot.Bootstrap(
boot.WithBootConfigPath("config.yaml"),
)
最佳实践
- 生产环境配置:在生产环境中,应该通过配置文件管理敏感信息
- 中间件顺序:注意中间件的执行顺序,通常为:追踪 → 认证 → 日志 → 业务逻辑
- 性能考虑:在高并发场景下,可以禁用部分非关键中间件
- 错误处理:合理处理中间件返回的错误,避免泄露敏感信息
rk-grpc通过简单的配置就能为gRPC服务添加企业级功能,大大简化了微服务开发中的基础设施搭建工作。