使用gRPC实现获取数据库版本

 更新时间:2023年12月26日 09:08:29   作者:242030  
这篇文章主要为大家详细介绍了如何使用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 gRPC教程实现Simple RPC

    Go gRPC教程实现Simple RPC

    这篇文章主要为大家介绍了Go gRPC教程实现Simple RPC示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • golang 执行命令行的实现

    golang 执行命令行的实现

    本文主要介绍了golang 执行命令行的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go语言基础类型及常量用法示例详解

    Go语言基础类型及常量用法示例详解

    这篇文章主要为大家介绍了Go语言基础类型及常量的用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • GO的range如何使用详解

    GO的range如何使用详解

    本文主要介绍了GO的range如何使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • go语言实现简单http服务的方法

    go语言实现简单http服务的方法

    这篇文章主要介绍了go语言实现简单http服务的方法,涉及Go语言http操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 详解golang中bufio包的实现原理

    详解golang中bufio包的实现原理

    这篇文章主要介绍了详解golang中bufio包的实现原理,通过分析golang中bufio包的源码,来了解为什么bufio能够提高文件读写的效率和速度
    2018-01-01
  • Go语言并发之WaitGroup的用法详解

    Go语言并发之WaitGroup的用法详解

    这篇文章主要详细介绍了Go语言并发中得到WaitGroup,文中有相关的代码示例供大家参考,对我们的学习或工作有一定的参考价值,感兴趣的同学跟着小编一起来学习吧
    2023-06-06
  • Go语言遍历目录的三种方法举例

    Go语言遍历目录的三种方法举例

    学习io之后,尤其是文件操作,我们就可以遍历给定的目录了,这篇文章主要给大家介绍了关于Go语言遍历目录的三种方法,分别是ioutil.ReadDir、filepath.Walk以及filepath.Glob,需要的朋友可以参考下
    2023-11-11
  • Go 函数返回nil遇到问题避坑分析

    Go 函数返回nil遇到问题避坑分析

    这篇文章主要为大家介绍了Go 函数返回nil遇到的避坑问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • GoFrame框架数据校验之校验结果Error接口对象

    GoFrame框架数据校验之校验结果Error接口对象

    这篇文章主要为大家介绍了GoFrame框架数据校验之校验结果Error接口对象示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论