使用gRPC实现获取数据库版本
这里我们演示一个通过 gRPC 获取数据库版本的案例。
1、新建proto
syntax = "proto3"; package pb; import "google/protobuf/empty.proto"; service DataBase { rpc GetDataBaseVersion(google.protobuf.Empty) returns(VersionResponse) {} } message VersionResponse { string version = 1; }
编译:
$ protoc --gogo_out=plugins=grpc:./ database.proto
2、新建数据库连接
package model import ( "gorm.io/driver/mysql" "gorm.io/gorm" "log" ) type TpOrm struct { *gorm.DB } var TpDB TpOrm func InitTpOrm() { dsn := "root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Println(err) return } TpDB = TpOrm{db} }
3、gRPC实现GetDataBaseVersion方法
package impl import ( "context" "github.com/golang/protobuf/ptypes/empty" "proj/model" pb "proj/proto" ) type DataBaseServerImpl struct { } func (dataBaseServerImpl *DataBaseServerImpl) GetDataBaseVersion(ctx context.Context, req *empty.Empty) (rep *pb.VersionResponse, err error) { var version string rep = &pb.VersionResponse{} rows, err := model.TpDB.Raw("select version() as version").Rows() if err != nil { rep.Version = "" } defer rows.Close() for rows.Next() { err := rows.Scan(&version) if err != nil { rep.Version = "" }else{ rep.Version = version } } return }
4、Server端实现
package main import ( "google.golang.org/grpc" "log" "net" impl "proj/grpc" "proj/model" pb "proj/proto" ) func main() { model.InitTpOrm() gRpcListen, err := net.Listen("tcp", ":23352") if err != nil { log.Printf("failed grpc listen: %v", err) } gRpcServer := grpc.NewServer() pb.RegisterDataBaseServer(gRpcServer, &impl.DataBaseServerImpl{}) err = gRpcServer.Serve(gRpcListen) if err != nil { log.Println("GrpcServer fail start :%v", err.Error()) } else { log.Println("GrpcServer success start %s", ":8090") } }
启动:
$ go run server/server.go
5、客户端实现
package main import ( "context" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/emptypb" "log" pb "proj/proto" ) func main() { ctx := context.Background() conn, err := grpc.DialContext(ctx, "127.0.0.1:23352", grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Println(err) } client := pb.NewDataBaseClient(conn) in := new(emptypb.Empty) rep, err := client.GetDataBaseVersion(ctx, in) if err != nil { log.Println(err) } else { log.Println(rep.Version) } }
启动:
$ go run client/client.go
2023/06/28 17:30:37 5.5.28
6、项目的结构
$ tree go-grpc/
go-grpc/
├── client
│ └── client.go
├── go.mod
├── go.sum
├── grpc
│ └── impl.go
├── model
│ └── init.go
├── proto
│ ├── database.pb.go
│ └── database.proto
├── readme.md
├── server
│ └── server.go
└── test
└── main.go
6 directories, 10 files
以上就是使用gRPC实现获取数据库版本的详细内容,更多关于gRPC获取数据库版本的资料请关注脚本之家其它相关文章!
相关文章
Go语言中函数可变参数(Variadic Parameter)详解
在Python中,在函数参数不确定数量的情况下,可以动态在函数内获取参数。在Go语言中,也有类似的实现方式,本文就来为大家详细讲解一下2022-07-07node-exporter被检测出来pprof调试信息泄露漏洞问题
这篇文章主要介绍了node-exporter被检测出来pprof调试信息泄露漏洞问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-04-04
最新评论