使用gRPC實(shí)現(xiàn)獲取數(shù)據(jù)庫版本
這里我們演示一個通過 gRPC 獲取數(shù)據(jù)庫版本的案例。
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、新建數(shù)據(jù)庫連接
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實(shí)現(xiàn)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端實(shí)現(xiàn)
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、客戶端實(shí)現(xiàn)
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、項目的結(jié)構(gòu)
$ 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實(shí)現(xiàn)獲取數(shù)據(jù)庫版本的詳細(xì)內(nèi)容,更多關(guān)于gRPC獲取數(shù)據(jù)庫版本的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談用Go構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法
這篇文章主要介紹了用Go構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
一文詳解go中如何實(shí)現(xiàn)定時任務(wù)
定時任務(wù)是指按照預(yù)定的時間間隔或特定時間點(diǎn)自動執(zhí)行的計劃任務(wù)或操作,這篇文章主要為大家詳細(xì)介紹了go中是如何實(shí)現(xiàn)定時任務(wù)的,感興趣的可以了解下2023-11-11
Golang?channel關(guān)閉后是否可以讀取剩余的數(shù)據(jù)詳解
這篇文章主要介紹了Golang?channel關(guān)閉后是否可以讀取剩余的數(shù)據(jù),文章通過一個測試?yán)咏o大家詳細(xì)的介紹了是否可以讀取剩余的數(shù)據(jù),需要的朋友可以參考下2023-09-09

