服务的协作:服务间的消息传递——《微服务设计》读书笔记

    在微服务集成——《微服务设计》读书笔记文章中,我们说过服务间的消息传递有几种方式,一种是请求/响应技术,另一种是基于事件的机制。

RPC(远程过程调用)

      RPC是Remote Procedure Call的简称。

      这是请求/响应技术的一种,它使用本地调用的方式和远程进行交互,如SOAP、Thrift等,比如我们常使用的WebService和Java RMI,就是这种类型。它先在本地生成桩代码,然后通过桩代码进行远程调用。

      RPC会带来一些问题,如Java RMI,其耦合性较紧,同时RPC会对调用进行大量的封装和解封装,同时修改接口时会造成服务的提供方和调用方都要修改。

 

REST

      REST是受Web启发而产生的一种架构风格,REST风格包含的内容很多,Richardson的成熟度模型(http://martinfowler.com/articles/richardsonMaturityModel.html),其中有对REST不同风格的比较。

      REST本身并没有提到底层应该使用什么协议,最常用的是HTTP,HTTP本身提供了很多功能,这些功能对于实现REST风格非常有用,比如HTTP的动词(GET、POST、PUT等)就能很好地和资源一起使用。

      在使用REST时,传输的数据格式是XML还是JSON,这个没有一个定论。

      基于HTTP的REST也有缺点:1.它无法帮你生成桩代码,2.在要求低延迟的场景下,每个HTTP请求的封装开销可能是个问题,使用TCP、UDP可能更合适。

 

基于事件的异步协作

       这种方式主要有两个部分需要考虑:微服务发布事件消费者接收事件机制。

      消息队列(如RabbitMQ)可以同进处理上述两方法的问题。生产者使用API向代理发布事件,代理可以向消费者提供订阅服务,并且在事件发生时通知消费者。这种代理甚至可以跟踪消费者的状态,如标记哪些消息是该消费者已经消费过的。这种系统通常具有较好的可伸缩性和弹性,但这么做会增加开发流程的复杂度,因为你需要一个额外的系统(即消息代理)才能开发及测试服务。

      另一种方式是使用HTTP来传播事件,ATOM是一个符合REST规范的协议,可以通过它提供资源聚合的发布服务,当服务提供方发生改变时,只需要简单地向该聚合发布一个事件即可,消费者会轮询该聚合以查看变化。它的缺点是:HTTP不擅长处理低延迟的场景,而且使用ATOM的话,用户还需要自己追踪消息是否送达及管理轮询等工作。

      异步架构有其复杂性,比如,消息丢失了怎么办?消息重试失败了怎么办?消息重发了怎么办?消息请求崩溃了怎么办?我们可以通过设置最大重试、黑名单、白名单等措施来解决这些问题。但这也意味着复杂性的增加。

 

参考

      《微服务设计》(Sam Newman 著 / 崔力强 张骏 译)

相关文章: 

  • 微服务的概念——《微服务设计》读书笔记

  • 微服务架构师的职责——《微服务设计读书笔记》

  • 建模:确定服务的边界——《微服务设计》读书笔记

  • 微服务集成——《微服务设计》读书笔记

原文地址:http://www.cnblogs.com/gudi/p/6624917.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

事务、视图和索引

一、事务: 1.概念:是作为单个逻辑工作单元执行的一系列操作 2.多个操作作为一个整体向系统提交,要么都执行,要么都不执行。 3.事务是一个不可分割的工作逻辑单元。 二、事务的四个特性: 1.原子性 2.一致性 3.隔离性 4.…

jdbc事务和事务的隔离级别

转载自 jdbc事务和事务的隔离级别 在jdbc的使用中以最简单的jdbc的使用为例,说明了jdbc的具体用法。然而在通常项目中,需要考虑更多内容,例如事务。 事务,在单个数据处理单元中,存在若干个数据处理,要么整…

Android自定义View画钟表

第一种使用背景表盘 主要代码: package com.zjs.zidingyiview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.os.Message; impo…

记录程序人生

许久,没有在博客上发关于自己的记录了。 以前还是经常在博客上写长篇大论来记录生活的,其中有几篇博文被学生和其他朋友们都做一个励志来勉励自己的,我不由的感到自豪。 那时候在上学,貌似在上班之后就没有在写过类似“励志”的…

理解C# 4 dynamic(3) – DynamicObject的使用

上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了xpandoObject的基本使用。但ExpandoObject的问题就是它是一个万金油,什么都可以做,但是又都不专注。使用DynamicObject正好可以解决这个问题。这篇文章介绍DynamicJson是如何继承…

jsx中的注释的写法

{}表示里面要写js语句 js语句里面的注释为/**/

Java中的位移运算

位移运算符 左移 “a<<b”将二进制形式的a逐位左移b位&#xff0c;最低位空出来的b位补0。 带符号右移 “a>>b”将二进制形式的a逐位右移b位&#xff0c;最高位空出来的b位补原来的符号位。 无符号右移 “a>>>b”将二进制形式的a逐位右移b位&#xff0c…

sqlserver存储过程

一、存储过程 1.预先存储好的sql程序&#xff0c;保存在sqlserver中&#xff0c;通过名称和参数执行。 2.存储过程中可以包含&#xff1a;insert语句&#xff0c;update语句&#xff0c;delete语句&#xff0c;select语句&#xff0c;逻辑控制语句以及变量。 二、存储过程的优点…

微软正在用实际行动告诉你: 拥抱开源,微软是认真的

2017年4月19日至20日&#xff0c;由工业和信息化部指导、中国信息通信研究院主办、云计算开源产业联盟承办的"全球云计算开源峰会"在国家会议中心举行。微软.NET CORE开发平台荣获由峰会云计算开源产业联盟(OSCAR) 评选出的“尖峰开源技术”奖&#xff0c;标志着国内…

初识Windows程序

一、创建windows应用程序的步骤 1.新建项目 2.项目类型为C#项目 3.模板为windows应用窗体 二、构造方法&#xff1a; 语法&#xff1a;访问修饰符 类名(){} 三、命名规范前缀&#xff1a; 标签–>lable–>lbl 文本框–>textbox–>txt 组合框–>combobox–>cb…

React不提交表单并且获取表单中的数据

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_非受控组件</title> </head> <body><!-- 准备好一个“容器” --><div id"test"></div><!-- 引入…

Java中数组的赋值方式

方法一&#xff1a; 使用默认是初始值来初始化数组中的每一个元素 语法&#xff1a;数组元素类型 [ ] 数组名 new 数组元素类型[数组中元素的个数&#xff08;数组的长度&#xff09;] int [ ] number new int [10]; 方法二&#xff1a; 先赋值&#xff0c;然后在赋予默认的初…

分布式系统Paxos算法

转载自 分布式系统Paxos算法 这是一个有关Paxos算法非常形象的讲解与示范。Paxos是能够基于一大堆完全不可靠的网络条件下却能可靠确定地实现共识一致性的算法。也就是说&#xff1a;它允许一组不一定可靠的处理器&#xff08;服务器&#xff09;在某些条件得到满足情况下就能…

winform实现简单的计算器V1版本

最近在整winform程序&#xff0c;就做了些简单的案例出来&#xff0c;比如说下面的这个计算器&#xff1a; 这个的实现方式还是比较简单的。 首先按照图中的界面从工具箱中拉出来一个窗体&#xff0c;其中的显示结果“86”“1849”也是lable控件&#xff0c;最后放一个计算的…

用.netcore写一个简单redis驱动,调试windows版本的redis

1. 下载windows版本的redis 2.开发环境vs2017 新建一个 .net core控制台。 private static Socket socket new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private static BufferedStream buffer null; socket.NoDelay true; s…

JAVA封装性

1、封装性的概念 &#xff08;1&#xff09;封装性是面向对象思想的三大特征之一 &#xff08;2&#xff09;封装就是隐藏实现细节&#xff0c;仅对外提供访问接口。 &#xff08;3&#xff09;属性的封装、方法的封装、类的封装、组件的封装、模块化的封装、系统级封装。 2、封…

分布式系统的Raft算法

转载自 分布式系统的Raft算法 过去, Paxos一直是分布式协议的标准&#xff0c;但是Paxos难于理解&#xff0c;更难以实现&#xff0c;Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。 来自Stanford的新的分布式协议研究称为Raft&#xff0c;它是一个为真实世界应…

React类里面能写的东西

1.一般方法 2.赋值语句 3.静态方法 4.构造函数

构建布局良好的Windows程序

一、菜单栏控件MenuStrip&#xff1a; 1.name:菜单栏控件的名称 2.items:在菜单中显示项的集合 3.Text:与菜单相关联的文本 二、工具栏控件ToolStrip&#xff1a; 1.DisplayStyle:设置文本的显示方式&#xff0c;ImageAndText,显示图像和文本 2.Image:显示的图片 3.Text:显示的…

拆分:分解单块系统——《微服务设计》读书笔记

通常&#xff0c;我们可能已有有一个巨大的单块系统&#xff0c;如何实现微服务&#xff0c;我们需要把它分解。 从哪里开始拆分&#xff1a;接缝 接缝&#xff1a;从接缝处可以抽取相对独立的一部分代码&#xff0c;对这部分代码的修改不会影响系统的其他部分。这些接缝就可以…