这样创建的项目可以不在GOPATH下运行
输入代理:
https://goproxy.cn
当然,也可以用别的代理
先创建server.go在项目根目录,放main函数
在go.mod文件中加一行
require google.golang.org/grpc v1.29.1
官方安装命令:
go get google.golang.org/grpc
是安装不了的,会报超时错误:
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc"(https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
因为这个包已经迁移到github上了,正确的做法是使用git clone去下载:
有git的同学 可以直接
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
下载protoc:
https://github.com/golang/protobuf
下载后将bin文件夹配置到环境变量中。
怎么配置环境变量就不说了,不知道的同学肯定是跳着学了。
输入protoc --version 出现版本号说明安装成功。
创建一个文件夹pbfiles用于存放proto文件
创建一个proto文件:Hi.proto
syntax="proto3"; //
package services;
option go_package = "../services";
message HiRequest {
string say = 1;
}
message HiResponse {
string responed = 1;
}
service HiService {
rpc GetHiResponed(HiRequest) returns (HiResponse);
}
创建services文件夹在项目根目录,文件夹名就是proto文件中定义的包名。
打开终端,可以在Golang IDE 左下角选择Terminal也可以在项目文件夹中cmd进入。
先cd pbfiles 进入pbfiles文件夹
输入 protoc --go_out=plugins=grpc:. Hi.proto
可以看到在services包中生成了一个Hi.pb.go 文件
新建一个HiService.go文件,其中声明一个结构体HiService
type HiService struct {
}
结构体实现Hi.pb.go中的接口
type HiServiceServer interface {
GetHiResponed(context.Context, *HiRequest) (*HiResponse, error)
}
传入一个上下文context 和Hi.pb.go中定义的请求体 ,可以从请求体中取得客户端请求时放入的内容
返回的也是Hi.pb.go中定义的返回体,返回体中的返回值就是客户端请求时返回的内容。
在server.go的main方法中写上
rpcServer := grpc.NewServer() // 创建grpc服务
services.RegisterHiServiceServer(rpcServer, new(services.HiService)) // 注册,new方法中的是services包中定义的结构体HiService
lis,_:= net.Listen("tcp", ":8081") // 开启一个监听端口
rpcServer.Serve(lis) // 启动服务
也使用go mod方式创建项目
将服务端的services包复制过来。
创建一个main.go
package main
import (
"context"
"fmt"
"gRPCClientTest/services"
"google.golang.org/grpc"
"log"
)
func main (){
conn, err := grpc.Dial(":8081",grpc.WithInsecure())
if err != nil {
log.Println(err)
}
defer conn.Close()
client := services.NewHiServiceClient(conn)
resp, err := client.GetHiResponed(context.Background(),&services.HiRequest{Say: "Hello"})
if err != nil {
log.Println(err)
}
fmt.Println(resp.Responed)
}