package server_cli import ( "apiServer_service/proto" "apiServer_service/utils/logger" "apiServer_service/utils/nacos" "context" "errors" "os" "strconv" "sync" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" ) var ( grpcConn *grpc.ClientConn grpcClient proto.ServerVisitServiceClient connMu sync.Mutex ) func getApiServer() string { service, err := nacos.DiscoverService("apiServer") if err != nil { logger.Error("获取服务器地址失败", err) if service.Ip != "" { return service.Ip + ":" + strconv.Itoa(int(service.Port)) } return "" } return service.Ip + ":" + strconv.Itoa(int(service.Port)) } func getGrpcClient() (proto.ServerVisitServiceClient, error) { connMu.Lock() defer connMu.Unlock() if grpcClient != nil && grpcConn != nil { return grpcClient, nil } serverUri := getApiServer() if serverUri == "" { return nil, errors.New("无法获取 apiServer 地址") } conn, err := grpc.NewClient(serverUri, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { logger.Error("gRPC 连接失败", err) return nil, err } grpcConn = conn grpcClient = proto.NewServerVisitServiceClient(conn) return grpcClient, nil } func getContext() context.Context { token := os.Getenv("GRPC_TOKEN") md := metadata.Pairs("authorization", "Bearer "+token) return metadata.NewOutgoingContext(context.Background(), md) } func ReportVisit(token, note, visitIP, osName string, point, userID int) error { client, err := getGrpcClient() if err != nil { return err } record, err := client.AddServerVisitRecode(getContext(), &proto.ServerVisitRequest{}) if err != nil { logger.Error("ReportVisit error", err) return err } logger.Debug("ReportVisit", record) return nil } func CloseGrpcConn() { connMu.Lock() defer connMu.Unlock() if grpcConn != nil { grpcConn.Close() grpcConn = nil grpcClient = nil } }