golang实现gRPC日志监控认证追踪的中间件插件库rk-grpc的使用

以下是关于如何使用rk-grpc库实现gRPC日志监控认证追踪的中间件插件的完整示例和说明:

rk-grpc简介

rk-grpc是一个Golang库,可以从YAML文件注入gRPC和grpc-gateway的中间件和服务器配置。它属于rk-boot家族,建议与rk-boot一起使用。

架构图

gRPC架构图

快速入门示例

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 Swagger UI

3. 文档UI

默认访问地址:http://localhost:8080/docs 文档UI

4. Prometheus指标

默认访问地址:http://localhost:8080/metrics Prometheus

支持的中间件

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

1 回复

更多关于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"),
)

最佳实践

  1. 生产环境配置:在生产环境中,应该通过配置文件管理敏感信息
  2. 中间件顺序:注意中间件的执行顺序,通常为:追踪 → 认证 → 日志 → 业务逻辑
  3. 性能考虑:在高并发场景下,可以禁用部分非关键中间件
  4. 错误处理:合理处理中间件返回的错误,避免泄露敏感信息

rk-grpc通过简单的配置就能为gRPC服务添加企业级功能,大大简化了微服务开发中的基础设施搭建工作。

回到顶部