目前国内有哪些有卡贴但是显示无服务务架构实现

急!!无服务端模型的架构,只用客户端,实现全面的通信,大家有什么好的思路没?_百度知道
急!!无服务端模型的架构,只用客户端,实现全面的通信,大家有什么好的思路没?
大二了,软件专业,想自主创业,
最近在做一通讯软件,类似QQ那样的即时通,再整合其它一些更强大的功能,
辅助电脑的维护,文件的共享、管理等等。。。
但在初期,不可能买得起服务器,我当前的做法是这样的:
客户端:Client Socket
Server So...
我有更好的答案
做好的话 让我做试验者 软件发到 谢了哦
哈,谢谢支持了,等发行版出来,可能还要一个把月吧,到时欢迎您提出宝贵意见!~
记得就行 不怕久!
呵~ 你有擅长这方面的朋友么,也帮忙出出主意啊...
没有= = 呵呵 帮不了你
采纳率:16%
为您推荐:
其他类似问题
您可能关注的内容
架构的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。赞助商链接
该文讨论了无服务器架构的演变,帮助你了解它是如何工作的以及最佳实践和可用的框架。无服务器架构风格挑战了软件设计和部署的现状,它能实现最佳开发效率、提高系统运营和管理节省开销。虽然它继承了微服务架构(MSA)的基本概念,但它是当前架构模式的最前沿,实现了最低水平的硬件空闲可能。尽管它是一个显着的进步,但是采取它以及适应它将需要一个周密的研究过程,需要精确将企业解决方案要求映射到无服务器计算上。下面我们看看无服务器架构的演变,最初我们是直接将软件系统部署运行在物理机器上,但是这种部署在物理服务器上的初始实现并不能最佳地利用底层硬件的计算能力,因为在指定时间内只能有一个操作系统实例运行。后来,认识到计算资源具有时间上的共享能力之后,在相同硬件上同时运行多个计算机(虚拟主机/云主机)能够在CPU和I / O操作之间来回切换。这种技术的演进导致了行业中的许多创新,最重要的是云的诞生。此时,虚拟机是用于部署软件并隔离计算环境的,是一种易于管理,可扩展和可编程的单元。Linux容器技术出现在2006年左右,当时Google实现了符合Linux内核特性的控制组(control groups)。Linux容器自那时以来一直存在。然而,只有大规模的、技术上超越的企业,如谷歌才能够用到它的规模性。在2012年,微服务架构的概念由一组软件架构师在欧洲引入。在2013年晚些时候,Docker巧妙地填补了容器生态系统中的可访问性,可用性和支持服务的空白,因此,容器开始变得流行起来。Linux容器打开了一个新的视野,将大型单片系统分解成独立的自包含服务,并以细粒度的资源利用来执行它们。为了加快这些进展, 容器集群管理系统(如Kubernetes和Mesosphere)在同一时期开始提供端到端的容器即服务(CaaS)能力。2015年晚些时候,AWS通过引入AWS Lambda实现了另一个飞跃,这可以通过按需运行微服务进一步节省软件部署成本,并在无负载时停止。该概念类似于节能车辆中的停止 - 启动特征,在停车时能够自动熄火,自动关闭内燃机以降低燃料消耗。Serverless是如何工作的?尽管术语“无服务器”乍一看是荒谬的,但其实际意义是基于部署软件而不涉及基础设施的能力。无服务器平台根据需要自动构建,部署和启动服务的整个过程。用户只需要注册所需的业务功能及其资源需求。
这些功能可以分为两种主要类型:由客户端请求触发的功能和需要由时间触发器或事件的后台执行的功能。通常,这种无服务器系统可以使用具有动态路由器的容器群集管理器(CCM)来实现,该动态路由器可以按需调整容器。然而,它还需要考虑路由器的延迟,容器创建时间,语言支持,协议支持,功能接口,函数初始化时间,配置参数传递,提供证书文件等问题。即使这种部署方式要求在没有负载时停止容器,但实际上在服务请求之后很快就会终止容器,这将是昂贵的,因为在短时间间隔内可能有更多请求进入。因此,更经常地,在无服务器计算容器中将保留预先配置的时间段以重用应付更多的请求。这就类似于PaaS平台中的自动缩放行为。一旦服务被扩展,实例将被保留一定时间段以处理更多请求,而不立即终止它们。
赞助商链接
赞助商链接
最佳分辨率
OpenSource
Code & 2002-20为什么我们要使用无服务器架构?
无服务器架构并不适用于所有的app,但这篇文章将帮助您了解,如果使用这种架构,将会有哪些是值得您期待的。
如今谈论无服务器架构,大多数都是关注其与function-as-service的集成、如何编排访问请求,以及基于无服务器架构的故障排查工具等等。然而,没有多少精力关注在为什么选择无服务器架构,而不是传统架构背后的深层次原因,这是为什么呢?
降低开发成本
使用无服务器架构(serverless)的首要原因,正如其名字所表明的那样,将服务器从我们的关注项中移除。我们不得不承认,并没有真正的无服务器(无服务器仅仅只是对托管在云端的服务器的另一种说法)的应用,选择一种无服务器架构的实现,获得的好处只是不必开发服务器端代码罢了。
在传统的客户端 - 服务器应用程序中,基于数据的所有API和端点都需要由开发人员实现。开发方式包括通过使用像Rails这样的框架自己编写代码,或者通过利用可将底层调用转换为可调用的REST API的第三方工具来实现。
使用无服务器架构,您可以将大量的后端技术工作交给第三方,从而无需关注将Web应用推向市场的复杂工作。这显着降低了开发成本。您的开发人员可以专注于用户界面和用户体验,您的应用最具特色的地方将会更具有吸引力。
减少DevOps和维护成本
涉及到应用的开发和托管Web应用的直接成本很多。其中包括开发人员薪酬,托管费用,域名注册费用,数据传输费用等。此外,对于web应用程序,您通常需要保持服务器不间断运行,以处理一天中任何时间的访问请求。这意味着对于访问频率低的应用程序,每天只能运行一个小时的计算时间,您仍然需要为您的应用程序可用但尚未使用的其他二十三小时付费。
使用像AWS Lambda这样的功能即服务实用程序,您可以通过确保只有在应用程序处于活动状态时付费,才能进一步降低成本。功能即服务运行在按执行次数计费的模式,所以您只需要在代码实际被调用时支付托管和计算资源。许多Web应用程序通常是空闲的,因此可以显著节省成本。
虽然您可以使用Docker等产品在Heroku上托管容器来获得类似的收益,但您将无法获得功能即服务的无服务器提供商允许的纯粹级别,该服务器只提供一个实例, 实际上调用了一个单独的函数。通过确保您的代码仅在实际需要时处于活动状态,这种间歇性安装和卸载容器可以减少托管和资源使用成本。
减少面市时间
除了减少代码量和运营成本外,还可以减少交付时间。通过牺牲硬件和服务器端的灵活性,您可以通过将复杂性移到客户端来减少开发应用程序所需的时间,将您的努力专注到代码库中的单一语言中。
此外,您不需要找到提供商,运行起来服务器,配置Web服务器软件,并让您的应用程序在机器上运行,最终会是一个更简单的问题。您还可以获得更多的主机选择,因为无服务器应用程序只需要一个可以为其终端用户提供文件的CDN,而不是在处理来自网络用户的请求,运行编程语言的运行时的特定Web服务器。
最后,通过将您的应用程序的服务器端交给无服务器的提供商,您可以通过允许第三方管理应用的安全来提升安全性。通过这种方式,可以减少对web服务器、数据库服务器的安全防护,以及在传统客户端-服务器应用程序中至关重要的任何其他后端安全性问题所需的工作。
虽然许多应用程序由于特定的需求或者某些其他原因而无法在无服务器环境中运行,但与其传统的客户端/服务器应用相比,支持无服务器架构的应用程序具有许多优势。通过使用无服务器的提供程序,您可以减少所需的代码量,让第三方基于您的数据源构建API。
您还可以通过允许您的代码以更间歇的方式运行,仅在需要时才启动(和终止)实例,从而降低运营成本。
基于这两个好处,以及其他尚未被发掘的优势,您可以看到产品上市时间缩短,因为您可以专注于外观、感觉、以及您的应用程序基本的交互行为。虽然无服务器架构可能不适合您,但对于越来越多的公司来说,这是一个可行且明智的选择。
原文链接:https://dzone.com/articles/why-go-serverless
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点博客分类:
首先我应该提到,“无服务器”技术肯定有服务器涉及。 我只是使用这个术语来描述这种方法和技术,它将任务处理和调度抽象为与服务器管理无关。 在 2012 年为 ReadWrite 撰写的有关软件和应用程序未来的文章中,我将“无服务器”描述如下。
短语“无服务器”并不意味着服务器不再涉及。 它只是意味着开发人员不再需要对它们有太多的关注。 计算资源被用作服务,而不必管理物理容量或限制。 服务提供商越来越多地承担管理服务器,数据存储和其他基础设施资源的责任...无服务器架构允许开发人员将重点从服务器级别转移到任务级别。 无服务器解决方案允许开发人员通过消除后端基础架构的复杂性来专注于其应用程序或系统需要做什么。
在那篇文章的时候,“无服务器”这个术语并没有受到好评,当时在 Hacker News 的中也可以看到。但随着一些无服务器平台的诞生和微服务和事件驱动架构发挥越来越重要地位,这些质疑很幸运的逐渐得到了消退。
无服务器架构使用场景示例
为了更好理解这个技术,最好基于一个实际使用场景的示例来讨论,因此假设我们要使用无服务器管道来处理电子邮件以及检测垃圾邮件。 它是事件驱动的,因为当电子邮件进来时,它将产生一系列的工作或功能,旨在专门操作该电子邮件。
在此管道中,您可能具有执行电子邮件中的文本,图像,链接,邮件属性和其他项目或嵌入对象的解析的任务。 每个项目或元素可能具有不同的处理要求,这又要求一个或多个单独的任务以及甚至其自己的处理流水线或序列。 例如,可以跨越几个不同的处理向量来分析图像链接,以确定图像的内容和真实性。 根据消息评分和结果(是否是垃圾邮件),将采取各种行动,这可能反过来涉及其他无服务器功能。
(点击图片可缩放)
无服务器架构分析
无服务器环境中的基本单位是任务或作业,它是围绕特定工作负载处理的实例化和执行。 任务处理自从编程开始就存在,所以它也不是一个全新的事物。 但是考虑到这些工作负载处理的高度分布的性质和抽象的方式,因此跨过具体的实现层次,并有广泛的理解是必要的。
同步与异步
虽然处理任务的性质 - 无论是同步还是异步 - 通常是一个平台问题,但它也是在任务级别需要考虑的一个重要因素。 传统的工作和作业处理系统在很大程度上是异步的,这意味着调用进程不保持与执行任务处理组件的持久连接。 作业将排队,因此,它们可能不会立即运行。 调用函数和处理器之间唯一的特定连接将任务排队等待运行。 (注意,某些平台可以允许对任务获得状态,但是通过API调用而不是直接/持久连接)。
许多新的无服务器平台允许同步处理,从而保持连接并且客户端在功能正在处理时等待。 同步处理的优点是可以直接从处理平台获得结果,而在异步处理中,获得结果必须作为独立的调用来完成。 我将在平台部分讨论更多细节,虽然一般的规则是同步处理适用于轻量级函数(类似于API调用获得天气信息),而异步处理更多的涉及处理作业(音频转录或作为小批量处理作业的一组事件的处理),以及启动处理的应用/组件/功能不是处理结果的应用/组件/功能的地方。
无论处理方法如何,开发微服务和/或无服务器功能的核心原则之一是每个服务或方法应被视为无状态。(小编:无状态也反复在在高可用架构群讨论及分享中提及)。 无状态是指每个任务是一个单独且不同的处理请求,其包含足够的信息来满足该请求。 服务和方法不应存储任何唯一的软件配置或状态。 任何配置数据都应来自方法外部,通常作为任务的一部分或通过平台内的配置服务。 该方法应该仅用于其计算资源,仅用于处理单个工作负载。
另外,应当有明显的开始状态和结束状态,并且服务或方法应以相同的方式处理每个任务。 借用一个 principles of clean code, bad code — and bad microservices and serverless functions
[1] 一文中的观点,我们应该聚焦并使用[2] 。 思考无服务器函数的一个好方法是每个函数应该有一个且只有一个维度或向量的变化。 换句话说,如果有多种方式可以扩展函数(例如,将检查多个特征的图像分析),则对于每个向量应当存在两个或更多个不同的函数。
在我们使用的用例中,每个电子邮件是一个单独的事件,因此每个电子邮件都有一个单独的任务序列。 每个任务将承载为相应的任务或方法提供处理的数据。
短生命周期
无服务器功能也是短暂的 - 意味着它们持续有限的一段时间。 无服务器应用程序的基础主要围绕事件处理和为这些事件服务时发生的任务处理。 强大的容器技术的出现使得任务可以在分布式环境中处理,并且决定在运行时在何处运行。
换句话说,任务处理基本上变成容器处理,其中容器在任务的基础上建立和移除。作为示例,电子邮件处理示例中的每个任务仅持续对特定电子邮件执行特定动作。 完成后,任务和容器应该终止。
可能存在需要持久或长时间运行的进程的情况,如实现应用服务器或API服务器,这些场景我们通常放在无服务器范例之外。 在大多数情况下,你觉得可能需要长时间运行的任务,很可能有办法避免这种开销。 例如,无服务器平台,消息队列或其他组件可能能够适应任何路由需求。 同样,计划任务可能能够提供定期状态检查或处理周期。这里的示例是整合和处理来自各种数量的IoT设备的流数据。 如果数据被收集在一个或多个队列或数据库中,则调度作业可以在周期性(和频繁)基础上运行,查看队列中或数据库中的数据,并启动一个或多个子任务以执行每个数据的合并和处理片。
(点击图片可缩放)
注意,在实际处理场景中,容器可能不会在每个任务之后终止,主要是出于性能原因。 容器可以从任务持续到下一个任务,但是它们的状态和存储将被擦除和重置,使得每个任务或事件处理循环被隔离并且短周期的。
幂等是构建到微服务和无服务器函数的关键属性(小编:在高可用架构群讨论及分享中,这一术语也被反复提及)。 在基本级别,能够运行重复的任务并获得相同的结果。它也能够使多个重复的请求具有与单个请求相同的效果。 这是第二个定义,对于任务以高度并发和异步方式操作时的设计至关重要。 在任何作业处理环境中,任务可能由于多种原因(服务器崩溃,资源限制,第三方服务超时,任务超时等)而无法完成。
在其他情况下,任务可以完成,但是可能已经调用了针对相同的重复处理请求。 这样的一个示例是注册消息的超时的队列,因为任务可能仍然在处理请求(并且因此没有及时删除或取消保留消息)。 结果,队列可能触发对该消息的另一处理请求。
(点击图片可缩放)
如果只是简单继续处理这些任务 - 将其放在队列上或将其写入数据库,可能会有不良影响,尤其是在事务情况下。 例如,会产生两个重复的订单。 这是最重要的,然后确保只有一个请求处理相同的任务。 正是由于这个原因,在无服务器平台(如大多数其他处理领域)中,开发人员需要在处理之前和/或在写入或输出结果之前,执行重复任务的检查。
(点击图片可缩放)
以一个开发者朋友的话来说,另一种思考方式是“想象一下,如果服务器崩溃,而任务正在中间处理并且任务被重试。 或者,如果它只是排队或安排两次。 你需要做什么,以确保你不会覆盖数据,添加重复的事务,因为它可能会多次运行。” 因此在处理周期中,在适当点检查和验证,以确保尚未执行工作。
多语言编程(Polyglot)
Polyglot是指以多种语言编程。 在无服务器编程的情况下,它指的是以多种语言编写和执行任务的能力。 虽然每个功能可能只是一种语言,正确的无服务器平台应该能够处理多种语言。 这意味着它还应该提供一个重要级别的代码独立性,使开发人员可以透明地工作,而不必关心操作系统和服务器级依赖关系。
多语言的优点是能够在不同的任务中使用合适的工具。 或者,为对应的团队使用适合他们使用的工具。 在实际情况中经常发生的是,如果你拥有一把锤子,你看到一切都像钉子。使用单一语言,常常会约束解决问题的方法。 开发人员可能艰难的适应那种语言的代码包来完成他们的需要,而事实上,其他语言的其他库也许可以更好地服务于目的。
为了计算贝叶斯统计或进行机器学习,您可能希望使用用C,C ++,Python或Java编写的包。 同样,与您合作的开发团队可能精通特定的网络爬行包,它是为特定语言编写的(例如以Ruby编写的Nokogiri)。 能够利用这种知识和经验可以消除开发周期,以及降低项目延迟或失败的风险。
请注意,许多较新的无服务器平台目前仅支持少数几种语言,但我希望在今年内能够快速改变。 (例如,IronWorker可以处理大多数常用语言和可执行代码。)
无服务器任务需要考虑两个兼容性顺序。 第一个是任务之间,第二个是版本之间。 当你分解任务时候,你需要强大的服务契约和组件之间的规范。 规范的API格式可以通过常用的身份验证和传输协议解决部分问题,但是使用自定义函数和服务,开发人员仍然需要定义有意义且易于理解的输入和输出模式。
除了干净的接口,开发人员需要解决版本控制需求。 例如,假设函数X在平台内运行,并且它调用函数Y,如果函数Y已经被更新而没有让函数X知道并被正确设计,则它可能在处理时失败或者它可能产生不正确的结果(或者它导致期望原始结果的任务中的下游故障)。
与代码包一样,无服务器任务中的更改和更新可以通过应用程序发布。 在代码包的情况下,这些冲突可能会通过打包和编译工具早期发现。 然而,使用微服务和无服务器编程,它可能只是通过运行服务(最好在测试或仿真环境),问题才会被发现。
这意味着,所有这些无状态性和任务和服务独立性,团队需要注意不仅设计良好构建的接口,而且解决向后兼容性的意识。 一个帮助可以是在描述/版本化无服务器任务中使用[3] 。 它不是万能的,但随着这个版本化约定的传播,它为可能正在使用您创建的任务的其他开发人员提供了一些基础。
https://blog.goyello.com//top-9-principles-clean-code/
https://en.wikipedia.org/wiki/Single_responsibility_principle
http://semver.org/
本文英文原文:http://highscalability.com/blog//part-1-of-thinking-serverlesshow-new-approaches-address-mode.html
https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=&idx=1&sn=cfada26d9f9aa1c62aa3c2&chksm=813a7f57b64dfa5e77ffa5a384fa89e803c7b8a2e&scene=0&key=f813d0a51cabce756dda54a26ebf4d4114cce0cb46e0ac70cc14bff51d79a15ca426f906b70305c53acd8cc052a5a3595d44&ascene=7&uin=MTA4NDY0MzM2MA%3D%3D&devicetype=android-23&version=&nettype=cmnet&abtest_cookie=AQABAAgAAQBGhh4AAAA%3D&pass_ticket=3i02xv%2Bfw9GaA3ePmRRfZAYo1tsLZjJdXU92%2FCpAlqLsmJd9JhrfIuAHQ5c5PDc4&wx_header=1
浏览: 1722098 次
来自: 南京
还是要事务的比如testSrvice.do这个接口的实现里调用 ...
lvyuan1234 写道jestclient是单例的,当并发 ...
jestclient是单例的,当并发调用时该如何处理?
由Spring Boot实现的微服务需要有比较好的工具去测试R ...
图形数据库Neo4j教程网盘地址:https://pan.ba ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'无服务器架构如何实现?这里有篇应用开发实践!
如果你曾经想过“应该有一个实现这种功能的应用”,并憧憬有谁能够为你开发一个就好了,现在我们有一个好消息,那个人找到了,就是你自己。
Web应用可以是非常强大、高效和易扩展的,但却不应该是复杂的。简单就是Web应用的一大优势。你可以利用这种优势来搭建自己的解决方案,实现自己的创意。一旦了解所有模块是如何搭建到一起的,你就能开发出想要的应用了。
本书是一本实用教程,将会演示一种无服务器的方案来搭建Web应用。使用这个方案,大部分运维方面的问题就不需要你自己操心了,而且也省去运行服务器的费用。你能集中时间和精力开发想要的应用,而让其他人去考虑业务发展带来的应用上线、配置、升级、扩展服务器等问题。使用多层Web框架、自动生成的代码或者拷贝模板,这些方法并不会带来这样的好处。等我们一起学完本书,你就会知道如何通过移除部分代码和消除中间层来交付更好的应用。
为了能够快速演示开发过程,我们将使用一个预设好的工作空间,里面加载了搭建完整Web应用必需的所有模块。首先,我们会完成一个单页应用,用Java、HTML和CSS代码来实现原来在服务器端实现的逻辑。我们将根据Web标准,深入挖掘单页Web应用的必要功能,从零开始搭建,从而了解它们的运行机制,保证这种设计能符合我们应用的要求。当仅凭Web标准不能完全实现需求时,我们会使用jQuery来填补差距。最后,我们会使用测试优先的方法来渐进式开发,以保证单页应用的可测试性。
为了降低中间层成本并确保我们的应用能供上百万的用户使用,我们使用Amazon Web Services(AWS)作为无服应用的后端。你将看到如何使用高可用、高可扩展、更便宜、更易维护的云服务来替换掉传统Web应用的服务器、数据库和负载均衡器。我们将讨论在开发此类应用时会碰到的一些安全性问题,并会介绍随着应用业务的扩展可能会用到的其他技术和工具。
我希望能够让你看到新的可能性。以前非常费时费钱的应用开发或许能变成一个人在一两天内就可以完成的事情。随着技术进步和个人能力的提升,更多的梦想将会实现。一旦理解了这些技术的发展,你就会发现从前因为太难而几乎无法实现的目标,现在可以借由新途径来达成。读完本书,你将学会将创意变成真实应用所需的技能。
无服Web应用
在传统Web应用中,服务器是系统不可缺少的组成部分。尽管有时候服务器的前面还有负载均衡器或者专用Web服务器,但完成大部分工作的还是应用服务器。它完成一个应用所有的必要功能,包括存储用户数据、进行安全认证、控制流程等。应用的页面大部分仅仅只是为后端提供界面而已,尽管也会涉及一些控制导航的功能。使用这种许多人称之为多层架构的传统方式,系统一般会由浏览器、应用服务器和多个后端服务构成(见下图)。
使用无服的方式,可以移除所有这些层次架构,达到更直接的实现。与其仅仅把网页客户端当作应用服务器的界面展示,不如构建一个单页Web应用在浏览器中实现应用逻辑。这意味着你只需要一个简单的静态网页服务器,所有的交互都只不过是应用内容的传输而已,浏览器就像是一个应用容器。这样,最终的设计就是移除传统Web应用架构中所有的中间层次,允许浏览器直接连接到它所需要的服务上。
使用Facebook、Google和Twitter之类的OAuth 2.0身份认证服务商提供的服务,无须保存用户密码就可以创建用户身份。如果要存储数据,你可以在浏览器端直接使用Amazon DynamoDB之类的服务。在浏览器中无法执行的函数都可以使用Amazon Lambda微服务或者其他专门的Web服务来处理。除了能够简化架构,这种切换到Web服务作为后端的方式,还能让应用获得这些服务与生俱来的可用性和可扩展性优势。
你可能会好奇到底发生了什么,使这种方式成为可能。为什么现在在一个Web应用中,中间层的应用服务器变得可有可无呢?答案是,自从2015年以来,类似Amazon这样的云服务提供商开始对外提供服务的API,这使得无服务器的方式成为可能,Amazon本身也为如何使用他们的工具和基础设施提供了最好的示范。
基于Web标准搭建一个单页Web应用,而不是使用服务器端Web框架来完成,我们可以快速应用一些新兴技术。例如,我们不再需要将应用的数据模型绑定到任何一个对象层级或者数据同步机制上,因而能更方便地集成不同服务。既然我们所有的工作都倚赖于Web,就不必拘泥于以前搭建Web应用的成见,可以用目前最新的技术来搭建应用(见下图)。
无服设计的好处
如果你在寻找一种快速搭建低成本Web应用的方法,无服Web应用很可能就是一个解决方案。不需要花费时间和精力了解传统Web应用技术栈的各个层级,采用这种方式你能更专注于实现业务功能,有人会为你操心运行维护和可扩展性的问题。接下来让我们深入探讨无服设计的好处,帮助你在考虑下一个项目中是否使用这种方式时做出更明智的决定。
无服设计最明显的好处就是不需要维护服务器(不管是物理的还是虚拟的)。你不需要担心打安全补丁、监控CPU和内存使用情况、回滚日志、磁盘空间不足或者其他在维护自有服务器时经常碰到的运维问题。和大多数平台即服务(PaaS)方式一样,无服设计能让你专注于应用开发,而无须担心基础设施的问题。
这种设计方式的另一大好处是,你可以依靠云服务供应商来扩展自己的应用。在做水平扩容时,不需要忙不颠地在几个负载均衡应用服务器之间保持数据的一致性,你可以直接连接Web服务,而它们已经解决了数据一致性的问题。这意味着不管你的应用有几个用户、几百个用户,还是几十万个用户,只需要修改Amazon Web Services控制台的一些设置就可以保证完美的运行。
另外,使用这种设计能轻松实现高可用性。你不必为了升级而关闭应用服务器,或者为了实现“热”部署而扩建基础设施。不再会有服务的重启或者部署包在服务器间的拷贝。最妙的是,Amazon有一群训练有素的员工7×24小时守护着你的基础设施,一旦发现问题随时能够响应。
这些服务的成本可以非常低。使用无服的方式以及利用Amazon的免费套餐(Free Tier),一个月支付几美分就可以运行你的应用。一旦超过了免费额度,其费用经常也是随着你的用户量线性增长的(考虑费用最高的情况)。我们在这本书里构建的应用就算扩展到100万的用户,一天也只需要花费一杯咖啡的钱。
(微)服务友好
这种方式可以轻松适应微服务或者其他的面向服务架构。你可以在系统中引入特定的服务以实现自定义身份认证、验证或者异步数据处理。如果有必要,你甚至可以重新引入应用服务器,渐进式地重构应用。反之,如果一开始就使用一个中间层来控制所有的安全证书,就很难切换到需要认证的Web服务上。这些应用服务器没办法像无服应用一样,在应用层管理身份信息。
在传统Web应用里,一些操作(比如导航)在Web客户端和服务器端都需要执行,造成了代码的重复。有时候,这种重复工作并不明显,尤其当服务器代码是用不同的语言写时。而在无服应用中,应用逻辑都移到了客户端,很容易保证应用内不再有重复的代码。将应用逻辑代码放在一个位置(以及用一种语言实现)帮助我们解决了这个问题。
此外,无服的方式更便于构建和排错,因为系统的组成部分变得更少了。Web应用天生就是分布式的,也就是说,正如CAP理论所述 ,它们在同一个网络的节点间传递消息(一般是以请求和响应的形式),限制它们的是实现方式。
有些应用会比其他应用更分散(more distributed)。一个系统越分散,就越难排错。移除应用中的中间层能减少其分散的程度。在我们这个简单的应用中,如果一个客户端需要从一个数据库中获取数据,就会直接连接数据库,而不是通过中间层连接。这就意味着系统中的网络节点更少,也意味着如果出现问题,需要定位的地方更少。
如上所述,构建一个无服应用的理由有很多。学完本书,你就会明白为什么这种方式如此强大。了解了无服应用的这些优点,我们再来看看它有哪些限制。
无服设计的限制
尽管无服架构有许多优点,但它也不是适用于所有类型的应用。为了享受这种设计带来的益处,你必须接受一系列的限制。如果你的应用不能适应这些限制,那么它很可能不是最合适的构建方式。所以在搭建应用之前,让我们一起看看这些限制。
供应商锁定
首先最大的限制就是你使用的Web服务必须支持第三方身份认证服务商,这样在云服务提供商的选择上就受到了限制。所以如果使用无服的方式,你就会依赖于第三方服务,供应商锁定也就成了一个问题。构建一个基于其他公司服务的系统,意味着这个应用的命运和供应商公司的命运绑在了一起。如果供应商公司被收购、破产或者改变商业模式,你的应用不下大力气修改就很难在其他地方运行。所以,评估服务提供商的业务目标和长期稳定性与技术选型是同样重要的。
奇怪的日志
所有运维关注的事情,比如应用日志,在你使用无服设计之后会呈现新的形态。当你把所有请求都通过一台服务器路由时,记录下所有信息以查看用户正在做什么是非常简单的事情。没有了这种中心化设计,日志的记录必须由每个支撑应用的不同Web服务来实现。这些日志格式跟大部分应用服务器日志都不同,记录的数据也很可能是你不熟悉的。我们在后面第8章的“分析S3日志”会深入探讨Web服务日志的分析。
不一样的安全模型
对于无服应用,有些常见的安全隐患不复存在,但你将会遇到一些不熟悉的新问题。比如,为了安全而验证用户数据,结果不能在浏览器中安全地实现。你需要假设有些恶意用户可能会在浏览器中劫持证书而使用该证书授权的Web服务。使用无服的方式,意味着你不能把浏览器中的应用验证逻辑和安全验证逻辑放在一起,必须分开实现。
Amazon提供的许多Web服务都能验证请求。你可以参考第5章的“数据访问和验证”一节内容利用DynamoDB来实现。然而,对于有些应用来说,很难只用Web服务提供的工具来实现充分的有效性约束。比如,在浏览器中直接编写文本时,你不可能放心地将写入的数据编码后存到数据库中,保证不会有跨站脚本攻击发生。因为攻击者不使用应用就能直接将这个数据添加到数据库。
这种情况下,你有(至少)两个选择。第一,可以假设某些用户可编辑的表可能包含未经验证的数据,然后针对性地设计系统的其他部分。比如,用户只能写入他们自己可读取的数据,这是可行的方式。第二,可以将某些写操作委托给自定义Web服务,比如可以使用Lambda函数来进行验证,并且以一种安全的方式写入数据。我们将会在第6章的“使用Lambda构建微服务”中详细介绍。
不一样的身份模型
外部身份管理是我们这本书构建的应用中的一个独特功能。使用Web服务来管理身份信息有很多好处,但对你来说这种机制可能有点陌生。与将用户信息和其他数据保存在一起的传统方式不同,这些用户资料会保存在一个独立访问的数据存储服务中。如果使用这种方式构建无服应用,一些在数据库中处理用户数据的方法(比如用一个ID关联一张User表)就没办法实现。
此外,将所有请求路由到统一的中间层可以实现某种程度的控制,这在某些情况下是非常有用的。比如,拒绝访问攻击和其他一些攻击有时候可以在应用服务器上进行阻截。对你而言,放弃对身份认证的直接控制可能想一想都觉得可怕。我们后面在第7章会用一整章来专门探讨这些安全问题。
规模与成本的关系
最后,你需要了解这些服务的开销。虽然能够自动扩展应用这一点非常厉害,但易于扩展同时也意味着花钱更容易。你需要了解这些服务的定价策略以及当用户增加时这些价格的变化。我们后面会在第8章中深入讨论应用的成本。
既然你已经了解了无服Web应用的代价,我们可以开启这本教程,探索一下无服Web应用是如何实现的。在教程中,你可能会发现这种设计方式为你开发的Web应用带来的其他好处和限制。一旦知晓了无服应用的全貌,就可以判断下一个项目是否适合这种方式了。
使用自己的工作空间
为了学习无服Web应用的知识,我们将在本书中搭建一个Java编程解题应用作为示例,名字叫LearnJS。它会向用户展示一些简单的编程题,然后让他们用Java作答,并按下按钮检查答案是否正确。这个应用的样子如下图所示。
我们将会从后往前搭建这个应用。本章我们将会部署它,然后测试,再加入一些应用逻辑。在那之后,我们再来思考架构设计。
如果你对现代开发者们拥护的这种迭代增量式开发风格不熟悉(我本来想把它叫作敏捷开发,但是它和敏捷的涵义还有所不同),这套流程看起来是完全错误的。还没有构建好应用我们怎么部署呢?还不知道要让应用做什么,怎么先写自动化测试呢?还有,我们是不是应该在动手之前先考虑一下架构设计呢?
如果你对此有疑问,没关系,我们将会一步步实现这个流程。一旦完成之后,你将会理解,甚至是赞同这种方式。不仅因为它是学习新技术的绝佳途径,而且也是构建软件的有效方法:前进一小步,评估当前状态,不断重复此过程,直到客户满意。
使用Git进行代码管理
Git是一个代码管理系统。与其他系统一样,Git能帮你跟踪代码的变动,保证代码安全,以及与他人共享。如果你对它不熟悉,可以看看下面的介绍。
Fork一个项目意味着创建一个自有的副本。如果你在Github.com上创建一个账号,再查看你的工作空间项目 ,应该可以在页面右上角看到一个“Fork”按钮。单击按钮,过几秒后,Github就会为你创建这个项目的副本。现在你需要把它复制到本地电脑上,这个过程称为克隆(clone)。使用一个Git客户端,你能将整个工作空间都克隆到自己电脑的本地目录上。一旦完成,就万事俱备了。
想要了解更多如何使用Git和Github的内容,参见Github Guides。
一开始,你需要fork一个在Github上准备好的工作空间 。使用这个工作空间能让你专注于构建应用和学习相关知识,而不是把时间花在搭建必要但不相关的基础设施上。在进行下一步操作之前,使用以下命令克隆被fork的工作空间(填入你的Github用户名):
$ git clone :/learnjs.git
要理解接下来会做什么,首先需要理解现有的代码。刚才克隆的工作空间中有一个public文件夹,里面包含了一个空应用。这个应用没有任何功能,它的标记(markup)也很快就会被替换,但它包含了所有我们需要的基本工具。
在构建应用时,我们主要会修改public文件夹下的三个文件:index.html、app.js和app_spec.js。我们会在index.html中添加应用的标记。这就是我们单页Web应用中的“单页”。使用自己顺手的文本编辑器,打开这个文件,查看一下内容。在元素中,你将会看到这个预备好的工作空间里我们必须使用的一些库。
&meta charset="utf-8"&&title&Learn JS!&/title&&link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Raleway:400,300,600"&&link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.2/normalize.min.css"&&link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css"&& src="https://code.jquery.com/jquery-2.1.4.min.js"&&/&& src="/vendor.js"&&/&& src="/app.js"&&/&&style type="text/css" media="all"&
body { margin-top: 30 }
应用里第一个库是标准化CSS基准库,它保证了我们的基本样式在所有浏览器中都是一致的。后面我们会引入Skeleton,一个响应式CSS样板库。Skeleton提供了响应式网格和一些小的CSS组件,可以用于样式和布局。我们还引入了Skeleton的默认字体Raleway,托管在Google字体库 。还有一个引入的库是jQuery 2。我们用jQuery来做许多事情,比如搭建应用视图、视觉动画和监听事件。
第二个文件vendor.js包含的库要么是我们应用自定义的,要么是不够流行而没有放在CDN上的类。迄今为止,这个文件包含的唯一东西是一个AWS (版本号为2.2.4)Java开发库的自定义子集,包含了以下几个服务类库:
CognitoIdentity
CognitoSync
元素里的另一个脚本为app.js。到目前为止,这个文件是空的。这里就是我们添加用Java编写的应用逻辑的地方。它不仅会包含应用的领域特定逻辑,而且包含像路由器、模板函数和数据绑定代码这样的基础设施。
元素里的最后一项是一个
learnjs/1000/public/index.html
&div class='container'&
&h1&It works!&/h1&
&span&You're ready to start!&/span&
&span&Skeleton 2, jQuery 2, and AWS libraries are included.&/span&
工作空间内还包括一个名叫Jasmine的测试框架。空间内的public/tests文件夹包含了一个测试执行器和一个空的测试组件(public/tests/app_spec.js)。当我们编写测试用例来保证应用的功能时,就把它们添加到这里。
既然了解了目前的进度,就把应用启动起来,然后把自己设想成用户来看一看。接着我们可以对其进行评估,做一些小修改,部署我们的第一个版本。要做这些事,需要一台在本地运行的Web服务器来为应用提供服务。
预先准备好的工作空间提供了一个叫作sspa的包装器脚本。对这个脚本的使用将贯穿全书,它将实现包括配置AWS服务、构建代码包和部署应用等简单任务。这个脚本代码非常易读,如果想知道它是怎么工作的,尽管打开看一看。为了在本地启动一个包含public文件夹下的内容的开发服务器,在预设的工作空间主目录下执行以下命令:
learnjs $ ./sspa server
sspa脚本的server指令会启动一个简单的Python Web服务器提供静态内容。当然,你也可以使用自己的Web服务器。只需让预备的工作空间来提供public文件夹下的内容,一切搞定。我们在书中所做的事情都不会涉及特定的Web应用开发工具。不管你喜欢使用什么工具,都可以在你最舒服的工作环境中应用本书中的所有技术。
一旦搭建好Web服务器并运行起来,看一下我们的应用。如果你是用预备工作空间中自带的服务器,可以打开习惯的浏览器,访问http://localhost:9292。你应该可以看到以下内容:
这就是我们的应用。目前还没有什么内容。尽管可以试着为应用规划一长串的功能,但因为还不知道究竟我们想要些什么,超前规划似乎会变成徒劳。相反,我们会给应用添加一个标题页面,然后决定接下来做什么。
创建着陆页
当用户第一次加载我们的应用时,我们想展示给他们一个页面,既能快速解释我们的应用是什么又能提供清晰的入门指南。这个页面通常被叫作着陆页(landing page),我们的应用中也会添加一个这样的页面。
LiveReload和LivePage
不管你使用哪种Web服务器,我都非常推荐在实际项目中使用某种自动刷新页面的工具。有很多现成的选择。有一个与我们的预备工作空间配合使用的好工具是Google Chrome 中的LivePage插件。它安装和使用起来很容易,只要你修改了代码,它都会运行测试脚本并重新加载应用。这样的工具建立了一个快速反馈闭环,你可以用来检验样式和布局变动或者执行一些客户端测试。
另外一个选择是名为LiveReload的工具。LiveReload既可以用作一个单独的Web服务器,也可以在开发中用作自动重载Web应用的协议。无论什么时候服务器检测到硬盘文件的改动,都会及时通知客户端的Java库(或者浏览器插件)。LiveReload有多种形式,有LiverReload应用 和像LiveReloadX 这样的命令行工具。如果你希望在Node.js中运行,live-server 或者grunt-livereload 可能更适合你的需求。
为了构建着陆页,我们用Skeleton网格创建了一个简单的布局。这个页面会包含一些标题文本、一张图片和一个经常用于号召行动的按钮。用户将单击这个按钮来启动我们的应用。
如果你之前不熟悉Skeleton,现在是一个熟悉它的好时机 。当然,它里面其实并没有很多东西(所以才叫这个名字)。它的文档非常规范,而且有许多案例,所以很容易学习。花5分钟时间过一遍,就能理解它能做什么以及是怎么实现的。
为了展示这个网格,我们将厚着脸皮从Skeleton着陆页的案例中“偷”些代码。使用你的文本编辑器,打开index.html,将这些标记添加到应用页的中:
learnjs/1100/public/index.html
&div class='container'&
&div class='row'&
&div class='one-half column'&
&h3&Learn Java, one puzzle at a time.&/h3&
&a href='' class='button button-primary'&Start Now!&/a&
&div class='one-half column'&
&img src='/images/HeroImage.jpg'/&
在你的浏览器中,应该能看到我们的着陆页,而不是之前的文本了(见下图)。单击按钮并不会触发任何操作,但这并不是错误。
既然我们已经添加了一个着陆页,就有东西可以去部署了。虽然不是很丰富,但也足够用来走部署流程,足够我们在为应用添加更多功能之前把一切理顺。
部署到Amazon S3
当启动新项目时,经常会碰到很多未知的风险。那些问题可能根本不在预料之中,会让你浪费很多时间。如果能识别并避免这些风险,可以少一些挫败感、头疼和痛苦。
有一个很容易避免的风险就是部署问题。我们不想等开发完成之后再部署。我们关于应用如何运行的假设有可能是错误的。如果基于这些错误的假设构建应用,风险和潜在痛点会增加。因为我们是在个人电脑上开发应用然后部署在服务器上的,Web应用经常面临一堆问题。这两种环境很可能完全不一样,等你理解了它们所有的不同点,就会发现自己是在白费力气。
通过提前部署,我们就知道自己的部署流程是否做了正确的配置。我们可以检测生产环境是否可行,确保没有任何权限之类的问题。最重要的是,我们解决了所有必要的任务,证明我们可以把应用从头到尾完成。在你的应用交付给用户使用之前,从他们的角度,你就是没完成任何东西,不管你已经写了多少代码。
我们没有运行自己的Web服务器(例如Apache或者Nginx),而是将应用部署到Amazon的Simple Storage Service(S3)上。它的一大用途是作为静态站点服务器。虽然不如其他服务器功能全,但它很便宜(一个月只需要几美分)而且便于扩展。既然我们一直在尝试避免在服务器基础设施上投入时间和金钱,那么S3完美满足了需求。
搭建AWS命令行接口
在本书中,我们需要和AWS交互来创建和配置应用所需的服务。一个好方法是使用AWS命令行接口,简称AWS CLI。我们会先用这个工具创建我们的S3存储桶(bucket),在后面构建应用的过程中它会有大用处。
如果你还没安装AWS CLI,那就赶快安装,并且配置好管理员权限。Amazon推荐使用pip,一个Python包管理器,来安装AWS CLI。如果没有pip,也可以使用easy_install,它也是一个Python包管理器。你需要使用Python 2.7以上版本。根据你安装的管理器,执行以下对应的命令:
$ sudo easy_install pip
$ sudo pip install awscli
在Debian/Ubuntu系统上,你可以用apt来安装pip:
$ sudo apt-get install python-pip
在OS X 10.11上安装AWS CLI
如果在OS X 10.11(El Capitan)上用pip安装AWS CLI出现问题,你可以在install命令 后面添加--upgrade和--ignore-installed six参数。
为了使用这个工具,你需要配置它。首先,要在AWS账号上创建一个带管理员权限的用户。
创建一个带访问密钥的AWS用户
授权你访问其他所有AWS的那个AWS称为身份认证和访问管理服务(Identity and Access Management,IAM)。你可以用这个服务创建一个能访问你账户下某些服务的独立用户。显然,这对于团队协作很有帮助,但还能用它根据角色或者任务创建不同用户。类似这样的分组访问方法可以限制密钥泄露导致的漏洞,防止测试数据直接进入生产数据库,或者防止一个应用意外影响到另一个应用。
你可能想为应用创建很多用户,我们这里先创建第一个带管理员权限的用户。该用户有你账户里所有服务的访问权限,所以一定要小心使用。按照以下操作步骤创建用户:
1.打开AWS控制台 ,如果有必要,注册一个账号。
2.进入“Security & Identity”下面的“Identity & Access Management”服务。
3.在左边侧边栏,点击“Users”。
4.点击“Create New Users”创建一个新用户。我们将会使用这个用户账号来部署应用。
5.为用户挑选一个名字(比如learnjs),填在第一行。
6.勾选上“Generate an access key for each user”(为每个用户分配访问密钥)复选框,点击“Create”。
7.按照提示下载证书。
证书由两个密钥组成:访问密钥(access key)和私钥(secret key)。这两个密钥都在你下载的CSV文件里,也可以直接在网站上看到。Amazon只给你一次操作机会,所以马上下载下来,否则你只能重新创建密钥了。
不需要为这个用户提供密码。
一旦拿到这些密钥,就可以完成AWS CLI的设置。用管理员用户运行aws configure命令,然后按照提示输入密钥信息。如果它要求你设置默认区域,输入us-east-1。
$ aws configure --profile admin
AWS Access Key ID [None]: JFAKEKEYSRRETDMAAKIA
AWS Secret Access Key [None]: 2Jdw+ThI5iSafAKeKeY4ExamPLEsHAONXn32Af/sm
Default region name [None]: us-east-1
Default output format [None]:
如果我想用其他区域呢?
如果你对AWS比较熟悉,很可能在一个非us-east-1的区域有几个已经配置好的服务了。当然你也可以在管理员界面中修改区域配置,但注意并不是所有的服务都适用于所有的区域。另外,在其他区域sspa脚本可能没法正确处理URL请求和其他资源名。
如果你用了非us-east-1的其他区域,需要验证一下你所使用的服务在那个区域是否可用。另外,你可能需要修改下sspa脚本以适配你的区域名。
既然AWS CLI已经配置好了,在主目录下应该能发现一个新文件~/.aws/credentials。这个文件的内容如下所示(当然密钥是不一样的):
aws_access_key_id = JFAKEKEYSRRETDMAAKIA
aws_secret_access_key = 2Jdw+ThI5iSafAKeKeY4ExamPLEsHAONXn32Af/sm
在创建用户并且保存证书之后,你需要通过创建访问策略来授予该用户访问的权限。回到AWS控制台的用户列表页,你应该可以看到最近创建的用户。点击该用户,进入用户概要页。它应该看起来如下图所示。
接下来,你需要创建一个策略,规定该用户能访问哪些服务。找到用户概要页的“Permission”模块,点击添加新托管策略的链接。你将会看到一系列如下图所示的策略信息。
勾选上“AdministratorAccess”旁边的复选框,然后单击“Attach Policy”按钮,就大功告成了。现在你可以创建一个S3存储桶(bucket)。然后,就可以部署应用了!
创建一个S3存储桶
基于已有的管理员用户,你可以创建一个S3存储桶。预备工作空间中的sspa脚本包装了一些AWS CLI的命令,不仅能够创建存储桶,而且能够把它配置成服务于我们应用的静态文件Web服务器。如果你还有一个想指向这个应用的域名,这里必须将它输入成存储桶的名字(比如learnjs.benrady.com);如果没有,那么你想用什么名字都行。只需要输入create_bucket调用sspa脚本,以新的存储桶名当作参数即可。
learnjs $ ./sspa create_bucket learnjs.benrady.com
make_bucket: s3://learnjs.benrady.com/
Website endpoint is:
http://learnjs.benrady.com.s3-website-us-east-1.amazonaws.com
Amazon S3存储桶的名字是全局的,所以不能用别人用过的名字。
如果命令成功执行,一个新的存储桶就被创建了。你可能想换一个存储桶名再运行一次命令,为应用创建一个测试或者演示环境。退出命令后,在终端中应该看到sspa脚本返回了一个存储桶网站访问端点的URL。记下来这个URL地址,再执行以下命令部署应用:
$ ./sspa deploy_bucket learnjs.benrady.com
好了!现在把sspa脚本刚才显示的网站访问端点输入到浏览器中,就可以看到我们的应用了。它上线了!如果没看到,可以仔细检查AWS控制台中Amazon S3的网站端点地址。如果为AWS CLI配置的区域不是us-east-1,有可能sspa脚本显示的地址是不对的。
一旦确认应用已经成功部署,就可以给应用起一个域名来简化URL访问链接。你需要把域名映射到这个S3存储桶。你可以通过在DNS服务商的网站上,创建一个CNAME项,把端点URL当作记录的值,来实现映射。更多有关如何实现的详细信息,参见附录B的内容。一旦做完这些,部署工作就全部完成了,我们就可以继续下一步的工作。
你已经把应用成功部署到生产环境中了。有了这一次的经验,后面再修改应用,你应该有信心完成部署了。这种方式将帮助你小步前进,专注于怎么让应用变得更好以及怎么把它推向潜在用户。
至此,你已经知道怎么把应用部署到Amazon S3。下面是一些你可能会感兴趣的延伸话题。
所有的AWS服务都运行在遍布于全球各地的数据中心,也就是前文所说的“区域”(region)。让应用在不同的区域并行运行是一个确保高可用性的好办法,即使在面对灾难性故障或者自然灾害的时候。
在选择区域的时候,首先保证你需要的服务在那个区域是可用的。另外还必须考虑你的用户在什么区域,其他非AWS的支撑服务器在什么区域(比如邮件服务器)等等。
创建测试环境
我们在本章中刚接触它,但是随着本书的内容一点点深入,后面会搭建一个完整的测试环境,其配置和生产环境一致。你可能认为这么做没有什么意义,但走完整个过程,你会了解到两套环境下会面临的一些配置问题。是现在就解决还是暂时搁置这些问题,由你自己决定。
我们在这个应用中创建的管理员用户可以访问账号里的所有服务。等你对需要的服务更熟悉之后,更好的方式将是移除这个用户的所有管理员策略,添加一些细粒度策略,只允许它访问真正需要的服务。
至此,我们已经为接下来的工作做好了准备。在下一章中,我们将会添加一个客户端路由到应用中,支持不同的应用视图,以及解决一些按钮不管用的问题!
Serverless的意思就是开发应用时可以专注于实现应用的业务逻辑,不需要考虑管理服务器的事情。采用无服务器架构的方式开发应用,扩展性好、可靠性强、成本低。
尝试新创意、探索可能的新市场或者创建最小可行产品的极佳应用开发方式。创业者、中小型公司的福音。数小时内就能搭建一个初始版本应用并在几秒内部署,迅速接受市场检验。
本文节选自:《Serverless架构:无服务器单页应用开发》【美】Ben Rady(本·雷迪) 著 郑美赞 简传挺 译
原文转载自CSDN
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 iphone6无服务有基带 的文章

 

随机推荐