Go云原生编程

您所在的位置:网站首页 golang任务编排 Go云原生编程

Go云原生编程

2023-03-20 21:41| 来源: 网络整理| 查看: 265

在计算和软件领域,我们几乎每周都会听到许多很酷的新技术和框架。他们中的一些人留下来并坚持下去,而另一些人没有通过时间的考验而消失了。不用说,云计算在前一类中处于非常有利的地位。我们生活在这样一个世界,云计算几乎可以为所有需要强大后端计算能力的东西提供能力,从物联网(物联网)设备(用于检查冰箱温度)到视频游戏(用于显示与多人游戏中的同龄人相比的分数的实时统计数据)。

云计算有利于在世界各地都有办公室的大型企业,以及两个人在咖啡馆编写代码的小型初创企业。关于云计算对现代信息技术如此重要的原因,有大量的资料。为了提高效率,我们将为这个问题提供一个直截了当的答案,而不涉及长要点、图表和冗长的段落。对于企业来说,这一切都是为了赚钱和节约成本。云计算大大降低了大多数组织的成本。这是因为云计算为您节省了构建自己的数据中心的成本。不需要购买昂贵的硬件,也不需要调试配备有高级空调系统的昂贵建筑。此外,几乎所有云计算产品都能让您只需支付所使用的费用,而无需支付更多费用。云计算还为软件工程师和 IT 管理员提供了巨大的灵活性,使他们能够快速高效地完成工作,从而实现开发人员的快乐和生产率的提高。

在本章中,我们将介绍以下主题:

云本地应用的设计目标,特别是可伸缩性 不同的云服务模型 十二要素应用 微服务架构 通信模式,尤其是同步与异步通信 为什么要去?

Go(或 Golang)是一种相对较新的编程语言,正风靡软件开发世界。它是由谷歌开发的,以促进其后端软件服务的建设。然而,现在许多企业和初创企业都在使用它来编写功能强大的应用。区别在于,它是从头开始构建的,旨在提供注定要与非常强大的语言(如 C/C++)竞争的性能,同时支持类似于 JavaScript 等动态语言的相对简单的语法。Go 运行时提供垃圾收集;然而,它并不依赖虚拟机来实现这一点。Go 程序被编译成本机代码。调用 Go 编译器时,只需选择构建时希望二进制文件运行的平台类型(Windows、Mac 等)。然后,编译器将生成一个在该平台上工作的二进制文件。这使得 Go 能够交叉编译和生成本机二进制文件。Go 非常适合于微服务架构,我们将在未来看到很多。微服务架构是一种架构,在这种架构中,您可以将应用的职责划分为只关注特定任务的较小服务。然后,这些服务可以相互通信,以获得产生结果所需的信息。Go 是一种新的编程语言,是在云计算时代开发的,并且考虑到了现代软件技术。Go 针对便携式微服务架构进行了优化,因为 Go 程序大多编译为单个二进制文件,因此生产环境中几乎不需要依赖项和虚拟机。Go 也是集装箱技术的先驱。Docker是软件容器中的顶级名称,它是用 Go 编写的。由于 Go 的流行,主要云提供商以及第三方贡献者正在努力确保 Go 获得不同云平台所需的 API 支持。

本书的目标是在 Go 编程语言和现代计算的云技术之间建立知识桥梁。在本书中,您将获得 Go 微服务架构、消息队列、容器、云平台 Go API、SaaS 应用设计、监控云应用等方面的实用知识。

基本设计目标

为了充分利用现代云平台的优点,我们需要在开发应在这些平台上运行的应用时考虑它们的特性。

云应用的主要设计目标之一是**可扩展性****。**一方面,这意味着根据需要增加应用的资源,以便有效地为所有用户服务。另一方面,这也意味着当你不再需要资源时,将资源缩减到适当的水平。这使您能够以经济高效的方式运行应用,而不必为峰值工作负载不断提供过多的资源。

为了实现这一点,典型的云部署通常使用承载应用的小型虚拟机实例,并通过添加(或删除)更多这些实例进行扩展。这种扩展方法称为水平扩展或向外扩展——与垂直扩展或向上扩展相反,您不会增加实例数量,而是为现有实例提供更多资源。由于几个原因,水平缩放通常优于垂直缩放。首先,水平伸缩保证了无限的线性伸缩性。另一方面,垂直扩展也有其局限性,因为可以添加到现有服务器的资源数量不能无限增长。其次,横向扩展通常更具成本效益,因为您可以使用廉价的商品硬件(或者在云环境中,使用较小的实例类型),而大型服务器通常会以指数级的速度增长,成本会更高。

