grpc套路服務端編寫

huxiaobai_001發表於2020-08-18

我們需要service來實現User.pb.go裡面的介面和對應的方法
直接看程式碼吧:

package main

import (
    "com.rpc.study/common"
    "com.rpc.study/models"
    user2 "com.rpc.study/pdfiles/user"
    "context"
    "fmt"
    "github.com/go-xorm/xorm"
    "google.golang.org/grpc"
    "net"
)



//userservice的實現
type UserServiceImpl struct {
    //因為我們要使用到xorm運算元據庫 所以要定義哦 在註冊的時候我們會將資料庫引擎註冊進去
    Engine *xorm.Engine
}
//userservice實現的方法  UserList()裡面具體的引數可以直接參考User.pb.go檔案裡面的UserList()方法
func (us *UserServiceImpl) UserList(ctx context.Context,user *user2.RequestUser) (*user2.ResponseUser,error) {
    //返回的是 user2.ResponseUser型別
    return &user2.ResponseUser{
        User:us.GetUser(user.Name),
    },nil
}
//userservice實現的方法
func (us *UserServiceImpl) GetUser(name string) []*user2.User {

    //記得去建立user的模型
    var userList []models.User
    err := us.Engine.Where("id > ?", 0).Find(&userList)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(userList)
    fmt.Println("===========================================")

    //因為返回的是[]*user2.User
    userList1 := make([]*user2.User,0)
    //遍歷資料庫查詢結果 然後重新塞入到新的切片當中去
    for _,u := range userList {
        userList1 = append(userList1,&user2.User{
            Name:u.Name,
            Age:u.Age,
            Mobile:u.Mobile,
        })
    }

    return userList1

    //users := make([]*user2.User,0)
    //for i:=1;i<=10;i++ {
    //    n := strconv.Itoa(i)
    //    users = append(users,&user2.User{
    //        Name:n,
    //        Age:int64(i),
    //    })
    //}
    //return users;

}

func main(){
    //服務端起來一個tcp服務 監聽埠8084
    lis, err := net.Listen("tcp", ":8084")
    if err != nil {
        fmt.Println("server error 500",err.Error())
        return
    }
    //實現一個grpc
    server := grpc.NewServer()
    //資料庫引擎
    engine :=  common.NewMysqlEngine()
    //註冊service的時候我們就將資料庫引擎傳遞進去 這樣在service裡面就可以運算元據庫啦
    user2.RegisterUserServiceServer(server,&UserServiceImpl{Engine:engine})
    //啟動服務   這個地方我們不需要for死迴圈 grpc當中會自動幫助我們實時監聽
    server.Serve(lis)
}

資料庫引擎的程式碼也給你吧:
_ “github.com/go-sql-driver/mysql”
“github.com/go-xorm/xorm”
記得自己去go get一下

package common

import (
    _ "github.com/go-sql-driver/mysql" //不能忘記匯入
    "github.com/go-xorm/xorm"
    "xorm.io/core"
)

//資料庫操作引擎
func NewMysqlEngine() *xorm.Engine{
    //xorm.NewEngine("mysql", "root:yu271400@tcp(127.0.0.1:3306)/qfCms?charset=utf8")
    engine, err := xorm.NewEngine("mysql", "root:root@tcp(127.0.0.1:3306)/elmcms?charset=utf8")
    if err != nil {
        panic(err.Error())
    }
    //iris當中我們都講過 不必多講
    engine.ShowSQL(true)
    engine.Logger().SetLevel(core.LOG_DEBUG)
    engine.SetMaxOpenConns(10)

    //返回引擎
    return engine
}

userModel.go檔案也給你吧:

package models

type User struct {
    Name   string `xorm:"varchar(255)" json:"name"`
    Mobile string `xorm:"varchar(255)" json:"mobile"`
    Age    int64  `xorm:"int" json:"age"`
}

服務端啟動之後grpc會自動幫我們監聽 屬於長連線
註冊serviceImpl實現服務的時候把資料庫引擎帶進去不要忘了 要不你咋運算元據庫呢?
完畢!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
胡軍

相關文章