亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用gRPC實現(xiàn)獲取數(shù)據(jù)庫版本

 更新時間:2023年12月26日 09:08:29   作者:242030  
這篇文章主要為大家詳細介紹了如何使用gRPC實現(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實現(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端實現(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、客戶端實現(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、項目的結構

$ 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實現(xiàn)獲取數(shù)據(jù)庫版本的詳細內(nèi)容,更多關于gRPC獲取數(shù)據(jù)庫版本的資料請關注腳本之家其它相關文章!

相關文章

  • 淺談用Go構建不可變的數(shù)據(jù)結構的方法

    淺談用Go構建不可變的數(shù)據(jù)結構的方法

    這篇文章主要介紹了用Go構建不可變的數(shù)據(jù)結構的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • golang實現(xiàn)可中斷的流式下載功能

    golang實現(xiàn)可中斷的流式下載功能

    這篇文章主要給大家介紹了golang實現(xiàn)可中斷的流式下載,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • golang panic及處理機制

    golang panic及處理機制

    Go語言追求簡潔優(yōu)雅,所以,Go語言不支持傳統(tǒng)的 try…catch…finally 這種異常,因為Go語言的設計者們認為,將異常與控制結構混在一起會很容易使得代碼變得混亂,今天給大家介紹golang panic及處理機制,需要的朋友參考下吧
    2021-08-08
  • Golang中time.After的使用理解與釋放問題

    Golang中time.After的使用理解與釋放問題

    這篇文章主要給大家介紹了關于Golang中time.After的使用理解與釋放問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • Go語言實現(xiàn)IP段范圍校驗示例

    Go語言實現(xiàn)IP段范圍校驗示例

    這篇文章主要介紹了Go語言實現(xiàn)IP段范圍校驗示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 一文詳解go中如何實現(xiàn)定時任務

    一文詳解go中如何實現(xiàn)定時任務

    定時任務是指按照預定的時間間隔或特定時間點自動執(zhí)行的計劃任務或操作,這篇文章主要為大家詳細介紹了go中是如何實現(xiàn)定時任務的,感興趣的可以了解下
    2023-11-11
  • Golang?channel關閉后是否可以讀取剩余的數(shù)據(jù)詳解

    Golang?channel關閉后是否可以讀取剩余的數(shù)據(jù)詳解

    這篇文章主要介紹了Golang?channel關閉后是否可以讀取剩余的數(shù)據(jù),文章通過一個測試例子給大家詳細的介紹了是否可以讀取剩余的數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • Go語言中的變量和常量

    Go語言中的變量和常量

    這篇文章介紹了Go語言中的變量和常量,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Go語言實現(xiàn)lru淘汰策略和超時過期

    Go語言實現(xiàn)lru淘汰策略和超時過期

    緩存的大小是有限的,當添加數(shù)據(jù)發(fā)現(xiàn)剩余緩存不夠時,需要淘汰緩存中的部分數(shù)據(jù),本文主要介紹了Go語言實現(xiàn)lru淘汰策略和超時過期,感興趣的可以了解一下
    2024-02-02
  • Go中變量命名規(guī)則與實例

    Go中變量命名規(guī)則與實例

    命名規(guī)則涉及變量、常量、全局函數(shù)、結構、接口、方法等的命名,下面這篇文章主要給大家介紹了關于Go中變量命名的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01

最新評論