最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年12月26日 09:08:29   作者:242030  
這篇文章主要為大家詳細(xì)介紹了如何使用gRPC實(shí)現(xiàn)獲取數(shù)據(jù)庫版本,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

這里我們演示一個通過 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、項(xiàng)目的結(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)文章

  • 使用golang實(shí)現(xiàn)一個MapReduce的示例代碼

    使用golang實(shí)現(xiàn)一個MapReduce的示例代碼

    這篇文章主要給大家介紹了關(guān)于如何使用golang實(shí)現(xiàn)一個MapReduce,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 多階段構(gòu)建優(yōu)化Go?程序Docker鏡像

    多階段構(gòu)建優(yōu)化Go?程序Docker鏡像

    這篇文章主要為大家介紹了多階段構(gòu)建優(yōu)化Go?程序Docker鏡像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang處理parquet文件實(shí)戰(zhàn)指南

    Golang處理parquet文件實(shí)戰(zhàn)指南

    這篇文章主要給大家介紹了關(guān)于Golang處理parquet文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式

    Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式

    這篇文章主要介紹了Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Gin框架使用panic處理中間件問題詳解

    Gin框架使用panic處理中間件問題詳解

    這篇文章主要介紹了Gin框架使用panic處理中間件問題,在 Gin 框架中,錯誤處理和 panic 處理是非常重要的功能。當(dāng)處理 HTTP 請求時(shí),可能會出現(xiàn)各種各樣的錯誤,例如數(shù)據(jù)庫連接錯誤、網(wǎng)絡(luò)錯誤、權(quán)限問題等等
    2023-04-04
  • golang實(shí)現(xiàn)簡單的udp協(xié)議服務(wù)端與客戶端示例

    golang實(shí)現(xiàn)簡單的udp協(xié)議服務(wù)端與客戶端示例

    這篇文章主要介紹了golang實(shí)現(xiàn)簡單的udp協(xié)議服務(wù)端與客戶端,結(jié)合實(shí)例形式分析了基于UDP協(xié)議的數(shù)據(jù)傳輸相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-07-07
  • Go語言sync.Map詳解及使用場景

    Go語言sync.Map詳解及使用場景

    Go語言中的sync.Map是一個高效的并發(fā)安全映射結(jié)構(gòu),適用于高并發(fā)讀多寫少的場景,它通過讀寫分離、無鎖讀取路徑、寫入時(shí)的鎖保護(hù)等機(jī)制,提高了讀取性能并減少了鎖競爭,sync.Map不需要手動管理鎖,降低了編程復(fù)雜性,適合需要簡單并發(fā)訪問的場合
    2024-10-10
  • golang語言中for循環(huán)語句用法實(shí)例

    golang語言中for循環(huán)語句用法實(shí)例

    這篇文章主要介紹了golang語言中for循環(huán)語句用法,實(shí)例分析了for循環(huán)遍歷的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • Go語言中字符串的查找方法小結(jié)

    Go語言中字符串的查找方法小結(jié)

    這篇文章主要介紹了Go語言中字符串的查找方法小結(jié),示例的main函數(shù)都是導(dǎo)入strings包然后使用其中的方法,需要的朋友可以參考下
    2015-10-10
  • Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    數(shù)據(jù)加密是主要的數(shù)據(jù)安全防護(hù)技術(shù)之一,敏感數(shù)據(jù)應(yīng)該加密存儲在數(shù)據(jù)庫中,降低泄露風(fēng)險(xiǎn),本文將介紹一下利用Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密的方法,需要的可以參考一下
    2023-07-07

最新評論

冷水江市| 吉林省| 赤峰市| 新乐市| 新野县| 黎城县| 南华县| 宝坻区| 萝北县| 孟州市| 汤阴县| 宁明县| 江安县| 新津县| 洛川县| 太白县| 安多县| 富顺县| 正阳县| 桑日县| 临邑县| 双辽市| 疏附县| 宁南县| 泰和县| 靖江市| 饶河县| 南郑县| 旌德县| 苏州市| 通州区| 通山县| 盖州市| 蕉岭县| 芦溪县| 喀喇沁旗| 乌恰县| 桐柏县| 长葛市| 尚义县| 江安县|