Golang简实现gRPC

1、准备

1.1 安装protobuf
官网地址:Releases · protocolbuffers/protobuf · GitHub

2 、环境变量(Windows)

下载protobuf并解压

将bin目录添加到你的环境变量PATH中。

  • 右击“我的电脑”或“此电脑”,选择“属性”。
  • 点击“高级系统设置”,然后点击“环境变量”。
  • 在“系统变量”下,找到并选择PATH,点击“编辑”。
  • 添加解压后的bin目录的路径,点击“确定”。

验证:cmd运行protoc --version,显示版本号为安装成功

 3、安装gRPC

3.1下载gRPC的Go实现包 

go get -u google.golang.org/grpc

 3.2下载protoc-gen-go.exe

go get -u google.golang.org/protobuf/cmd/protoc-gen-go

3.3下载protoc-gen-go-grpc.exe

 go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc

 无报错则下载成功,可在GOPATH的bin目录下找到

4、定义服务

创建proto文件,如:user.proto

模版:

//使用proto3语法
syntax = "proto3";

package user;

//生成的go文件是处在那个目录哪个包中,  .代表在当前目录生成,user代表了生成的go文件包名是user
option go_package = "./user";

//定义了一个service,称为User,服务内有一个rpc方法
//getUser会发送一个IdRequest,然后返回一个UserResponse
service User {
  rpc getUser(IdRequest) returns(UserResponse);
}

//message关键字,可以理解为Golang中的结构体
//定义IdRequest,定义了一个id变量。"注意:变量后面的1,在这里并不是赋值,而是顶一个这个变量在message中的位置"
message IdRequest {
  string id = 1;
  //bool gender = 2;
}

//定义返回的UserResponse
message UserResponse {
  // 用户id
  string id = 1;
  // 用户名称
  string name = 2;
  // 用户性别
  bool gender = 3;
}

5、生成代码

使用 Protocol Buffers 编译器生成 Go 语言代码

protoc --go_out=. user.proto
protoc --go-grpc_out=. user.proto

6、服务端代码实现

package main

import (
	"context"
	pb "gRPC-study/user"
	"google.golang.org/grpc"
	"log"
	"net"
)

type server struct {
	pb.UnimplementedUserServer
}

// 实现GetUser方法
func (s *server) GetUser(ctx context.Context, in *pb.IdRequest) (*pb.UserResponse, error) {
	return &pb.UserResponse{Id: "1", Name: "张三", Gender: true}, nil
}

func main() {
	//创建端口
	listen, err := net.Listen("tcp", ":9090")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	//创建grpc服务
	rpcServer := grpc.NewServer()
	//在grpc服务端中去注册我们自己编写的服务
	pb.RegisterUserServer(rpcServer, &server{})
	//启动服务
	if err := rpcServer.Serve(listen); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

7、客户端代码实现

package main

import (
	"context"
	"fmt"
	"gRPC-study/gRPC-golang/user"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
)

func main() {
	//连接到server端,此处禁用安全传输,没有加密和验证
	conn, err := grpc.Dial("localhost:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	//建立连接
	client := user.NewUserClient(conn)

	//执行rpc调用(这个方法在服务端实现并返回结果)
	r, err := client.GetUser(context.Background(), &user.IdRequest{Id: "1"})
	if err != nil {
		log.Fatalf("调用失败: %v", err)
	}
	fmt.Println("user: ", r.Id, r.Name, r.Gender)

}

 8、测试

启动服务端监听端口、注册服务

启动客户端连接rpc服务,调用服务方法

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值