云原生应用开发之 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 客户端和服务器。我们构建了一个基本服务器,它接受来自客户端的传入消息,然后向这些客户端返回响应。

相关文章
|
18天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
61 2
|
17天前
|
运维 Kubernetes Cloud Native
云原生技术入门及实践
【10月更文挑战第39天】在数字化浪潮的推动下,云原生技术应运而生,它不仅仅是一种技术趋势,更是企业数字化转型的关键。本文将带你走进云原生的世界,从基础概念到实际操作,一步步揭示云原生的魅力和价值。通过实例分析,我们将深入探讨如何利用云原生技术提升业务灵活性、降低成本并加速创新。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
13天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
18天前
|
Cloud Native 持续交付 云计算
云原生技术入门与实践
【10月更文挑战第37天】本文旨在为初学者提供云原生技术的基础知识和实践指南。我们将从云原生的概念出发,探讨其在现代软件开发中的重要性,并介绍相关的核心技术。通过实际的代码示例,我们展示了如何在云平台上部署和管理应用,以及如何利用云原生架构提高系统的可伸缩性、弹性和可靠性。无论你是云原生领域的新手,还是希望深化理解的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
|
18天前
|
存储 Cloud Native 持续交付
云原生入门:从理论到实践
【10月更文挑战第38天】云原生技术正在重塑软件开发和运维的面貌。本文将带你走进云原生的世界,理解其核心理念,并探索如何将这些理念应用于实际项目中。我们将一起学习容器化、微服务架构、持续集成与持续部署(CI/CD)等关键概念,并通过代码示例加深理解。无论你是云原生新手还是希望深化知识的开发者,这篇文章都将为你提供宝贵的知识和启示。
27 3
|
20天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的实践与思考
【10月更文挑战第35天】云原生技术,作为云计算的进阶形态,正引领着软件开发和运维的新潮流。本文将深入探讨云原生技术的核心理念、关键技术组件以及在实际项目中的应用案例,帮助读者理解如何利用云原生技术优化应用架构,提高开发效率和系统稳定性。我们将从容器化、微服务、持续集成/持续部署(CI/CD)等角度出发,结合实际代码示例,展现云原生技术的强大能力。
|
27天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
52 2
|
29天前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
1月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
46 3
|
1月前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!

热门文章

最新文章