微服务架构是一种既定模式,用于构建由松散耦合模块组成的复杂系统。它是过去几年中最受关注的软件架构趋势之一。将一个大型的、相互依赖的系统分解成许多小的、轻量级的模块,这似乎是一个非常简单的想法,这些模块可以使软件管理更容易。
这里有一个要点:在将整体应用程序分解为小模块之后,应该如何以有意义的方式将它们连接在一起?不幸的是,这个问题没有单一的正确答案,但通常情况下,有几种方法取决于应用程序和个别用例。
微服务中使用的两种常见协议是使用资源 API 的 HTTP 请求/响应和跨多个微服务通信更新时的轻量级异步消息传递。让我们探索这些协议。
微服务可以通过多种不同的通信模式进行通信,每种模式都针对不同的用例。这些类型的通信主要可以分为两个维度。第一个维度定义通信协议是同步的还是异步的:

同步与异步通信第二个维度定义了通信是有一个接收者还是多个接收者:

微服务之间最常见的通信类型是在调用 REST API 时使用同步协议(如 HTTP/HTTPS)的单接收器通信。微服务通常使用消息协议在微服务之间进行异步通信。这种异步通信可能涉及单个接收器或多个接收器,具体取决于应用程序的需要。
表述性状态传输 (REST) 是一种流行的请求和响应通信架构风格,它可以作为同步通信类型的一个很好的例子。这是基于 HTTP 协议,包含 GET、POST、PUT、DELETE 等动词。在这种通信模式中,调用者等待服务器的响应。

图 1:基于 REST API 的通信
REST 是服务间通信最常用的架构风格,但在涉及微服务架构时,严重依赖这种类型的通信会产生一些负面影响:
消息在遵循异步协议的微服务架构中被广泛使用。在此模式中,服务发送消息而不等待响应,并且一个或多个服务异步处理消息。异步消息传递提供了许多好处,但也带来了幂等性、消息排序、毒消息处理和消息代理的复杂性等挑战,这些消息代理必须具有高可用性。
重要的是要注意异步 I/O 和异步协议之间的区别。异步 I/O意味着调用线程在执行 I/O 操作时不会被阻塞。这是软件设计方面的一个实现细节。异步协议意味着发送方不等待响应。

图 2:基于消息的通信
异步消息传递与同步消息传递相比有一些优势:
尽管异步消息传递有很多优点,但它也有一些折衷:
异步消息传递已经成熟为多种消息传递模式。这些模式适用于分布式系统的多个部分必须以可靠和可扩展的方式相互通信的场景。让我们来看看其中的一些模式。
发布/订阅模式意味着发布者将消息发送到消息代理上的通道。一个或多个订阅者订阅频道并以异步方式从频道接收消息。当微服务需要向大量消费者广播信息时,此模式很有用。

图 3:发布/订阅模式
发布/订阅模式具有以下优点:
使用这种模式有一些缺点:
在基于队列的模式中,发送方将消息发布到包含接收方所需数据的队列。队列充当缓冲区,存储消息直到它被接收者检索。接收者从队列中检索消息并按照自己的节奏处理它们。此模式对于使用容易过载的服务的任何应用程序都很有用。

图 4:基于队列的模式
基于队列的模式有以下优点:
使用这种模式有一些缺点:
异步通信通常通过消息代理进行管理。在为异步通信选择正确的消息传递基础设施时,需要考虑一些因素:
微服务越来越成为设计可扩展和弹性系统的实际方法。微服务之间的所有通信都没有单一的方法。RESTful API 提供请求-响应模型以在服务之间进行通信,而异步消息传递则在不同服务之间提供更具可扩展性的生产者-消费者关系。尽管微服务可以通过消息传递和 REST API 相互通信,但消息传递架构是提高敏捷性和快速移动的理想选择。它们常见于使用微服务的现代应用程序或任何具有解耦组件的应用程序中。
在为您的微服务选择合适的通信方式时,请务必将消费者的需求与一种或多种通信类型相匹配,从而为您的服务提供强大的接口。
我正在尝试使用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..
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
最近,当我启动我的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
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我想在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文件夹下。您可以尝试手动删除
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些