Golang 学习手册
  • 主页
  • 安装
  • 参考资料
  • Q&A
  • 基础
    • Hello,world!
    • 包
    • 变量
    • 常量
    • 类型
      • 整型
      • 浮点型
      • 复数
      • 布尔型
      • 字符
      • 字符串
      • 数组
      • 切片
      • 字典
      • 指针
      • 方法
      • 结构体
      • 接口
      • 自定义类型
    • 语法
      • 判断
      • 循环
      • 错误处理
    • 协程
      • 锁
      • 等待组
      • 通道
      • 上下文
    • 测试与分析
      • 单元测试
      • 性能测试
      • 性能分析
    • 编译
      • 条件编译
      • 交叉编译
  • 高级
    • 存储
      • 键值存储
        • Etcd
    • HTTP
      • http服务基础
      • Websocket
      • 开源框架
        • Beego
        • Echo
        • Gin
        • Iris
        • Revel
        • 框架对比
      • Kubernetes风格API框架
    • RPC
      • RPCX
      • GRPC
      • grpc-gateway
    • 连接分发器
    • TLS加密
    • 链路追踪
      • skywalking
  • 项目管理
    • 代码规范
    • 包管理
    • 文档
      • GoDoc
      • Markdown
      • Swagger
    • 仓库管理
      • 分支管理
      • 问题管理
      • 里程碑管理
      • 发布管理
    • 持续集成
      • CircleCI
      • TravisCI
由 GitBook 提供支持
在本页
  • 官方网站
  • 项目地址
  • 下载与安装
  • 例子
  • 简单grpc服务

这有帮助吗?

在Git上编辑
  1. 高级
  2. RPC

GRPC

上一页RPCX下一页grpc-gateway

最后更新于2年前

这有帮助吗?

官方网站

项目地址

下载与安装

首先安装protoc

访问下方地址

根据系统类型找到合适的安装包下载后解压,将其中的二进制文件移入$PATH目录中,将其中的include/目录下的文件复制到/usr/local/lib/目录下

接着安装 protoc-gen-go 插件

go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

最后下载 grpc 库

go get -u google.golang.org/grpc

如果无法访问外网则使用以下方式

git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone git@github.com:googleapis/go-genproto.git $GOPATH/src/google.golang.org/genproto

例子

简单grpc服务

package main

import (
	"context"
	"log"
	"net"

	"google.golang.org/grpc"
	
	"demo/rpc/grpc/simple/protos/pb"
)

const (
	port = "localhost:9090"
)

type server struct{}

func (s *server) Echo(ctx context.Context, in *pb.StringMessage) (*pb.StringMessage, error) {
	log.Printf("Received: %v", in.Value)
	return &pb.StringMessage{Value: "Hello " + in.Value}, nil
}

func main() {
	lis, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterYourServiceServer(s, &server{})
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}
package main

import (
	"context"
	"log"
	"os"
	"time"

	"google.golang.org/grpc"
	
	"demo/rpc/grpc/simple/protos/pb"
)

const (
	address     = "localhost:9090"
	defaultName = "world"
)

func main() {
	conn, err := grpc.Dial(address, grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := pb.NewYourServiceClient(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.Echo(ctx, &pb.StringMessage{Value: name})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.Value)
}
syntax = "proto3";
option go_package = "/pb";

package example;

message StringMessage {
  string value = 1;
}

service YourService {
  rpc Echo(StringMessage) returns (StringMessage) {}
}

执行命令

protoc --go_out=./protos --go-grpc_out=./protos --proto_path=./protos protos/*.proto

这时 protos/ 目录下会生成 helloworld.pb.go 和 helloworld_grpc.pb.go 文件,该文件是 grpc 接口以及相关参数的定义

执行以下命令启动GRPC服务端

go run server/main.go

执行以下命令执行GRPC客户端

go run client/main.go

服务端输出

2019/06/25 17:32:09 Received: world

客户端输出

2019/06/25 17:32:09 Greeting: Hello world
gRPCgRPC
GitHub - grpc/grpc-go: The Go language implementation of gRPC. HTTP/2 based RPCGitHub
Releases · protocolbuffers/protobufGitHub
Logo
Logo
Logo