6050d11f27
- 创建基于 CloudWego Hertz 的 Go 微服务脚手架 - 集成 Nacos 服务注册/发现功能 - 添加 gRPC 客户端支持 - 实现环境变量配置管理 (.env.example) - 添加 HTTP 中间件 (Recovery, AccessLog, CORS) - 配置 Gitea CI/CD 构建部署流程 BREAKING CHANGE: 项目结构调整,从简单的 API 服务升级为完整的微服务架构
89 lines
1.9 KiB
Go
89 lines
1.9 KiB
Go
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
|
|
}
|
|
}
|