已默认安装go语言的环境及配置
一.相关资源获取
1.安装grpc和相关插件
//安装grpc
go get -u google.golang.org/grpc
//安装
go get google.golang.org/protobuf/cmd/protoc-gen-go
//安装,用于生成grpc代码
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
//安装grpc-gateway插件
go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway
2.检查环境
(1)在终端执行protoc -version,出现下图则说明配置成功
(2) $GOPATH/bin 目录下有 protoc-gen-go、protoc-gen-go-grpc、protoc-gen-grpc-gateway 这三个可执行文件。
二.编写proto文件
syntax = "proto3"; //语法声明
option go_package="./;pb";
package pb; //包名
// Greeter 微服务
service Greeter {
rpc SayHello(HelloRequest) returns (HelloResponse){
}
}
message HelloRequest{
string name=1;
}
message HelloResponse{
string message=1;
}
三.生成Go stubs,会生成 *.pb.go
和 *_grpc.pb.go
两个文件
//生成model
protoc --go_out ./pb ./pb/hello.proto
//生成service
protoc --go-grpc_out ./pb ./pb/hello.proto
四.服务端代码
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
pb "seeker.com/grpcdemo/pb"
)
const (
port = ":50051"
)
type server struct{
pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context , in *pb.HelloRequest)(*pb.HelloResponse , error){
return &pb.HelloResponse{Message: "Hello:" +in.Name},nil;
}
func main(){
lis , err := net.Listen("tcp" , port)
if err != nil{
log.Fatalf("failed to listen :%v" , err)
}
s :=grpc.NewServer();
pb.RegisterGreeterServer(s , &server{})
reflection.Register(s)
if err := s.Serve(lis) ; err != nil{
log.Fatalf("failed to Serve :%v" , err)
}
}
五.客户端代码
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"os"
"seeker.com/grpcdemo/pb"
"time"
)
const (
address = "localhost:50051"
defaultName = "hapi"
)
func main() {
conn , err :=grpc.Dial(address , grpc.WithInsecure())
if err !=nil{
fmt.Println("did not connect")
}
defer conn.Close()
c :=pb.NewGreeterClient(conn)
name :=defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
ctx , cancel :=context.WithTimeout(context.Background() , time.Second)
defer cancel()
r ,err :=c.SayHello(ctx , &pb.HelloRequest{Name : name})
if err !=nil {
fmt.Println("34")
}
fmt.Println(r.Message)
}
六.运行效果