下载这两个库(在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.gp
和login_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 ,到目前为止,简单的一个登录服务就实现了…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)