零基础学习Go的Day17| 青训营笔记

93 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天

1.复习已学知识

  • 复习如何高质量编程知识
  • 复习性能优化的自动内存管理
  • 复习如何内存分配和对编译器的优化
  • 复习Go框架三件套中的Gorm框架

2.继续观看录播Go框架三件套详解(Web/RPC/ORM)

Kitex框架

老规矩我们先来了解什么是RPC,毕竟这是RPC的框架。 RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 所以说RPC是一种协议一套规范,用来远程过程调用的。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 至于怎么连接的细节,想了解的同学可以去找资料看下,这里不深究。

那我们为什么要用RPC呢? 其实这是应用开发到一定的阶段的强烈需求驱动的。如果我们开发简单的单一应用,逻辑简单、用户不多、流量不大,那我们用不着。当我们的系统访问量增大、业务增多时,我们会发现一台单机运行此系统已经无法承受。此时,我们可以将业务拆分成几个互不关联的应用,分别部署在各自机器上,以划清逻辑并减小压力。此时,我们也可以不需要RPC,因为应用之间是互不关联的。

当我们的业务越来越多、应用也越来越多时,自然的,我们会发现有些功能已经不能简单划分开来或者划分不出来。此时,可以将公共业务逻辑抽离出来,将之组成独立的服务Service应用 。而原有的、新增的应用都可以与那些独立的Service应用 交互,以此来完成完整的业务功能。 所以此时,我们急需一种高效的应用程序之间的通讯手段来完成这种需求,所以你看,RPC大显身手的时候来了!

其实描述的场景也是服务化 、微服务和分布式系统架构的基础场景。即RPC框架就是实现以上结构的有力方式。

常用的的RPC框架有很多,比如我们现在学的Kitex框架,gRPC,Spring cloud等等。

Kitex介绍

Kitex 是一个 RPC 框架,既然是 RPC,底层就需要两大功能:

  1. Serialization 序列化
  2. Transport 传输

Kitex 框架及命令行工具,默认支持 thriftproto3两种 IDL,对应的 Kitex 支持 thriftprotobuf两种序列化协议。传输上 Kitex 使用扩展的 thrift作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。IDL 全称是 Interface Definition Language,接口定义语言。

为什么要使用IDL定义服务与接口?

Kitex生成代码各级目录作用

怎么使用?、

安装这里我们就不说了,同学们可以自己去网上看下。

直接上代码,看看怎样建立服务器端和客户端并且开始调用:

编写 echo 服务逻辑

我们需要编写的服务端逻辑都在 handler.go 这个文件中,现在这个文件应该如下所示:

这里的 Echo函数就对应了我们之前在 IDL 中定义的 echo方法。

现在让我们修改一下服务端逻辑,让 Echo服务名副其实。

修改 Echo函数为下述代码:

编译运行

kitex 工具已经帮我们生成好了编译和运行所需的脚本:

  • 编译:
$ sh build.sh

执行上述命令后,会生成一个 output目录,里面含有我们的编译产物。

  • 运行:
$ sh output/bootstrap.sh

执行上述命令后,Echo服务就开始运行啦!

编写客户端

有了服务端后,接下来就让我们编写一个客户端用于调用刚刚运行起来的服务端。

  • 首先,同样的,先创建一个目录用于存放我们的客户端代码:
$ mkdir client
  • 进入目录:
$ cd client

创建一个 main.go 文件,然后就开始编写客户端代码了。

创建 client

首先让我们创建一个调用所需的 client

上述代码中,echo.NewClient 用于创建 client,其第一个参数为调用的 服务名,第二个参数为 options,用于传入参数,此处的 client.WithHostPorts 用于指定服务端的地址。

发起调用

接下来让我们编写用于发起调用的代码: 上述代码中,我们首先创建了一个请求 req, 然后通过 c.Echo 发起了调用。 其第一个参数为 context.Context,通过通常用其传递信息或者控制本次调用的一些行为,你可以在后续章节中找到如何使用它。 其第二个参数为本次调用的请求。 其第三个参数为本次调用的 options,Kitex 提供了一种 callopt机制,顾名思义——调用参数 ,有别于创建 client 时传入的参数,这里传入的参数仅对此次生效。 此处的 callopt.WithRPCTimeout 用于指定此次调用的超时(通常不需要指定,此处仅作演示之用)同样的,你可以在 *** 基础特性*** 一节中找到更多的参数。

发起调用

在编写完一个简单的客户端后,我们终于可以发起调用了。

你可以通过下述命令来完成这一步骤:

$ go run main.go

如果不出意外,你可以看到类似如下输出:

2021/05/20 16:51:35 Response({Message:my request})

恭喜你!至此你成功编写了一个 Kitex 的服务端和客户端,并完成了一次调用!## 发起调用

在编写完一个简单的客户端后,我们终于可以发起调用了。

你可以通过下述命令来完成这一步骤:

$ go run main.go

如果不出意外,你可以看到类似如下输出:

2021/05/20 16:51:35 Response({Message:my request})

恭喜你!至此你成功编写了一个 Kitex 的服务端和客户端,并完成了一次调用!

有了这次小小试手,相信你对Kitex框架已经有了初步的了解,接下来深入掌握就要靠你自己了。

补充小知识:

  • 什么是链式调用:说白了就是对象调用任何方法(除了节点关系方法)执行完后返回的就是对象自己。