gRPC以及gRPC在go语言当中的应用

12 篇文章 0 订阅

gRPC在go语言当中的应用,第一个gRPC应用

请确保在进行后续的步骤时,确保电脑中有protobuf

MacOS可以利用brew install protobuf安装

1、创建新的go项目

项目名称:gitee.com/qingke.wu/hello-grpc/pb

go mod init gitee.com/qingke.wu/hello-grpc/pb
.
├── Makefile						#常用的make命令,如go run,go test
├── client							#客户端
├── go.mod
├── go.sum
├── pb									#经protoc编译后的文件
├── proto								#proto源文件
├── server							#服务端
└── service							#对pb中的实现的业务逻辑

2、安装依赖

安装gRPC需要的依赖

go get - u google.golang.org/grpc

3、安装插件

安装定制给go和gRPC的插件

go install github.com/golang/protobuf/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

4、编写proto文件并且编译

hello.proto:

syntax = "proto3";      //语法版本

option go_package = ".;hello";    //生成的go文件的包名

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

//一个 rpc 服务通过参数和返回类型来指定可以远程调用的方法
service Hello {
  // rpc 定义可远程调用服务
  rpc HelloWorld (HelloRequest) returns (HelloResponse) {}
}

使用protoc生成可用于go和grpc的文件

protoc --proto_path=proto proto/*.proto --go_out=plugins=grpc:./pb

可以将它写进Makefile中

gen:
	protoc --proto_path=proto proto/*.proto --go_out=plugins=grpc:./pb

5、对pb中的文件进行实现

这是位于hello.pb.go文件中的HelloServer接口,我们需要自己实现它。

// HelloServer is the server API for Hello service.
type HelloServer interface {
	// rpc 定义可远程调用服务
	HelloWorld(context.Context, *HelloRequest) (*HelloResponse, error)
}

所以编写在service包下新建hello_service.go

package service

import (
	"context"
	pb "gitee.com/qingke.wu/hello-grpc/pb"
	"log"
)

// HelloServer hello.proto中service hello的实现(即实现hello service)
type HelloServer struct{}

func NewHelloServer() *HelloServer {
	return &HelloServer{}
}

// HelloWorld 实现hello.proto中的中的service hello中定义的HelloWorld方法(必须同名)
func (s *HelloServer) HelloWorld(context context.Context, request *pb.HelloRequest) (*pb.HelloResponse, error) {
	// 通过getter来获取到request中的name
	log.Printf("Received hello.name: %v", request.GetName())

	// 对request作对应的处理

	// 通过response返回给调用者
	return &pb.HelloResponse{Message: "Hello!" + request.GetName()}, nil
}

6、服务端

package main

import (
	pb "gitee.com/qingke.wu/hello-grpc/pb"
	"gitee.com/qingke.wu/hello-grpc/service"
	"google.golang.org/grpc"
	"log"
	"net"
)

func main() {
	// grpc服务
	grpcServer := grpc.NewServer()

  // 利用hello.pb.go中的RegisterHelloServer()将service注册到grpc
	pb.RegisterHelloServer(grpcServer, service.NewHelloServer())

	// 启用net利用tcp来连接并且进行监听
	listen, err := net.Listen("tcp", ":9001") // 指定端口号
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	// 开启服务
	err = grpcServer.Serve(listen)
	if err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

7、客户端

package main

import (
	"context"
	pb "gitee.com/qingke.wu/hello-grpc/pb"
	"google.golang.org/grpc"
	"log"
	"time"
)

func main() {
	// 指定端口号连接到grpc服务
	// WithInsecure()不指定安全选项
	conn, err := grpc.Dial("localhost:9001", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	// 延迟关闭连接
	defer conn.Close()

	// 利用hello.pb.go文件中的NewHelloClient()来获得client
	client := pb.NewHelloClient(conn)

	// 设置上下文超时时间
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)

	defer cancel()

	// 构建request1
	request1 := &pb.HelloRequest{}
	request1.Name = "World!"

	// 利用request发起请求,并且得到response响应
	// client不需要关心HelloWorld在服务端上的具体实现
	// 只需要关心request和response即可
	response, err := client.HelloWorld(ctx, request1)
	if err != nil {
		log.Fatalf("could not succ: %v", err)
	}
  // 读取response
	log.Printf("Receive from server: %s", response.Message)
}

启动服务端再启动客户端

服务端接受来自客户端的请求:在这里插入图片描述

客户端收到来自服务端的响应:在这里插入图片描述

**OK!**至此,一个简单的基于go的gRPC实现的演示项目已经完成!

总结

client和server通过共同协定好的proto约定来进行通信。

其中server需要对proto生成的proto.go对象的service进行实现,然后再将grpcServer与XxxPbServer进行注册。

其中client只需要关心proto.go对象的service中的rpc调用的request和response即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值