摘要:相比于传统的微服务架构,云原生和 serverless 技术更加灵活、高效,能够更好地满足用户的需求。
本文分享自华为云社区《《凤凰架构》学习和思考——云原生时代的服务架构演进史》,作者:breakDawn。
随着云原生的概念越来越火,服务的架构应该如何发展和演进,成为很多程序员关心的话题。大名鼎鼎的《深入理解java虚拟机》一书作者于21年推出了新作《凤凰架构》,从这本书中可以看到当前时下很多最新的技术或者理念。
DCE(Distributed Computing Enviroment) 分布式运算环境。
DCE的设计主旨:“开发人员不必关心服务是远程还是本地,都能够透明地调用服务或者访问资源”
是很早由OSF指定的分布式技术体系理论,解答了很多问题,例如:
但最终发现解决这些问题的代价 远超 分布式所带来的收益,在DCE刚提出的年代(80年代),机器资源并没到那个程度, 于是暂时被搁置了。
单体系统并不一定就代表是坏的,不好的。
如果是相同资源的前提下, 单体系统的性能是比分布式要高的。所有数据都是进程内通信,且开发、部署、测试都基于同一个对象进行处理,更加方便。单体系统中的代码一般也是做好了分层、分模块的,也是易于敏捷开发和迭代的。
然而如果单体系统中一部分代码出现缺陷, 可能直接把进程空间耗光,或者直接打崩整个进程,也没有办法针对某个代码模块做单独的升级或者更新。因此当系统规模较小的时候,单体系统有独特的优势。系统规模越来越大, 则要求各功能模块能够自治和隔离,减少爆炸范围。
从“追求尽量不出错”到“追求出错是必然”,是微服务架构挑战并取代单体架构的底气所在。
SOA(Service-Oriented-Architecture)叫做面向服务的架构,类似于各服务之间协议和通信方式高度一致性,各服务遵循完全相同的消息协议和管理机制。
终极目标是总结出一套自上而下的软件研发方法论,最后新厂家要开发系统时,八股文一般照搬SOA架构和实现即可
有一种参考的SOA架构是事件驱动架构,所有服务连接一个统一的消息管道,从管道中接收统一的事件消息和响应机制。
SOA落寞的原因:
微服务不是SOA的变体或者衍生品,微服务中的每一部分可以自由的选择其中的各种可选方案,例如远程调用有RMI、Dubbo、Rest;服务发现有ZK、Etcd等。也因为选择很多,对于架构师而言是一个很沉重的挑战。
对于注册、跟踪治理、均衡等问题,能否脱离应用代码实现, 直接在硬件层面来实现?很早以前行不通,因为硬件基础设置跟不上软件应用的灵活性。直到docker和k8s的出现。微服务时代离不开以docker为代表的早期容器化技术,微服务框架springCloud所支持的软件级别微服务治理功能,都能够在k8s中找到硬件层面的替代:
通过k8s和相关的虚拟化技术, 与业务无关的技术性问题可以从软件层面剥离,直接在硬件设置层面进行解决!
当涉及调用链路的切换或者变更, 单纯依靠DNS的硬件层面来做切换还是比较困难的,不如软件方案灵活。于是引入了“服务网格”的边车代理模式,类似于脱离应用代码,在容器中部署一个通信代理服务器,对于请求的熔断、变更、流量控制都可通过这个代理服务器来管控。这样微服务应用代码中无需再考虑任何和上面这些通信过程相关的逻辑了,全部通过第三方的代理服务器实现!
对于信息管理系统、网络游戏或者对后端接口响应速度较高的应用而言, 无服务并不是最佳选择, 因为无服务的函数肯定不会一直处理高活跃度状态,存在冷启动的情况,对于其响应性能会有影响。
在很多年前的架构或者介绍微服务的书中,基本都是从单体->SOA->微服务。但是现在,随着云原生和serverless等新概念的出现,微服务架构的发展已经越来越多元化。对于需要频繁接触云业务的开发者而言,这些新概念显得更加重要。在学习这个章节时,需要关注这些架构演进的原因和理由,比如SOA相比单体的优点和缺点,后微服务又是如何从理念上逐步领先了传统的微服务等。
而《凤凰架构》一书的后半章节内容,更多是聚焦容器、k8s等云原生的重要内容。
像基于容器、k8s的设计,云原生技术将原先软件能力中复杂的内容转移到了硬件层面进行替代,开发者能够用更集中的精力关心业务实现而非服务治理等繁杂的内容。
像华为云CCE服务对于部署云业务的服务而言就是云原生时代的重要一环,CCE服务可以面向云原生2.0打造CCE Turbo容器集群,计算、网络、调度全面加速,学习 CCE 服务可以帮助开发者更深入地了解 Kubernetes 和容器技术,从而提高自己的微服务开发和容器化应用部署能力。而无服务一般也是基于容器实现,对使用者而言基本不感知底层硬件资源,只需要调用即可,大大减少了创建和维护的学习和精力成本,即开即用的理念。 像华为云数据湖探索DLI、华为云湖仓构建LakeFormation等都是基于serverless实现的云服务,云用户基于这些serverless服务并结合华为MRS等大数据底座之后,可以快速运行自己的大数据作业或者数据统一管理等能力,构建数智融合的相关能力。
总而言之,相比于传统的微服务架构,云原生和 serverless 技术更加灵活、高效,能够更好地满足用户的需求。
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails