Grpc微服务从零入门
什么是Grpc
gRPC是谷歌推出的一款高性能、开源的通用的 RPC 框架。其支持多种语言,并且可以运行在任何地方。gRPC 基于标准的HTTP / 2协议构建,并支持多种序列化和反序列化协议(protobuf、JSON)。这一点使得 gRPC 很适合分布式系统的构建,并可完美结合Kubernetes、Istio等云原生技术基础设施,更好地支持微服务的管理和维护。
Grpc的优点
- 接口定义简单协议缩小数据量,支持跨语言语义,易扩展性强
- 基于HTTP/2协议,支持双向流、流控、头部压缩等
- 支持多种语言(包括Java、Python、C#、Go等)
- 性能高,多语言阻塞与并发访问一致,支持客户端/服务端/双向流通信
- 支持负载均衡,服务发现等机制
- 已经被CNCF(云原生计算基金会)收录为云原生基础技术
Grpc的使用
下面让我们通过一个简单的示例来了解 Grpc 的使用:
安装
首先,我们需要安装相应的工具,比如Go语言中的grpc和protobuf,其中 protobuf 同样支持多种语言,这里我们以 Go 语言为例进行安装:
$ go get -u google.golang.org/grpc
$ go get -u github.com/golang/protobuf/protoc-gen-go
编写proto文件
接下来,我们需要定义我们的服务并生成相应的代码。我们先新建一个 hello.proto
文件,如下所示:
syntax = "proto3"; //使用的协议版本
package hello; //定义包名
// 定义服务接口
service HelloService {
// 定义一个SayHello方法,接收一个HelloRequest参数并返回一个HelloReply
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 定义HelloRequest请求参数结构体,包括一个name字段
message HelloRequest {
string name = 1;
}
// 定义HelloReply输出结果结构体,包括一个message字段
message HelloReply {
string message = 1;
}
生成代码
我们可以使用 protoc
工具来生成我们所需的代码,这里我们生成 Go 语言的代码:
$ protoc --go_out=plugins=grpc:. hello.proto
执行完命令后,会生成一个 hello.pb.go
的文件,其中就包含了我们的服务接口和请求/响应结构体。
编写服务端代码
接下来,我们需要实现我们的服务逻辑。在服务端代码中需要实现我们 hello.proto
文件中的 HelloService
接口,同时需要监听一个端口。
在 Go 语言中,服务端代码相对比较简单:
package main
import (
"context"
"log"
"net"
// 引入我们生成的代码
pb "github.com/myproject/hello"
"google.golang.org/grpc"
)
// 实现接口
type server struct {
}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("Received: %v", in.Name)
return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
func main() {
// 监听端口
lis, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// 创建服务并注册接口
s := grpc.NewServer()
pb.RegisterHelloServiceServer(s, &server{})
// 启动服务
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
编写客户端代码
服务端代码开发完成后,我们需要编写客户端代码进行测试。在客户端中,我们需要新建一个连接,并调用我们定义的接口方法来远程调用服务端。
Go 语言中的客户端代码如下:
package main
import (
"context"
"log"
// 引入我们生成的代码
pb "github.com/myproject/hello"
"google.golang.org/grpc"
)
func main() {
// 新建连接
conn, err := grpc.Dial(":8080", grpc.WithInsecure())
if err != nil {
log.Fatalf("Did not connect: %v", err)
}
defer conn.Close()
// 创建客户端
c := pb.NewHelloServiceClient(conn)
// 调用接口方法
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "World"})
if err != nil {
log.Fatalf("Error: %v", err)
}
log.Printf("Reply: %v", r.Message)
}
运行测试
我们可以先运行服务端的代码,并将其部署到服务器上。然后在本地创建一个客户端/demo文件,运行Go客户端代码即可。
总的来说,Grpc极大地简化和优化了微服务的架构构建和维护。相信随着云计算和云原生技术的发展,gRPC会越来越受到业界的青睐。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Grpc微服务从零入门 - Python技术站