• gRPC之内置Trace


    1、内置Trace

    grpc内置了客户端和服务端的请求追踪,基于golang.org/x/net/trace包实现,默认是开启状态,可以查看事

    件和请求日志,对于基本的请求状态查看调试也是很有帮助的,客户端与服务端基本一致,这里以服务端开启

    trace server为例。

    1.1 编写hello.proto

    // 指定proto版本
    // 表明使用proto3语法,如果你没有指定这个,编译器会使用proto2语法
    syntax = "proto3"; 
    // 指定默认包名
    package hello;     
    // 指定golang包名
    option go_package = "./hello";
    // 定义Hello服务
    service Hello {
        // 定义SayHello方法
        rpc SayHello(HelloRequest) returns (HelloResponse) {}
    }
    // HelloRequest 请求结构
    message HelloRequest {
        string name = 1;
    }
    // HelloResponse 响应结构
    message HelloResponse {
        string message = 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.2 编译生成pb.go文件

    # 编译hello.proto
    $ protoc -I . --go_out=plugins=grpc:. ./hello.proto
    
    • 1
    • 2

    1.3 服务端

    package main
    
    import (
    	"fmt"
    	// 引入编译生成的包
    	pb "demo/hello"
    	"golang.org/x/net/context"
    	"golang.org/x/net/trace"
    	"google.golang.org/grpc"
    	"log"
    	"net"
    	"net/http"
    )
    
    const (
    	// Address gRPC服务地址
    	Address = "127.0.0.1:50052"
    )
    
    // 定义helloService并实现约定的接口
    type helloService struct{}
    
    // HelloService Hello服务
    var HelloService = helloService{}
    
    // SayHello 实现Hello服务接口
    func (h helloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
    	resp := new(pb.HelloResponse)
    	resp.Message = fmt.Sprintf("Hello %s.", in.Name)
    	return resp, nil
    }
    
    func init() {
        grpc.EnableTracing = true
    }
    
    func main() {
    	listen, err := net.Listen("tcp", Address)
    	if err != nil {
    		log.Fatalf("failed to listen: %v", err)
    	}
    	// 实例化grpc Server
    	s := grpc.NewServer()
    	// 注册HelloService
    	pb.RegisterHelloServer(s, HelloService)
    	// 开启trace
    	go startTrace()
    	log.Println("Listen on " + Address)
    	s.Serve(listen)
    }
    
    func startTrace() {
    	trace.AuthRequest = func(req *http.Request) (any, sensitive bool) {
    		return true, true
    	}
    	go http.ListenAndServe(":50051", nil)
    	log.Println("Trace listen on 50051")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    [root@zsx demo]# go run server.go
    2023/02/12 20:46:43 Listen on 127.0.0.1:50052
    2023/02/12 20:46:43 Trace listen on 50051
    
    • 1
    • 2
    • 3

    1.4 客户端

    package main
    
    import (
    	pb "demo/hello" // 引入proto包
    	"golang.org/x/net/context"
    	"google.golang.org/grpc"
    	"log"
    )
    
    const (
    	// Address gRPC服务地址
    	Address = ":50052"
    )
    
    func main() {
    	// 连接
    	conn, err := grpc.Dial(Address, grpc.WithInsecure(), grpc.WithBlock())
    	if err != nil {
    		log.Fatalln(err)
    	}
    	defer conn.Close()
    	// 初始化客户端
    	c := pb.NewHelloClient(conn)
    	// 调用方法
    	req := &pb.HelloRequest{Name: "gRPC"}
    	res, err := c.SayHello(context.Background(), req)
    	if err != nil {
    		log.Fatalln(err)
    	}
    	log.Println(res.Message)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    # 需要执行客户端请求
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:05 Hello gRPC.
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:16 Hello gRPC.
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:17 Hello gRPC.
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:18 Hello gRPC.
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:20 Hello gRPC.
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:21 Hello gRPC.
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:22 Hello gRPC.
    [root@zsx demo]# go run client.go
    2023/02/12 20:47:23 Hello gRPC.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1.5 服务端事件查看

    访问:localhost:50051/debug/events

    可以看到服务端注册的服务和服务正常启动的事件信息:

    在这里插入图片描述

    1.6 请求日志信息查看

    访问:localhost:50051/debug/requests

    这里可以显示最近的请求状态,包括请求的服务、参数、耗时、响应,对于简单的状态查看还是很方便的,默认值

    显示最近10条记录:

    在这里插入图片描述

    # 项目结构
    [root@zsx protoc]# tree demo/
    demo/
    ├── client.go
    ├── go.mod
    ├── go.sum
    ├── hello
    │   └── hello.pb.go
    ├── hello.proto
    └── server.go
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    【微信小程序】swiper和swiper-item组件的基本使用
    8.8 opencv
    ps2021神经ai滤镜无法使用,ps2021没法用神经元滤镜
    Spark 中 Aggregate 的实现
    【JavaScript进阶之旅 ES6篇 第九章】对象密封的四种方式、is()、assign()、取值函数的拷贝
    在Docker跑通Flink分布式版本的WordCount
    MySQL增删改查【进阶篇】万字图文超详细讲解
    文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题
    Django学习笔记
    解码器 | 基于 Transformers 的编码器-解码器模型
  • 原文地址:https://blog.csdn.net/qq_30614345/article/details/134022441