一:安装grpc
在go使用了module 只需要在 go.mod文件中添加一下文件,进入次目录执行 go build 自动安装了(需要更改go的代理,我使用的是七牛云的代理,能直接下载)
require (
google.golang.org/grpc v1.34.0
google.golang.org/protobuf v1.25.0
)
二:准备编译protoful需要的工具
1、安装protoc 根据开发环境和需求下载:https://github.com/protocolbuffers/protobuf/releases
2、编译 protoc-gen-go 源文件下载地址:https://github.com/golang/protobuf/tree/master/protoc-gen-go 是go语言编写的可以自己直接下载,自己编译成二进制文件
3、编译 protoc-gen-go-grpc 下载地址:https://github.com/grpc/grpc-go/tree/master/cmd/protoc-gen-go-grpc 是go语言编写的可以自己直接下载,自己编译成二进制文件
4、以上三部的安装一定要保证在命令行下,能找到这个三个命令(设置一下全局变量,或者放到你的GOPATH下面的bin文件下,然后把此文件夹设置成环境变量文件加)
三、编写proto文件
语法教程:proto3语法教程
实例:编写文件 ticketCheck.proto
syntax = "proto3"; //使用的是版本
option go_package = "ticketCheck"; 是这生成*._grpc.pb.go,*.pb.go文件的包名
package proto;
message TicketRequest { //请求结构体
int32 playtype = 1;
int32 lottype = 2;
string lotnum = 3;
int32 multiple = 4;
int32 betnum = 5;
int32 money = 6;
}
message TikcetResponse { //返回结构体
bool checkflag = 1;
string errors = 2;
}
service CheckService { //方法
rpc Verification (TicketRequest) returns (TikcetResponse){};
}
生成*._grpc.pb.go,*.pb.go文件
进入你要编写的 ticketCheck.proto 所在的目录 然后在命令行下执行:
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ticketCheck.proto
四:编写服务端
package main
import (
pb "codestudy/proto/ticketCheck" //生成proto文件的地址
"context"
"google.golang.org/grpc"
"log"
"net"
)
type TicketCheck struct {
pb.UnimplementedCheckServiceServer
}
func (t *TicketCheck) Verification(ctx context.Context, ticket *pb.TicketRequest) (*pb.TikcetResponse, error) {
return &pb.TikcetResponse{Checkflag: true, Errors: "验证成功"}, nil
}
func main() {
lis, err := net.Listen("tcp", ":7788")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterCheckServiceServer(s, &TicketCheck{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
五:编写客户端
package main
import (
"context"
"log"
"time"
pb "codestudy/proto/ticketCheck"
"google.golang.org/grpc"
)
const (
address = "localhost:7788"
)
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewCheckServiceClient(conn)
// Contact the server and print out its response.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
var ticket *pb.TicketRequest = &pb.TicketRequest{
Playtype: 1,
Lottype: 1,
Lotnum: "1,2,3,4,5,6,7,8,9,10",
Multiple: 1,
Betnum: 1,
Money: 2,
}
r, err := c.Verification(ctx, ticket)
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetErrors())
}
六:启动服务端,然后在执行客户端就ok了
注:一定要先学习proto3的语法,会根据需求编写proto3文件。然后在编写服务端和客户端。在学习服务注册,服务发现,负载均衡(consul,etcd)
学无止境,动手最重要。