gRPC是一种高性能、开源和通用的远程过程调用(RPC)框架,由Google开源并维护。它使用Protocol Buffers(protobuf)作为接口定义语言(IDL),提供跨平台、跨语言的RPC调用支持。gRPC具有以下几个特点:
总之,gRPC提供了一种高效、可扩展、多语言、安全的RPC框架,适用于大规模分布式系统中的服务间通信,如微服务架构。
本文以go为例,介绍如何使用gRPC开发一个简单服务。
(资料图片仅供参考)
从github系统对应的protoc预编译版,解压到/usr/local/
下,以v22.3为例,具体操作如下:
wget https://github.com/protocolbuffers/protobuf/releases/download/v22.3/protoc-22.3-linux-x86_64.zipunzip protoc-22.3-linux-x86_64.zip -d /usr/local/ldconfig protoc --version# libprotoc 22.3
go install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
syntax = "proto3";option go_package = "./;hello";package hello;message HelloRequest{ string name = 1;}message HelloResponse{ string message = 1;}service ExampleService{ rpc SayHi (HelloRequest) returns (HelloResponse);}
service ExampleService
就是我们定义的服务,rpc SayHi (HelloRequest) returns (HelloResponse);
就是服务中提供的接口,protoc会根据我们定义的proto文件生成相应的代码。
终端下执行以下命令即可生成我们需要的代码:
protoc --go_out=. --go-grpc_out=. hello.proto
--go_out指定go文件的生成目录,--go-grpc_out指定grpc文件的生成目录
此时打开生成的go文件大概率会发现飘红报错,此时可以在当前目录下执行go mod tidy
同步下依赖即可。
示例只是简单实现一个echo服务,服务端代码如下:
package mainimport ("context""net"pb "github.com/mengbin92/hello/protos/hello""google.golang.org/grpc")// 服务实体type HelloService struct {pb.UnimplementedExampleServiceServer}// 实现我们proto文件定义的接口func (sv *HelloService) SayHi(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {return &pb.HelloResponse{Message: "hello " + in.Name}, nil}func main() {// 创建grpc服务示例sv := grpc.NewServer()// 注册我们的服务pb.RegisterExampleServiceServer(sv, new(HelloService))// 绑定端口,提供服务lis, err := net.Listen("tcp", ":50001")if err != nil {panic(err)}// 启动服务sv.Serve(lis)}
启动服务后,服务端会一直阻塞等待客户端的链接,直到收到kill
信号:
go run server.go
package mainimport ("context""fmt"pb "github.com/mengbin92/hello/protos/hello""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure")func main() {// 创建grpc连接conn, err := grpc.Dial("localhost:50001", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {panic(err)}defer conn.Close()// 实例化客户端client := pb.NewExampleServiceClient(conn)// 发送请求req := &pb.HelloRequest{Name: "world"}resp, err := client.SayHi(context.TODO(), req)if err != nil {panic(err)}fmt.Printf("get response from server: %s\n", resp.Message)}
客户端启动后向服务端发送world
,服务端返回hello world
:
go run client.go# get response from server: hello world
至此,一个简单的gRPC服务就已经搞定了。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。Author: mengbinblog: mengbinGithub: mengbin92cnblogs: 恋水无意
标签: