gRPC通信

1. gRPC简介

gRPC是一种高性能、开源和通用的远程过程调用(RPC)框架,由Google开源并维护。它使用Protocol Buffers(protobuf)作为接口定义语言(IDL),提供跨平台、跨语言的RPC调用支持。gRPC具有以下几个特点:

  1. 高性能:使用HTTP/2协议,支持多路复用和流控制等特性,能够在客户端和服务器之间高效地传输大量数据。同时,gRPC还使用了基于平台优化的序列化和反序列化技术,提高了通信的效率。
  2. 简单易用:gRPC的IDL语言简单易懂,同时提供了自动生成代码的工具,方便用户进行开发。用户只需要定义好IDL,并生成代码后即可在代码中使用类似于本地函数调用的方式进行远程过程调用。
  3. 多语言支持:gRPC支持多种编程语言,如C++, Java, Python, Go, Ruby等,可以在不同编程语言之间进行RPC调用。
  4. 可扩展性:gRPC支持各种扩展,包括拦截器、负载均衡、认证和授权等,可以满足不同场景下的需求。
  5. 安全性:gRPC支持SSL/TLS安全传输,同时还提供了基于Token的认证机制,确保通信的安全性。

总之,gRPC提供了一种高效、可扩展、多语言、安全的RPC框架,适用于大规模分布式系统中的服务间通信,如微服务架构。

本文以go为例,介绍如何使用gRPC开发一个简单服务。

2. 准备工作

2.1 安装protoc

github系统对应的protoc预编译版,解压到/usr/local/下,以v22.3为例,具体操作如下:

bash 复制代码
wget https://github.com/protocolbuffers/protobuf/releases/download/v22.3/protoc-22.3-linux-x86_64.zip
unzip protoc-22.3-linux-x86_64.zip -d /usr/local/
ldconfig 
protoc --version
# libprotoc 22.3

2.2 安装go相关插件

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

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

3. 实践

3.1 编写proto文件

bash 复制代码
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文件生成相应的代码。

3.2 使用protoc生成代码

终端下执行以下命令即可生成我们需要的代码:

复制代码
protoc --go_out=. --go-grpc_out=. hello.proto

--go_out指定go文件的生成目录,--go-grpc_out指定grpc文件的生成目录

此时打开生成的go文件大概率会发现飘红报错,此时可以在当前目录下执行go mod tidy同步下依赖即可。

3.3 编写服务端代码

示例只是简单实现一个echo服务,服务端代码如下:

Go 复制代码
package main
 
import (
	"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

3.4 实现客户端

Go 复制代码
package main
 
import (
	"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

bash 复制代码
go run client.go
# get response from server: hello world

至此,一个简单的gRPC服务就已经搞定了。

相关推荐
codeejun23 分钟前
每日一Go-59、云原生入门为什么一定要学Docker?
docker·云原生·golang
雷工笔记30 分钟前
MES 系统设备管理模块详细设计方案
大数据·运维·网络
xhbh6661 小时前
端口转发是什么?如何设置端口转发?
网络·流量转发·端口流量转发
S1998_1997111609•X1 小时前
论恶意注入污染蜜罐进程函数值取仺⺋以集团犯罪获取数据爬虫的轮系依据
网络·数据库·爬虫·网络协议·百度
初心未改HD2 小时前
gRPC 与 Protobuf 实战指南
开发语言·golang
jieyucx2 小时前
Go语言切片:动态灵活的数据序列
算法·golang·指针·顺序表·数组·结构体·切片
头条娱圈2 小时前
Ella 陈嘉桦「艾拉主意」苏州站圆满落幕 十站二十场铸就巡演里程碑
网络
小墨同学boy3 小时前
别再折腾 FRP 了!无公网 IP、不碰路由器,Tailscale 三步搞定异地组网
网络·网络协议·tcp/ip
想成为优秀工程师的爸爸3 小时前
车载以太网之要火系列 - 第33篇:郭大侠学UDS(10服务)- 桃花岛内规矩多,模式切换要会说
网络·笔记·网络协议·信息与通信·车载以太网
ACP广源盛139246256733 小时前
一芯搞定多屏高清@ACP#GSV1221 DP 1.4 MST 转 HDMI 1.4 高集成转换芯片
网络·人工智能·嵌入式硬件·计算机外设·电脑