这是一本关于微服务架构设计方面的书,这是本人阅读的学习笔记。首先对一些符号做些说明:
()为补充,一般是书本里的内容;
[]符号为笔者笔注;
微服务架构将应用程序构建为一组服务,这些服务必须经常协作才能处理各种外部请求。而服务的实例通常是在多台机器上运行的进程,所以它们必须使用进程间通信进行交互。
当前有多种进程间通信机制,比较流行的是REST(使用JSON)。选择合适的进程间通信机制是一个重要的架构决策,它影响应用程序的可用性。
进程间通信技术有:基于同步请求/响应、异步的基于消息的通信机制等。

MAJOR.MINOR.PATCH;消息格式会影响进程间通信的效率、API的可用性和可演化新。使用跨语言的消息格式尤为重要;
指客户端使用同步的远程过程调用协议(如REST)来调用服务。

图解:客户端业务逻辑调用代理接口,这个接口由远程过程调用代理适配器类实现。远程过程调用代理向服务器发送请求,该请求由远程过程调用服务器适配器类处理,该类通过接口调用服务的业务逻辑。然后它将恢复发送回远程过程调用代理,该代理将结果返回给客户端的业务逻辑。
REST是一种(总是)使用HTTP协议的进程间通信机制。
特点:
好处:
弊端:
gRPC是一个用于编写跨语言客户端和服务端的框架,是一种二进制协议。
特点:
好处:
弊端:
客户端和服务端是独立的进程,服务端很可能无法在有限的时间内对客户端的请求作出响应。

图解:当Order Service无响应时,OrderServiceProxy将无限期地阻塞,等待响应。会消耗时间、浪费线程等资源。最终API Gateway将资源消耗,无法处理请求,整个API不可用。
解决方法是:
服务及其客户直接与服务注册表交互;

通过部署基础设施来处理服务发现;

使用消息机制时,服务之间的通信采用异步交换消息的方式完成。
基于消息机制的应用程序通常采用消息代理;另一种选择是使用无代理架构。
消息由消息头部和消息主体组成;

有以下两种类型的消息通道:
介绍下面四种交互方式的消息机制:

服务的异步API规范必须制定消息通道的名称、通过每个通道交换的消息类型及其格式。

在无代理的架构中,服务可以直接交换信息。
好处:
弊端:
举例:

消息代理是所有消息的中介节点;发送方将消息写入消息代理,消息代理将消息发送给接收方。
好处:
弊端:
举例:

问题描述:在横向扩展多个消息接收方的实例的情况下,消息的顺序可能会错位。
解决方法:使用分片消息通道扩展接收方;

图解:
问题描述:客户端、网络或消息代理的故障可能导致消息被多次传递。
有以下两种解决办法:



服务需要使用库来发送和接收消息。
有两种方法:
采用同步通信机制处理请求,会对系统的可用性带来影响。因此,应尽可能选择异步通信机制来处理服务之间的调用。

使用异步交互模式:

复制数据:



总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende