Go语言程序开发gRPC服务

yizhihongxing

Go语言程序开发gRPC服务的完整攻略

什么是gRPC

gRPC是一种高性能、通用的开源RPC框架,其目标是将客户端和服务端应用程序连接在一起,使得在任何地方、任何语言中都可以轻松地基于标准化的协议通信。可以轻松的进行快速的开发和强大的服务的构建,以提供跨平台和跨系统的功能调用,可以使得开发人员更轻松地创建分布式应用程序。

gRPC的工作原理

gRPC使用Google开发的ProtoBuf作为数据传输格式,客户端和服务端声明protobuf类型,gRPC会生成对应的服务端和客户端代码。客户端从protobuf文件自动生成类型安全的调用,gRPC处理连接、负载均衡、错误信息等细节。

gRPC的优点

  1. 高性能:gRPC基于HTTP/2协议进行通信,支持多路复用、流、压缩头等功能,可大大提高通信性能。
  2. 多语言支持:gRPC支持多种语言,如Go、Java、Python等。
  3. 自动生成代码:gRPC可以根据.proto文件,自动化生成客户端和服务器端代码。
  4. 面向服务设计:gRPC是基于微服务架构的设计,支持对服务进行版本控制、部署和后期维护。
  5. 双向流:gRPC支持双向流传输(Stream),客户端和服务端可以同时发送和接收消息。

Go语言程序开发gRPC服务的过程

Go语言中开发gRPC服务的过程分为以下几个步骤:

  1. 使用proto3语法定义服务(.proto文件)。
  2. 使用protoc命令生成Go代码。
  3. 实现服务端和客户端代码。
  4. 运行和测试gRPC服务。

步骤1:使用proto3语法定义服务

定义服务信息,这里以定义一个UserService为例。

syntax = "proto3";

package user;

service UserService {
    rpc CreateUser(User) returns (Result) {}
    rpc GetUser(UserID) returns (User) {}
}

message User {
    string Name = 1;
    int32 Age = 2;
}

message UserID {
    int32 ID = 1;
}

message Result {
    int32 Code = 1;
    string Message = 2;
}

步骤2:使用protoc命令生成Go代码

安装protobuf。

go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go

生成Go代码。