水平标度与垂直标度;第一种方法通过添加更多实例并在它们之间平衡负载来工作,而第二种方法通过向现有实例添加更多资源来工作

所有主要的云提供商都能够根据应用当前的资源利用率自动执行水平扩展。此功能称为自动缩放。不幸的是,您不能免费获得水平可伸缩性。为了能够扩展,您的应用需要遵循一些非常重要的设计目标,这些目标通常需要从一开始就考虑,如下所示:

无状态:云应用的每个实例都不应该有任何类型的内部状态(意味着任何类型的数据都会保存在内存或文件系统中以备将来使用)。在扩展场景中,后续请求可能由应用的另一个实例提供服务,因此,不能依赖于先前请求中存在的任何类型的状态。为了实现这一点,通常需要将任何类型的持久性存储(如数据库和文件系统)外部化。数据库服务和文件存储通常都由您在应用中使用的云提供商作为托管服务提供。

当然,这并不意味着不能将有状态的应用部署到云中。它们将更难扩展,阻碍您充分利用云计算环境的潜力。

易于部署:扩展时,您需要快速部署应用的新实例。创建一个新实例不需要任何类型的手动设置,但应该尽可能地自动化(理想情况下完全自动化)。 **弹性:**在云环境中,尤其是使用自动缩放时,实例可能会在一接到通知后立即关闭。此外,大多数云提供商并不保证在单个实例上具有极高的可用性(并建议进行扩展,可以选择跨多个可用性区域)。因此,在云环境中,终止和突然死亡(无论是有意的,在自动扩展的情况下,还是无意的,在失败的情况下)是我们始终需要期待的事情,应用必须相应地处理它。

实现这些设计目标并不总是容易的。云提供商通常通过提供托管服务(例如,分布式文件存储的高度可扩展数据库服务)来支持您完成此任务,否则您将不得不担心自己。关于您的实际应用,有一种十二因素应用方法(我们将在后面的章节中详细介绍),它描述了构建可伸缩和弹性应用的一组规则。

云服务模型

当谈到云计算产品时,你的项目有三种主要的服务模式:

IaaS(基础设施即服务):这是云服务提供商允许您访问云上基础设施的模式,如服务器(虚拟和裸机)、网络、防火墙和存储设备。当您只需要云提供商为您管理基础设施,并将维护基础设施的麻烦和成本从您手中解放出来时,您就可以使用 IaaS。IaaS 用于希望完全控制其应用层的初创公司和组织。大多数 IaaS 产品都提供了动态或弹性扩展选项,可以根据您的消费量扩展您的基础架构。这实际上节省了组织的成本,因为他们只为自己使用的东西付费。 PaaS(平台即服务):这是 IaaS 的下一层。PaaS 提供了运行应用所需的计算平台。PaaS 通常包括开发应用所需的操作系统、数据库、web 层(如果需要)和编程语言执行环境。使用 PaaS,您不必担心应用环境的更新和补丁;它由云提供商负责。假设您编写了一个功能强大的.NET 应用,希望看到它在云中运行。PaaS 解决方案将提供运行应用所需的.NET 环境,并结合 Windows server 操作系统和 IIS web 服务器。它还将负责更大应用的负载平衡和扩展。想象一下,通过采用 PaaS 平台而不是在内部进行这项工作,您可以节省多少资金和精力。 SaaS(软件即服务):这是您可以作为云解决方案获得的最高层产品。SaaS 解决方案是指通过 web 交付功能齐全的软件。您可以从 web 浏览器访问 SaaS 解决方案。SaaS 解决方案通常由软件的常规用户使用,而不是程序员或软件专业人员。SaaS 平台的一个非常著名的例子是 Netflix,它是一个托管在云中的复杂软件,您可以通过 web 访问它。另一个流行的例子是 Salesforce。Salesforce 解决方案通过 web 浏览器快速高效地交付给客户。 云应用架构模式

通常,开发在云环境中运行的应用与常规应用开发没有太大区别。但是,在针对云环境时,有一些架构模式特别常见,您将在下一节中学习。

十二要素应用

12 因素应用方法是一套用于构建可伸缩和弹性云应用的规则。它由 Heroku 发布,Heroku 是 PaaS 的主要提供商之一。但是,它可以应用于各种云应用,独立于具体的基础设施或平台提供商。它还独立于编程语言和持久性服务,同样可以应用于 Go 编程,例如 Node.js 编程。十二因素 APP 方法描述(毫不奇怪)十二个因素,您应该考虑在您的应用,使之易于扩展,弹性,和平台无关。您可以在上阅读每个因素的完整描述 https://12factor.net 。在本书中,我们将强调一些我们认为特别重要的因素:

因素 II:依赖项显式声明和隔离依赖项:这个因素值得特别提及,因为它在 Go 编程中实际上没有在其他语言中那么重要。通常,云应用永远不应该依赖系统上已经存在的任何必需的库或外部工具。应明确声明依赖项(例如,使用 Node.js 应用的 npmpackage.json文件),以便包管理器在部署应用的新实例时可以提取所有这些依赖项。在 Go 中,应用通常部署为静态编译的二进制文件,其中已经包含所有必需的库。然而,即使是 Go 应用也可能依赖于外部系统工具(例如,它可以分叉到ImageMagick等工具)或现有的 C 库。理想情况下,您应该在应用旁边部署这些工具。这就是集装箱引擎,如 Docker,发挥作用的地方。*** 因素三:环境中的配置存储配置:配置是任何类型的数据,可能因不同的部署而有所不同,例如,外部服务和数据库的连接数据和凭据。这些类型的数据应该通过环境变量传递给应用。在 Go 应用中,检索这些数据就像调用os.Getenv ("VARIABLE_NAME")一样简单。在更复杂的情况下(例如,当您有许多配置变量时),您也可以求助于库,例如github.com/tomazk/envcfg或github.com/caarlos0/env。对于重物搬运,您可以使用github.com/spf13/viper库。* 因素四:支持服务将支持服务视为附加资源:确保应用所依赖的服务(如数据库、消息传递系统或外部 API)可通过配置轻松交换。例如,您的应用可以接受一个环境变量,例如DATABASE_URL,该变量可能包含用于本地开发部署的mysql://root:root@localhost/test和生产设置中的mysql://root:[email protected]。* 因素六:进程作为一个或多个无状态进程执行应用:运行的应用实例应该是无状态的;任何应该在单个请求/事务之外持久化的数据都需要存储在外部持久化服务中。需要记住的一个重要案例是 web 应用中的用户会话。通常,用户会话数据存储在进程的内存中(或持久化到本地文件系统),以期望同一用户的后续请求将由应用的同一实例提供服务。相反,尝试保持用户会话无状态,或将会话状态移动到外部数据存储中,如Redis或Memcached。* 因素九:可处置性最大化快速启动和正常关闭的稳健性:在云环境中,需要预期突然终止(例如,在规模缩小时有意终止,在故障时无意终止)。12 因素应用应该具有快速启动时间(通常在几秒钟的范围内),允许它快速部署新实例。此外,快速启动和优雅终止是另一个要求。当服务器关闭时,操作系统通常会通过发送SIGTERM信号通知您的应用关闭,应用可以相应地捕获并响应该信号(例如,停止侦听服务端口,完成当前正在处理的请求,然后退出)。* 因子 XI:日志将日志视为事件流:日志数据通常用于调试和监视应用的行为。然而,一个 12 因素应用不应该关心自己的日志数据的路由或存储。最简单的解决方案是简单地将日志流写入流程的标准输出流(例如,仅使用fmt.Println(...))。将事件流传输到stdout允许开发人员在开发应用时只需在控制台上观看事件流。在生产设置中,您可以配置执行环境以捕获流程输出,并将日志流发送到可以处理它的地方(这里的可能性是无限的,您可以将它们存储在服务器的日志中),将它们发送到 syslog 服务器,将日志存储在 ELK 设置中,或将它们发送到外部云服务)。** 什么是微服务?

当一个应用由许多不同的开发人员在较长的时间内维护时,它往往会变得越来越复杂。错误修复、新的或不断变化的需求以及不断的技术变化会导致软件不断增长和变化。如果不进行检查,这种软件演变将导致您的应用变得更加复杂,并且越来越难以维护。

防止这种软件侵蚀是过去几年中出现的微服务架构范例的目标。在微服务架构中,软件系统被划分为一组(可能有很多)独立和隔离的服务。这些服务作为单独的进程运行,并使用网络协议进行通信(当然,这些服务本身应该是一个 12 因素应用)。为了更全面地介绍该主题,我们可以推荐 Lewis 和 Fowler 在上发表的关于微服务架构的原始文章 https://martinfowler.com/articles/microservices.html 。

与传统的面向服务架构(SOA)相比,微服务架构注重简单性。不惜一切代价避免使用复杂的基础设施组件(如 ESB),而不是复杂的通信协议(如 SOAP),更简单的通信方式(如 REST web 服务)(关于这一点,您将在[第 2 章] 02.html)、使用 REST API 构建微服务或 AMQP 消息传递中了解更多)(参考[第 4 章](04.html

将复杂的软件拆分为单独的组件有几个好处。例如,可以在不同的技术堆栈上构建不同的服务。对于一个服务,使用 Go 作为运行时和 MongoDB 作为持久层可能是最佳选择,而对于其他组件来说,具有 MySQL 持久性的 Node.js 运行时可能是更好的选择。将功能封装在单独的服务中,允许开发团队为正确的工作选择正确的工具。微服务在组织层面上的其他优势是,每个微服务都可以由组织内的不同团队拥有。每个团队都可以独立开发、部署和操作他们的服务,允许他们以非常灵活的方式调整软件。

部署微服务

微服务专注于无状态和水平扩展,能够很好地与现代云环境配合使用。然而,在选择微服务架构时,部署应用总体上会变得更加复杂,因为您需要部署更多不同的应用(这就更需要坚持 12 因素应用方法)。

但是,每个单独的服务都比大型单片应用更易于部署。根据服务的大小,将服务升级到新的运行时或完全用新的实现替换它也会更容易。此外,您还可以单独扩展每个微服务。这使您能够扩展应用中使用率较高的部分,同时使使用率较低的组件保持经济高效。当然,这要求每个服务都支持水平扩展。

当不同的服务使用不同的技术时,部署微服务(可能)会变得更加复杂。现代容器运行时(如 Docker 或 RKT)为这个问题提供了一个可能的解决方案。使用容器,您可以将应用及其所有依赖项打包到容器映像中,然后使用该映像在任何可以运行 Docker(或 RKT)容器的服务器上快速生成运行您的应用的容器。(让我们回到十二要素应用在容器中部署应用是要素 II规定的依赖隔离最彻底的解释之一。)

运行容器工作负载是许多主要云提供商提供的服务(如 AWS 的弹性容器服务、Azure 容器服务或谷歌容器引擎)。除此之外,还有一些容器编排引擎,如Docker Swarm、Kubernetes或Apache Mesos,您可以在 IaaS 云平台或自己的硬件上推出。这些编排引擎提供了将容器工作负载分布到整个服务器集群的可能性,并提供了非常高的自动化程度。例如,集群管理器将负责跨任意数量的服务器部署容器,并根据其资源需求和使用情况自动分发容器。许多编排引擎还提供自动缩放功能,并且通常与云环境紧密集成。

您将在[第 6 章] 06.html

RESTWeb 服务和异步消息传递

在构建微服务架构时,您的各个服务需要相互通信。一个被广泛接受的事实上的微服务通信标准是 RESTful web 服务(您将在[第 2 章] 02.html)、使用 Rest API 构建微服务和[第 3 章](03.html

同步与异步通信模型

这种架构通常易于实现和维护。它适用于许多用例。但是,当您使用跨多个服务的复杂进程实现系统时,同步请求/应答模式可能会达到其极限。考虑前面图表的第一部分。这里,我们有一个管理应用用户数据库的用户服务。无论何时创建新用户,我们都需要确保系统中的其他服务也知道这个新用户。使用 RESTful HTTP,用户服务需要通过 REST 调用通知这些其他服务。这意味着用户服务需要知道以某种方式受用户管理域影响的所有其他服务。这会导致组件之间的紧密耦合,这是您通常希望避免的。

可以解决这些问题的另一种通信模式是发布/订阅模式。在这里,服务发出其他服务可以监听的事件。发出事件的服务不需要知道哪些其他服务正在实际侦听这些事件。再次,考虑前面的图的第二部分,用户服务发布一个事件,说明刚刚创建了一个新用户。其他服务现在可以订阅此事件,并在创建新用户时收到通知。这些架构通常需要使用一个特殊的基础结构组件:MessageBroker。此组件接受已发布的消息并将其路由到订阅者(通常使用队列作为中间存储)。

发布/订阅模式是一种很好的方法,可以将服务彼此分离。当一个服务发布事件时,它不需要关心它们将去哪里,当另一个服务订阅事件时,它也不知道它们来自哪里。此外,异步架构往往比具有同步通信的架构扩展得更好。通过向多个订户分发消息,可以轻松实现水平扩展和负载平衡。

不幸的是,没有免费的午餐;这种灵活性和可扩展性需要额外的复杂性。此外,跨多个服务调试单个事务也变得很困难。您是否可以接受这种权衡需要根据具体情况进行评估。

在[第 4 章] 04.html

MyEvents 平台

在本书中,我们将构建一个名为MyEvents的有用 SaaS 应用。MyEvents 将利用您将要学习的技术,以成为一个现代化、可扩展、云本机且快速的应用。MyEvents 是一个活动管理平台,允许用户预订世界各地活动的门票。有了 MyEvents,您可以为自己和同事预订音乐会、嘉年华、马戏团等的门票。MyEvents 将记录预订、用户以及活动发生的不同地点。它将有效地管理您的预订。

我们将利用微服务、消息队列、ReactJS、MongoDB、AWS 等构建 MyEvents。为了更好地理解应用,让我们来看看我们的整个应用将管理的逻辑实体。它们将由多个微服务进行管理,以建立清晰的关注点分离,并实现我们所需的灵活性和可扩展性:

我们将有多个用户;每个用户可以有多个事件预订,每个预订对应一个事件。对于我们的每一项活动,都会有一个位置来进行活动。在位置内,我们需要确定活动发生的大厅或房间。

现在,让我们来看看微服务架构和组成我们的应用的不同组件:

微服务架构

我们将使用 ReactJS 前端与应用的用户进行交互。ReactJSUI 将使用 API 网关(AWS 或本地)与构成应用主体的不同微服务进行通信。有两个主要的微服务代表 MyEvents 的逻辑:

事件服务:这是处理事件、事件位置以及事件发生的变化的服务 预订服务:该服务处理用户的预订

我们的所有服务都将使用基于消息队列的发布/订阅架构进行集成。由于我们的目标是为您提供微服务和云计算领域的实用知识,因此我们将支持多种类型的消息队列。我们将支持 AWS 的卡夫卡、拉比特 MQ和SQS。

持久化层还将支持多种数据库技术,以便让您接触到各种实用的数据库引擎,从而增强您的项目。我们将支持MongoDB和DynamoDB。

我们的所有服务都将支持 metrics API,这将允许我们通过Prometheus监控我们服务的统计数据。MyEvents 平台的设计将建立强大的知识基础,并接触强大的微服务和云计算世界。

总结

在本介绍性章节中,您了解了云本机应用开发的基本设计原则。这包括设计目标,如支持(水平)可伸缩性和弹性,以及架构模式,如十二要素应用和微服务架构。

在接下来的章节中,您将学习在构建 MyEvents 应用时应用这些原则。在[第 2 章] 02.html

文章列表 Go云原生编程-Go 云原生编程 Go云原生编程-一、现代微服务架构 Go云原生编程-七、AWS I—基础知识、AWS Go SDK 和 EC2 Go云原生编程-三、保护微服务 Go云原生编程-九、持续交付 Go云原生编程-二、使用 RESTAPI 构建微服务 Go云原生编程-五、使用 React 构建前端 Go云原生编程-八、AWS II—S3、SQS、API 网关和 DynamoDB Go云原生编程-六、在容器中部署应用 Go云原生编程-十、监视应用 Go云原生编程-十一、迁移 Go云原生编程-十二、从这里到哪里去? Go云原生编程-四、使用消息队列的异步微服务架构 Go云原生编程-零、前言


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3