Golang gRPC的简单使用

Golang gRPC的简单使用,第1张

前提条件

下载这两个库(在modules模式下)。

go get -u google.golang.org/grpc
go get -u google.golang.org/protobuf

到protobuf release,选择适合自己 *** 作系统的压缩包文件

将解压后得到的protoc.exe二进制文件移动到$GOPATH/bin里。

然后再通过以下命令在工作目录下的bin ($GOPATH/bin)下面 生成``protoc-gen-go.exe protoc-gen-go-grpc.exe`

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
//注意你的GOOS不能错误

**PS:**如果你是用的Goland 的话,你可以下载给Protocol 的插件。

编写Protobuf

首先要编写login.proto文件

syntax = "proto3";  // 版本声明
package grpcinclass; // 包名,包名可以避免对message类型之间的名字冲突,同名的message可以通过package进行区分
option go_package = "/proto"; // 生成的go文件的package名(基于一定规则生成)


//这个是返回参数
message LoginByPWResp{
  bool OK = 1;
}
//这是参数
message LoginByPWReq{
  string loginAccount = 1;
  string PassWord = 2;
}
//message 相当于struct结构体

service UseCenter{
  rpc LoginByPW(LoginByPWReq)   returns (LoginByPWResp){}  //所提供的服务方法(函数)
}

然后再通过以下两个命令生成login.pd.gplogin_grpc.pd.go两个文件。

protoc --go_out=. ./login.proto
protoc --go-grpc_out=. ./login.proto
Sever 端
package main

import (
   "context"
   "doubna_userinfo/proto"
   "doubna_userinfo/server"
   "fmt"
   "google.golang.org/grpc"
   "log"
   "net"
)

const (
   address = "localhost:50051"
)
func main() {
   // 监听端口
   lis, err := net.Listen("tcp", address)
   if err != nil {
      log.Fatalf("failed to listen: %v", err)
   }

   s := grpc.NewServer() //获取新服务示例
   proto.RegisterUseCenterServer(s,&UserServer{})
   // 开始处理
   if err := s.Serve(lis); err != nil {
      log.Fatalf("failed to serve: %v", err)
   }

}

type UserServer struct {
   proto.UnimplementedUseCenterServer  
}



func  (s *UserServer) LoginByPW(ctx context.Context,req *proto.LoginByPWReq)(*proto.LoginByPWResp, error){

   resp := &proto.LoginByPWResp{}

   _, flag, err := server.JudgePasswordCorrect(req.LoginAccount, req.PassWord) //换成你自己的

   if err != nil {
      resp.OK=false
      fmt.Println("UserLogin is", err)
      return  resp,err
   }

   if flag {
      resp.OK=true
      return  resp,err
   }else {
      resp.OK=false
      return  resp,err
   }
}
Client 端

**调用Sever的一端 **

package main

import (
   "context"
   "doubna_userinfo/proto"
   "doubna_userinfo/tool"
   "github.com/gin-gonic/gin"
   "google.golang.org/grpc"
   "google.golang.org/grpc/credentials/insecure"
   "log"
   "net/http"
)

const (
   address = "localhost:50051"
)

var  Conn  *grpc.ClientConn
var UserClient   proto.UseCenterClient

func main() {
   //建立链接
   Conn,err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials()))
   if err != nil {
      log.Fatalf("did not connect: %v", err)
   }

   UserClient= proto.NewUseCenterClient(Conn)
   defer Conn.Close()

   engine:=gin.Default()
   engine.POST("/api/user/login/pw",login)
   engine.Run(":8080")
}

func login(ctx *gin.Context) {

   loginAccount := ctx.PostForm("loginAccount")
   password := ctx.PostForm("password")


   if loginAccount == "" {
      tool.RespErrorWithData(ctx, "请输入注册时用的邮箱或者手机号")
      return
   }

   if password == "" {
      tool.RespErrorWithData(ctx, "请输入密码")
      return
   }


   loginResp,_:= UserClient.LoginByPW(context.Background(), &proto.LoginByPWReq{
      LoginAccount: loginAccount,
      PassWord: password,
   })


   if loginResp.OK {
      ctx.JSON(http.StatusOK, gin.H{
         "access_token":  "",
         "refresh_token": "",
         "token":         "",
         "status":        "ture",
         "data":          "",
      })
      return
   }else {
      ctx.JSON(http.StatusOK, gin.H{
         "access_token":  "",
         "refresh_token": "",
         "token":         "",
         "status":        "false",
         "data":          "",
      })
   }
}

项目大概目录


  grpc_demo/
    |__config/
    |       |_app.json  
    |__server/
    |       |__login_server.go  (main)
    |__client/
            |_ login_client.go  (main)
    |__proto/
           |_login.pd.go
           |_login_grpc.pd,go
    |__tool/
    |    |__...
    |    |__...
    |__login.proto


ok ,到目前为止,简单的一个登录服务就实现了…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/990864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存