云原生应用开发之 gRPC 入门(下)

简介: gRPC 由谷歌开发的,是一种语言中立、平台中立、开源的远程调用过程。

添加一些功能


然后写一个客户端与前面的服务器进行交互,创建一个 client.proto 文件:

syntax = "proto3"; // 协议为proto3
package chat;
// 定义发送请求信息
message Message {
  // 定义发送的参数
  // 参数类型 参数名 标识号(不可重复)
  string body = 1;
}
// 定义我们的服务(可定义多个服务,每个服务可定义多个接口)
service ChatService {
  rpc SayHello(Message) returns (Message) {}
}

这个 .proto 文件公开了我们的 ChatService,它具有一个单独的 SayHello 函数,可以由任何用任何语言编写的 gRPC 客户端调用。


这些 .proto 定义通常在各种形状和大小的客户端之间共享,以便它们可以生成自己的代码来与我们的 gRPC 服务器通信。


让我们使用 protoc 工具生成 Go 特定的 gRPC 代码:

$ protoc --go_out=plugins=grpc:chat chat.proto


您会看到这将生成一个 chat/chat.pb.go 文件,该文件将包含生成的代码,以便我们在代码中轻松调用。让我们更新我们的 server.go 来注册我们的 ChatService,如下所示:

package main
import (
  "fmt"
  "log"
  "net"
  "github.com/tutorialedge/go-grpc-beginners-tutorial/chat"
  "google.golang.org/grpc"
)
func main() {
  fmt.Println("Go gRPC Beginners Tutorial!")
  lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 9000))
  if err != nil {
    log.Fatalf("failed to listen: %v", err)
  }
  s := chat.Server{}
  grpcServer := grpc.NewServer()
  chat.RegisterChatServiceServer(grpcServer, &s)
  if err := grpcServer.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %s", err)
  }
}

然后我们将必须定义 SayHello 方法,该方法将接收一条消息,读取消息的正文,然后返回它自己的消息:

package chat
import (
  "log"
  "golang.org/x/net/context"
)
type Server struct {
}
func (s *Server) SayHello(ctx context.Context, in *Message) (*Message, error) {
  log.Printf("Receive message body from client: %s", in.Body)
  return &Message{Body: "Hello From the Server!"}, nil
}

如果我们想为我们的 gRPC 服务器定义更高级的功能,那么我们可以通过定义一个基于我们的 Server 结构构建的新方法来实现,然后将该函数的名称添加到我们的 chat.proto 文件中,以便我们的应用程序可以将其公开为某种东西其他 gRPC 客户端可以访问。


完成这些最终更改后,让我们尝试运行我们的服务器:

$ go run server.go
Go gRPC Beginners Tutorial!

惊人的!我们现在在我们的机器上的 localhost:8000 上启动并运行了一个崭新的、闪亮的新 gRPC 服务器!


在 Go 中构建 gRPC 客户端

现在我们的服务器已经启动并运行了,让我们看看如何构建一个能够与之交互的简单客户端。更新一下 client.go 文件:

package main
import (
  "log"
  "golang.org/x/net/context"
  "google.golang.org/grpc"
  "github.com/tutorialedge/go-grpc-beginners-tutorial/chat"
)
func main() {
  var conn *grpc.ClientConn
  conn, err := grpc.Dial(":8000", grpc.WithInsecure())
  if err != nil {
    log.Fatalf("did not connect: %s", err)
  }
  defer conn.Close()
  c := chat.NewChatServiceClient(conn)
  response, err := c.SayHello(context.Background(), &chat.Message{Body: "Hello From Client!"})
  if err != nil {
    log.Fatalf("Error when calling SayHello: %s", err)
  }
  log.Printf("Response from server: %s", response.Body)
}

当我们运行它时,我们应该看到我们的客户端从服务器收到了一个非常好的 Hello 消息,如下所示:

$ go run client.go
2022/07/07 23:23:01 Response from server: Hello From the Server!

我们已经成功创建了一个非常简单的 gRPC 客户端,它现在可以与我们的新 gRPC 服务器通信!

总结

通过本文我们已经了解了如何在 Go 中构建一个简单的 gRPC 客户端和服务器。我们构建了一个基本服务器,它接受来自客户端的传入消息,然后向这些客户端返回响应。

相关文章
|
2月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
115 2
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门及实践
【10月更文挑战第39天】在数字化浪潮的推动下,云原生技术应运而生,它不仅仅是一种技术趋势,更是企业数字化转型的关键。本文将带你走进云原生的世界,从基础概念到实际操作,一步步揭示云原生的魅力和价值。通过实例分析,我们将深入探讨如何利用云原生技术提升业务灵活性、降低成本并加速创新。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
12天前
|
存储 NoSQL Cloud Native
MongoDB云原生化:为企业开发注入高效动力
MongoDB云原生化为企业开发注入高效动力,分为三部分:1. 介绍阿里云和MongoDB的服务;2. 阿里云MongoDB解决自建模型痛点的功能,包括隔离性、海量数据处理、弹性能力及运维操作优化;3. 客户案例展示。通过云原生架构,MongoDB实现了灵活的扩展、高效的备份恢复和快速的回档能力,显著提升了企业的业务迭代速度和数据管理效率。典型客户如吉比特、莉莉丝、掌阅等受益于这些功能,实现了更稳定和高效的数据库服务。
|
2月前
|
Kubernetes Cloud Native 开发者
通义灵码对云原生应用开发的支持
通义灵码是阿里巴巴云推出的一款强大的云原生应用开发工具,支持容器化、编排技术等,提供从Dockerfile生成、容器镜像构建与推送,到Kubernetes配置文件生成及与Kubernetes集群集成的全方位支持,极大简化了云原生应用开发流程,提升了开发效率和应用质量。
通义灵码对云原生应用开发的支持
|
1月前
|
Kubernetes Cloud Native API
云原生入门:从理论到实践的探索之旅
本文旨在为初学者提供一个关于云原生技术的全面介绍,包括其定义、核心原则、关键技术组件以及如何将这些概念应用于实际项目中。我们将通过一个简易的代码示例,展示如何在云原生环境下部署一个简单的应用,从而帮助读者更好地理解云原生技术的实践意义和应用价值。
|
1月前
|
运维 Cloud Native 开发者
云原生技术入门与实践
在云计算的浪潮中,云原生技术以其独特的优势和魅力吸引了越来越多的开发者和企业。本文将从云原生技术的基本概念、核心组件以及实际应用三个方面进行详细介绍,帮助读者更好地理解和掌握这一新兴技术。同时,文章还将分享一些实际案例和经验教训,让读者能够更深入地了解云原生技术的应用场景和发展趋势。
43 5
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。

热门文章

最新文章