protoc -I . --go_out=plugins=grpc:. ./*.proto

步骤3:实现服务端和客户端代码

服务端

package main

import (
   "context"
   "fmt"
   "grpc-demo/pb/user"
   "log"
   "net"
   "google.golang.org/grpc"
)

const (
   port = ":50051"
)

type server struct{}

func (s *server) CreateUser(ctx context.Context, in *user.User) (*user.Result, error) {
   fmt.Printf("CreateUser: %v\n", in)
   return &user.Result{Code: 200, Message: "OK"}, nil
}

func (s *server) GetUser(ctx context.Context, in *user.UserID) (*user.User, error) {
   fmt.Printf("GetUser: %v\n", in)
   u := &user.User{Name: "test", Age: 26}
   return u, nil
}

func main() {
   lis, err := net.Listen("tcp", port)
   if err != nil {
       log.Fatalf("failed to listen: %v", err)
   }
   s := grpc.NewServer()
   user.RegisterUserServiceServer(s, &server{})
   if err := s.Serve(lis); err != nil {
       log.Fatalf("failed to serve: %v", err)
   }
}

客户端

package main

import (
   "context"
   "fmt"
   "grpc-demo/pb/user"
   "log"
   "time"
   "google.golang.org/grpc"
)

const (
   address = "localhost:50051"
)

func createUser(c user.UserServiceClient) {
   u := &user.User{Name: "test", Age: 26}
   r, _ := c.CreateUser(context.Background(), u)
   fmt.Printf("createUser: %v\n", r)
}

func getUser(c user.UserServiceClient) {
   uid := &user.UserID{ID: 123}
   u, _ := c.GetUser(context.Background(), uid)
   fmt.Printf("getUser: %v\n", u)
}

func main() {
   conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithTimeout(1*time.Second))
   if err != nil {
       log.Fatalf("failed to connect: %v", err)
   }
   defer conn.Close()
   c := user.NewUserServiceClient(conn)
   createUser(c)
   getUser(c)
}

步骤4:运行和测试gRPC服务

启动服务端。

go run server.go

运行客户端。

go run client.go

以上便是完整的Go语言程序开发gRPC服务的攻略。

示例说明

这里提供两个示例,一个是定义UserService服务,一个是定义ProductService服务。

示例1:定义UserService服务

syntax = "proto3";

package user;

service UserService {
    rpc CreateUser(User) returns (Result) {}
    rpc GetUser(UserID) returns (User) {}
}

message User {
    string Name = 1;
    int32 Age = 2;
}

message UserID {
    int32 ID = 1;
}

message Result {
    int32 Code = 1;
    string Message = 2;
}

在服务端实现CreateUser和GetUser两个方法,客户端实现对应的调用方法。

示例2:定义ProductService服务

syntax = "proto3";

package product;

service ProductService {
    rpc GetProduct(ProductID) returns (Product) {}
    rpc ListProduct(ListRequest) returns (ProductList) {}
}

message Product {
    int32 ID = 1;
    string Name = 2;
    int32 Price = 3;
}

message ProductID {
    int32 ID = 1;
}

message ListRequest {
    int32 Page = 1;
    int32 Size = 2;
}

message ProductList {
    repeated Product Items = 1;
}

在服务端实现GetProduct和ListProduct两个方法,客户端实现对应的调用方法。

这里只是简单提供了protobuf文件和服务端、客户端的代码,更完整的代码可以参考我的博客文章:Go语言gRPC服务开发入门

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言程序开发gRPC服务 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python内置模块hashlib、hmac与uuid用法分析

    Python内置模块hashlib、hmac与uuid用法分析 简介 Python内置模块hashlib、hmac和uuid是常用的密码学和唯一标识符相关的模块。本文将分别介绍它们的用法。 hashlib hashlib模块提供了多种编码算法,包括MD5、SHA1、SHA224、SHA256、SHA384、SHA512等。可以用于加密密码、生成消息摘要等。 …

    python 2023年6月2日
    00
  • python+opencv识别图片中的圆形

    Python+OpenCV识别图片中的圆形 本文讲解如何使用Python和OpenCV库对图片中的圆形进行识别和定位。 准备工作 在开始编写代码前,需要先安装Python和OpenCV库: # 安装Python sudo apt-get install python # 安装OpenCV库 pip install opencv-python 加载图片 在Op…

    python 2023年5月18日
    00
  • Python爬取城市租房信息实战分享

    Python爬取城市租房信息实战分享 1. 概述 本篇文章将介绍如何使用Python语言爬取城市租房信息的过程。本文使用的是Python 3.x版本和requests库、BeautifulSoup库和pandas库等。 具体的操作包括向目标网站发送HTTP请求,解析响应内容,提取目标数据和存储数据等步骤。 2. 准备工作 在开始爬虫之前,需要安装相应的库和软…

    python 2023年5月14日
    00
  • 浅析Python3爬虫登录模拟

    让我来详细讲解一下“浅析Python3爬虫登录模拟”这篇文章的完整攻略。本攻略主要分为以下几个部分: 1. 爬虫登录的基本原理 在爬虫爬取一些需要登录的网站时,我们需要模拟登录来获得登录后才能访问的网页以及其他数据。爬虫登录的基本原理就是通过发送HTTP请求模拟登录网站,记录下登录后的cookie,并在后续的请求中携带这个cookie来模拟登录状态,从而爬取…

    python 2023年5月14日
    00
  • python启动应用程序和终止应用程序的方法

    当我们在编写Python应用程序时,需要对程序进行启动和终止的控制。以下是Python启动和终止应用程序的方法: 启动应用程序 1.使用os.system函数启动应用程序 在Python中,我们可以使用os.system函数来启动一个应用程序。这个函数会在操作系统中启动一个新的进程,并且运行指定的命令行。例如,下面的代码可以启动Windows中的记事本应用程…

    python 2023年6月2日
    00
  • Python爬虫程序架构和运行流程原理解析

    Python爬虫程序架构和运行流程原理解析 概述 Python爬虫程序的架构和运行流程大致可以分为以下几个步骤: 确定爬取目标:首先我们需要确定需要爬取的目标,例如一个网站,或者一个特定的页面。 编写爬虫程序:接下来我们需要编写爬虫程序,通过代码实现模拟浏览器访问页面,提取页面中我们想要的数据。 数据处理和存储:从页面中提取到的数据需要进行处理和存储,以方便…

    python 2023年5月14日
    00
  • pytorch 如何查看数据类型和大小

    在 PyTorch 中,可以使用 .dtype 和 .size() 两个函数来查看数据类型和大小。下面是具体的步骤: 查看数据类型 可以使用 .dtype 函数来查看 Tensor 的数据类型,具体步骤如下: 通过加载PyTorch库和创建一个张量,如下代码所示: import torch x = torch.ones(2, 3) 这里创建了一个大小为 $2…

    python 2023年6月2日
    00
  • Python数据结构与算法中的队列详解(2)

    Python数据结构与算法中的队列详解(2) 在上一篇文章中,我们介绍了队列的基本概念和操作。在本篇文章中,我们将更深入地探讨队列的应用和实现。 队列的应用 队列是一种常用的数据结构,它在计算机科学中有着广泛的应用。下面是一些队列的应用场景: 1. 消息队列 消息队列是一种常用的通信模式,它可以在不同的进程或线程之间传递消息。在消息队列中,消息被添加到队列的…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部