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

Posted weixin_45747080

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gRPC以及gRPC在go语言当中的应用相关的知识,希望对你有一定的参考价值。

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.HelloResponseMessage: "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即可。

以上是关于gRPC以及gRPC在go语言当中的应用的主要内容,如果未能解决你的问题,请参考以下文章

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

Go语言gRPC+gRPC Getway开发环境配置

Go使用grpc+http打造高性能微服务

gRPC 实现原理

Go 程序员如何使用 gRPC 的指南

深度解析gRPC以及京东分布式服务框架跨语言实战