google开发并开源的一款高性能、开源、通用的rpc框架

特点

  • 支持多种语言
  • 基于IDL文件定义服务,通过proto3工具生成指定语言的数据结构、服务端接口以及客户端stub
  • 基于HTTP/2设计,支持双向流、消息头压缩、单TCP的多路复用、服务端推送等特性
  • 序列化支持PB(语言无关的高性能序列化框架)和JSON

安装

  1. 安装grpc包。go install google.golang.org/grpc@latest
  2. 下载安装protoc,移动到PATH路径下。https://github.com/protocolbuffers/protobuf/releases
  3. 下载protoc的go插件。go install github.com/golang/protobuf/protoc-gen-go@latest

idl: hello.proto

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
syntax = "proto3";
package service;
option go_package = "hello/service";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

执行protoc命令生成go文件:

protoc -I pb/ pb/hello.proto –go_out=plugins=grpc:.

server

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import (
	"context"
	"fmt"
	"hello/service"
	"net"

	"google.golang.org/grpc"
)

type RPCService struct {
}

func (srv *RPCService) SayHello(ctx context.Context, req *service.HelloRequest) (*service.HelloReply, error) {

	name := req.Name

	return &service.HelloReply{Message: "Hello " + name}, nil
}

func main() {
	grpcServer := grpc.NewServer()

	service.RegisterGreeterServer(grpcServer, &RPCService{})

	listener, err := net.Listen("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("net Listen error", err)
	}

	grpcServer.Serve(listener)
}

client

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
	"context"
	"fmt"
	"hello/service"

	"google.golang.org/grpc"
)

func main() {
	conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
	if err != nil {
		panic(err)
	}

	client := service.NewGreeterClient(conn)

	rep, err := client.SayHello(context.TODO(), &service.HelloRequest{Name: "zw"})
	if err != nil {
		panic(err)
	}

	fmt.Println(rep.Message)
}