下载通用编译器

地址:https://github.com/protocolbuffers/protobuf/releases
选择对应的版本,解压后将文件夹下bin目录配置到环境变量
安装go编译器- $ go install google.golang.org/protobuf/cmd/protoc-gen-go
- $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
复制代码 创建文件夹,创建两个项目

记得 go mod init 项目名
然后 go mod tidy
Demo.proto内容- // 这个就是protobuf的中间文件
- // 指定的当前proto语法的版本,有2和3
- syntax = "proto3";
- // 输出路径
- option go_package="../pdfile";
- // 定义request model
- message GrpcDemoRequest{
- int32 number1 = 1; // 1代表顺序
- int32 number2 = 2;
- }
- // 定义response model
- message GrpcDemoResponse{
- int32 sum = 1; // 1代表顺序
- }
- // 定义服务主体
- service ProdService{
- // 定义方法
- rpc GetSum(GrpcDemoRequest) returns(GrpcDemoResponse);
- }
复制代码 这里我们实现GetSum的功能是,传过来的GrpcDemoRequest结构体内 n1+n2 然后通过GrpcDemoResponse返回。
proto文件定义了方法和方法的参数,方法的内容要通过编译后的文件以接口的方式来实现
编译文件,终端进入到pdfile文件夹下,运行命令- protoc --go_out=. --go-grpc_out=. Demo.proto
复制代码 会在pdfile下生成两个文件

生成后的go文件不要改动
如果导入包报红

鼠标悬浮点击Sync
Demo_grpc.pd.go
我们要实现的就是51 52 行的方法,下面红框是示例,到时候我们复制一下拿来用

在pdfile文件夹下创建Demo_imp.go

代码- package pdfile
- import (
- "context"
- )
- type DemoServiceServer struct {
- }
- func (d *DemoServiceServer) GetSum(ctx context.Context,req *GrpcDemoRequest) (*GrpcDemoResponse, error) {
- resp := GrpcDemoResponse{
- Sum: req.Number1+req.Number2,
- }
- return &resp,nil
- }
- func (d *DemoServiceServer) mustEmbedUnimplementedProdServiceServer() {}
复制代码 服务注册
回到我们srv下的main文件- package main
- import (
- "google.golang.org/grpc"
- "net"
- "srv/pdfile"
- )
- func main() {
- server := grpc.NewServer()
- demoServer := &pdfile.DemoServiceServer{}
- pdfile.RegisterProdServiceServer(
- server,
- demoServer,
- )
- listenin ,err := net.Listen("tcp","0.0.0.0:8858")
- if err != nil {
- panic(err)
- }
- _ = server.Serve(listenin)
- }
复制代码 客户端调用
将pdfile文件夹拷贝到cli文件夹下

修改cli main文件- package main
- import (
- "cli/pdfile"
- "context"
- "fmt"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- "log"
- )
- func main() {
- conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
- if err != nil {
- log.Fatal(err)
- }
- demoServiceClient := pdfile.NewProdServiceClient(conn)
- // 直接像调用本地方法一样调用GetSum方法
- resp, err := demoServiceClient.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
- Number1: 10,
- Number2: 5,
- })
- if err != nil {
- log.Fatal("调用gRPC方法错误: ", err)
- }
- fmt.Println(resp)
- }
复制代码 运行srv 然后运行 cli

完成
封装方便调用
新建文件
 - package grpc_conn
- import (
- "cli/pdfile"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- "log"
- )
- var Grpc_conn pdfile.ProdServiceClient
- func init() {
- conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
- if err != nil {
- log.Fatal(err)
- }
- Grpc_conn = pdfile.NewProdServiceClient(conn)
- }
复制代码 新建测试模块
 - package test
- import (
- "cli/grpc_conn"
- "cli/pdfile"
- "context"
- "fmt"
- "log"
- "testing"
- )
- func TestDemo1(t *testing.T) {
- resp, err := grpc_conn.Grpc_conn.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
- Number1: 10,
- Number2: 5,
- })
- if err != nil {
- log.Fatal("调用gRPC方法错误: ", err)
- }
- fmt.Println(resp)
- }
复制代码 运行test

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |