GoLang -- gRPC框架四大服务

GoLang -- gRPC框架四大服务,第1张

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端 应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。名叫 proto3 的新风格的 protocol buffers,它拥有轻量简化的语法、一些有用的新功能,并且支持更多新语言。当前针对 Java 和 C++ 发布了 beta 版本,针对 JavaNano(即 Android Java)发布 alpha 版本,在protocol buffers Github 源码库里有 Ruby 支持, 在golang/protobuf Github 源码库里还有针对 Go 语言的生成器, 对更多语言的支持正在开发中。

有了 gRPC, 我们可以一次性的在一个 proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑—— gRPC 帮你解决了不同语言及环境间通信的复杂性使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新。

现在让我们来仔细了解一下当 gRPC 客户端调用 gRPC 服务端的方法时到底发生了什么。我们不究其实现细节,关于实现细节的部分,你可以在我们的特定语言页面里找到更为详尽的内容。

首先我们来了解一下最简单的 RPC 形式:客户端发出单个请求,获得单个响应。

服务端流式 RPC 除了在得到客户端请求信息后发送回一个应答流之外,与我们的简单例子一样。在发送完所有应答后,服务端的状态详情(状态码和可选的状态信息)和可选的跟踪元数据被发送回客户端,以此来完成服务端的工作。客户端在接收到所有服务端的应答后也完成了工作。

客户端流式 RPC 也基本与我们的简单例子一样,区别在于客户端通过发送一个请求流给服务端,取代了原先发送的单个请求。服务端通常(但并不必须)会在接收到客户端所有的请求后发送回一个应答,其中附带有它的状态详情和可选的跟踪数据。

双向流式 RPC ,调用由客户端调用方法来初始化,而服务端则接收到客户端的元数据,方法名和截止时间。服务端可以选择发送回它的初始元数据或等待客户端发送请求。 下一步怎样发展取决于应用,因为客户端和服务端能在任意顺序上读写 - 这些流的 *** 作是完全独立的。例如服务端可以一直等直到它接收到所有客户端的消息才写应答,或者服务端和客户端可以像"乒乓球"一样:服务端后得到一个请求就回送一个应答,接着客户端根据应答来发送另一个请求,以此类推。

通过运行下面的命令克隆并安装grpc-go代码库:

下载protobuf源码包

安装golang-protobuf

第一步使用 protocol buffers去定义 gRPC service 和方法 request 以及 response 的类型。

要定义一个服务,必须在proto 文件中指定 service:

然后在服务中定义 rpc 方法,指定请求的和响应类型,gRPC 允许定义4种类型的 service 方法。

服务proto文件如下所示:

前端框架越来越丰富,前后端分离已经是大多数软件团队采取的模式了。vue使用的场景也越来越多。
go本来使用template模板来进行前端的表现,现在可以用vue来分担很大一部分工作了。
通常直接使用go语言写后端,然后使用静态模板加载渲染前端,前端获取后端提供的数据是使用{{ }}符号,2个套在一起的花括号。这个也是vue使用的数据表现方式。
如果go+vue来协同工作的话,需要对vue进行一点设置。比如把{{ }}的方式改为[[ ]]的方式。
首先我们要知道,vue的使用,需要在页面中加载vuejs或vueminjs

纯静态网页使用vue是这样的(给个html例子)

然后我们实现一个go的简单web服务和模板页面

这个go服务器通过端口 1989 展示服务器页面,提供了一个静态文件路径 htmlpage,我们把vuejs和indexhtml文件都放置在htmlpage路径里。
go服务器还用模板给前台页面提供了一个News结构的数据,数据包括:Title,Content,Author的值。
在indexhtml页面中,加载vuejs的时候需要带上静态路径 htmlpage

在 new 一个 vue 变量的时候,必须有一句来设置包裹数据的符号,我们这里设置这个符号为[[ ]]

同时,所有需要由 vue 渲染的数据,都写成类似这样的样子

在 go + vue 方式下的完整模板文件 indexhtml

此页面中{{ }}包裹的数据是由go从后端提供的数据( 例如:{{Title}}),而[[ ]]包裹的数据,是vue渲染的数据。

只是把 Vue里的数据,改为由go后端提供即可。
好吧,作者已经在向月亮示爱了。呵呵 _
运行一下程序,看修改模板后的效果。

本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识。

您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的 *** 作等的类型和函数。

在本教程中,您将创建一个数据库,然后编写代码来访问该数据库。您的示例项目将是有关老式爵士乐唱片的数据存储库。



首先,为您要编写的代码创建一个文件夹。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:


在 Windows 上:


2、在命令提示符下,为您的代码创建一个名为 data-access 的目录。


3、创建一个模块,您可以在其中管理将在本教程中添加的依赖项。

运行go mod init命令,为其提供新代码的模块路径。


此命令创建一个 gomod 文件,您添加的依赖项将在其中列出以供跟踪。

注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径。有关更多信息,请参阅一下文章。

GO语言(二十五):管理依赖项(上)

GO语言(二十六):管理依赖项(中)

GO语言(二十七):管理依赖项(下)

接下来,您将创建一个数据库。

在此步骤中,您将创建要使用的数据库。您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据。

您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据。

这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能。

1、打开一个新的命令提示符。

在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示。


2、在mysql命令提示符下,创建一个数据库。


3、切到您刚刚创建的数据库,以便您可以添加表。


4、在文本编辑器的 data-access 文件夹中,创建一个名为 create-tablessql 的文件来保存用于添加表的 SQL 脚本。

将以下 SQL 代码粘贴到文件中,然后保存文件。


在此 SQL 代码中:

(1)删除名为album表。 首先执行此命令可以让您更轻松地稍后重新运行脚本。

(2)创建一个album包含四列的表:title、artist和price。每行的id值由 DBMS 自动创建。

(3)添加带有值的四行。

5、在mysql命令提示符下,运行您刚刚创建的脚本。

您将使用以下形式的source命令:


6、在 DBMS 命令提示符处,使用SELECT语句来验证您是否已成功创建包含数据的表。

接下来,您将编写一些 Go 代码进行连接,以便进行查询。

现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码。

找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求。

1、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序。

2、使用页面上的列表来识别您将使用的驱动程序。为了在本教程中访问 MySQL,您将使用 Go-MySQL-Driver。

3、请注意驱动程序的包名称 - 此处为githubcom/go-sql-driver/mysql

4、使用您的文本编辑器,创建一个用于编写 Go 代码的文件,并将该文件作为 maingo 保存在您之前创建的数据访问目录中。

5、进入maingo,粘贴以下代码导入驱动包。

在此代码中:

(1)将您的代码添加到main包中,以便您可以独立执行它。

(2)导入 MySQL 驱动程序githubcom/go-sql-driver/mysql。

导入驱动程序后,您将开始编写代码以访问数据库。

现在编写一些 Go 代码,让您使用数据库句柄访问数据库。

您将使用指向结构的指针sqlDB,它表示对特定数据库的访问。

编写代码

1、进入 maingo,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄。

在此代码中:

(3)使用 MySQL 驱动程序Config和FormatDSN类型以收集连接属性并将它们格式化为连接字符串的 DSN。

该Config结构使代码比连接字符串更容易阅读。

(4)调用sqlOpen 初始化db变量,传递 FormatDSN。

(5)检查来自 的错误sqlOpen。例如,如果您的数据库连接细节格式不正确,它可能会失败。

为了简化代码,您调用logFatal结束执行并将错误打印到控制台。在生产代码中,您会希望以更优雅的方式处理错误。

(6)调用DBPing以确认连接到数据库有效。在运行时, sqlOpen可能不会立即连接,具体取决于驱动程序。您在Ping此处使用以确认 database/sql包可以在需要时连接。

(7)检查来自Ping的错误,以防连接失败。

(8)Ping如果连接成功,则打印一条消息。

文件的顶部现在应该如下所示:

3、保存 maingo。

1、开始跟踪 MySQL 驱动程序模块作为依赖项。

使用go get 添加 githubcom/go-sql-driver/mysql 模块作为您自己模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。

2、在命令提示符下,设置Go 程序使用的DBUSER和DBPASS环境变量。

在 Linux 或 Mac 上:

在 Windows 上:


3、在包含 maingo 的目录中的命令行中,通过键入go run来运行代码。

连接成功了!

