gRPC入门

grpc,入门 · 浏览次数 : 100

小编点评

**1. gRPC简介** gRPC 是一个高性能、开源和通用的远程过程调用(RPC)框架,由 Google开源并维护。它使用 Protocol Buffers(protobuf)作为接口定义语言(IDL),提供跨平台、跨语言的RPC调用支持。 **2. 准备工作** - 安装protoc 工具,下载预编译版。 - 编写 proto 文件,定义服务接口。 - 使用protoc 生成代码,生成服务端和客户端代码。 **3. 编写服务端代码示例** ```go package main import ( "context" "fmt" pb "github.com/mengbin92/hello/protos/hello" grpc "google.golang.org/grpc" ) func main() { // 创建grpc服务示例 sv := grpc.NewServer() // 注册我们的服务 pb.RegisterExampleServiceServer(sv, new(pb.HelloService)) // 绑定端口,提供服务 lis, err := net.Listen("tcp", ":50001") if err != nil { panic(err) } // 启动服务 sv.Serve(lis) } ``` **4. 实现客户端代码示例** ```go package main import ( "context" "fmt" pb "github.com/mengbin92/hello/protos/hello" grpc "google.golang.org/grpc" ) 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\\", resp.Message) } ```

正文

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为例,具体操作如下:

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文件

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服务,服务端代码如下:

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 实现客户端

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

go run client.go
# get response from server: hello world

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


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


与gRPC入门相似的内容:

gRPC入门

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

gRPC入门学习之旅(十)

gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发, gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。本系统文章详细描述了如何创建一...

gRPC入门学习之旅(九)

gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发, gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。本系统文章详细描述了如何创建一...

gRPC入门学习之旅(八)

gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发, gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。本系统文章详细描述了如何创建一...

Asp-Net-Core学习笔记:gRPC快速入门

## 前言 此前,我在做跨语言调用时,用的是 Facebook 的 Thrift,挺轻量的,还不错。 >Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码

[转帖]gRPC Load Balancing

https://www.cnblogs.com/charlieroro/p/14312362.html 翻译自:https://grpc.io/blog/grpc-load-balancing/ 这是gRPC负载均衡的第一篇,后续会给出基于golang XDS服务发现的例子,了解golang XDS

GRPC与 ProtoBuf 的理解与总结

转载请注明出处: 1.GRPC 官网:https://www.grpc.io/ gRPC 官方文档中文版:http://doc.oschina.net/grpc RPC 框架的目标就是让远程服务调用更加简单、透明,其负责屏蔽底层的传输方式(TCP/UDP)、序列化方式(XML/Json)和通信细节。

文盘Rust -- tonic-Rust grpc初体验

gRPC 是开发中常用的开源高性能远程过程调用(RPC)框架,tonic 是基于 HTTP/2 的 gRPC 实现,专注于高性能、互操作性和灵活性。该库的创建是为了对 async/await 提供一流的支持,并充当用 Rust 编写的生产系统的核心构建块。今天我们聊聊通过使用tonic 调用grpc的的具体过程。

gRPC vs. HTTP:网络通信协议的对比

## 概述 gRPC 和 HTTP 是两种常见的网络通信协议,用于在客户端和服务器之间进行通信。它们具有不同的特点和适用场景,下面对它们进行详细比较。 ## HTTP(Hypertext Transfer Protocol) ### 特点: 1. **简单易用**:HTTP 使用简单的请求方法和状态

gRPC如何保障数据安全传输

## 什么是 gRPC? gRPC 是由 Google 开发的高性能、开源的 RPC(Remote Procedure Call)框架,用于在客户端和服务器之间进行通信。它基于 Protocol Buffers(protobuf)进行消息序列化和反序列化,支持多种通信协议,如 HTTP/2、TCP