接下来,您将查询一些数据。

golang又称go语言是一种静态强类型、编译型语言,是一个开源编程环境,可以轻松构建简单、可靠和高效的软件。Go 语言语法与 C 相近,但功能上有:内存安全,GC,结构形态及 CSP-style 并发计算。

Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。

日常开发当中需要将golang的log包打印的日志同时输出到控制台和文件,应该如何解决这个问题?

log包可以通过SetOutput()方法指定日志输出的方式(Writer),但是只能指定一个输出的方式(Writer)。我们利用ioMultiWriter()将多个Writer拼成一个Writer使用的特性,把logPrintln()输出的内容分流到控制台和文件当中。

原文地址

本教程介绍 Go 中多模块工作区的基础知识。使用多模块工作区,您可以告诉 Go 命令您正在同时在多个模块中编写代码,并轻松地在这些模块中构建和运行代码。

在本教程中,您将在共享的多模块工作区中创建两个模块,对这些模块进行更改,并在构建中查看这些更改的结果。
本教程需要 go118 或更高版本。使用godev/dl中的链接确保您已在 Go 118 或更高版本中安装了 Go 。

首先,为您要编写的代码创建一个模块。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

在 Windows 上:
2、在命令提示符下,为您的代码创建一个名为工作区的目录。
3、初始化模块

我们的示例将创建一个hello依赖于 golangorg/x/example 模块的新模块。

创建你好模块:

使用 添加对 golangorg/x/example 模块的依赖项go get。
在 hello 目录下创建 hellogo,内容如下:
现在,运行 hello 程序:
在这一步中,我们将创建一个gowork文件来指定模块的工作区。

在workspace目录中,运行:

该go work init命令告诉为包含目录中模块的工作空间go创建一个文件 。gowork/hello

该go命令生成一个gowork如下所示的文件:

该gowork文件的语法与gomod相同。

该go指令告诉 Go 应该使用哪个版本的 Go 来解释文件。它类似于文件中的go指令gomod 。

该use指令告诉 Go在进行构建时hello目录中的模块应该是主模块。

所以在模块的任何子目录中workspace都会被激活。

2、运行工作区目录下的程序

在workspace目录中,运行:

Go 命令包括工作区中的所有模块作为主模块。这允许我们在模块中引用一个包,即使在模块之外。在模块或工作区之外运行go run命令会导致错误,因为该go命令不知道要使用哪些模块。

接下来,我们将golangorg/x/example模块的本地副本添加到工作区。然后,我们将向stringutil包中添加一个新函数,我们可以使用它来代替Reverse

在这一步中,我们将下载包含该模块的 Git 存储库的副本golangorg/x/example,将其添加到工作区,然后向其中添加一个我们将从 hello 程序中使用的新函数。

1、克隆存储库

在工作区目录中,运行git命令来克隆存储库:
2、将模块添加到工作区
该go work use命令将一个新模块添加到 gowork 文件中。它现在看起来像这样:
该模块现在包括examplecom/hello模块和 `golangorg/x/example 模块。

这将允许我们使用我们将在模块副本中编写的新代码,而不是使用命令stringutil下载的模块缓存中的模块版本。

3、添加新功能。

我们将向golangorg/x/example/stringutil包中添加一个新函数以将字符串大写。

将新文件夹添加到workspace/example/stringutil包含以下内容的目录:
4、修改hello程序以使用该功能。

修改workspace/hello/hellogo的内容以包含以下内容:

从工作区目录,运行

Go 命令在gowork文件指定的hello目录中查找命令行中指定的examplecom/hello模块 ,同样使用gowork文件解析导入golangorg/x/example。

gowork可以用来代替添加replace 指令以跨多个模块工作。

由于这两个模块在同一个工作区中,因此很容易在一个模块中进行更改并在另一个模块中使用它。

现在,要正确发布这些模块,我们需要发布golangorg/x/example 模块,例如在v010 这通常通过在模块的版本控制存储库上标记提交来完成。发布完成后,我们可以增加对 golangorg/x/example模块的要求hello/gomod:

这样,该go命令可以正确解析工作区之外的模块。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zz/13314673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-13
下一篇 2023-07-13

发表评论

登录后才能评论

评论列表(0条)

保存