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

一.理想的集成应该是什么样的?

1.避免破坏性修改

如果在一个微服务的响应中添加一个字段,服务的消费方不应该受到影响。

2.保证API的技术无关性

微服务之间的通信应该是与技术无关的。

3.使服务的消费方易于使用

如果消费方使用该服务比登天还难,那么无论该微服务多漂亮都没用任何意义。但同时,易于使用的服务可能内部封装了很多细节,这会增加耦合。

4.隐藏内部实现细节

消费方与服务方的内部细节应该是分开的,如果与细节绑定,则意味着改变服务内部的一些变化,消费方也要跟着修改,这会增加修改的成本。

二.数据库是否应该共享

共享数据库是最快的集成方式,但这种方式应该避免。

如果是这样,那么外部的服务则能查看内部的实现细节,并与其绑定在一起,存储在数据库中的数据结构对所有人来说都是平等的,数据库是一个很大的共享API,那么为了不影响其他服务,必须非常小心地避免修改与其他服务相关的表结构。这样的情况下,需要做大量的回归测试来保证功能的正确性。

如果是这样,消费方与服务方的特定技术绑定在了一起,如果消费方要从关系型数据库换成非关系型数据库,那么这样是不容易实现的。这不符合低耦合的原则。

如果是这样,那么原本由服务方提供的修改,现在可以由各个消费方直接操作数据库来完成,而且每个消费方可能都会有一套自己的修改方法。这不符合高内聚的原则。

三.服务的协作:同步or异步?

对于同步方式而言,我们可以用请求/响应来概括整个过程,发起方发起一个远程调用后,发起方会阻塞自己并等待整个操作的完成,同步对于响应的低延迟有着高要求,因而在现在,这也是不太实际的。我们通常选用方式。

异步的通信模型有两种。

一种是请求/响应方式,这与同步的不同,它是在发起一个请求时,同时注册一个回调,当服务端操作结束之后,会调用该回调。

一种是基于事件的方式,服务提供方不发起请求,而是发布一个事件,然后期待调用方接收消息,并知道该怎么做,服务提供方不需要知道该或者什么会对此做出响应,这也意味着,你可以在不影响服务提供方的情况下对该事件添加新的订阅。

四.服务的编排与协同

如果你注册一家网站,它在注册时做了下面3件事:

(1)在客户的积分账户上创建一条记录

(2)通过EMS系统发送一个欢迎礼包

(3)向客户发送欢迎电子邮件

当考虑实现时,编排是一种架构风格,它由一个中心大脑来指导并驱动整个流程。它可由客户管理这个服务来承担,在创建客户时会跟积分账户服务、电子邮件服务及EMS服务通过请求/响应的方式进行通信。客户管理服务可以对当前进行到了哪一步进行跟踪,它会检查积分账户是否创建成功、电子邮件是否发送出去、EMS包裹是否寄出。这种方式的缺点是:客户管理服务承担了太多职责,它会成为网关结构的中心和很多逻辑的起点。这样会导致少量的“上帝”服务,而与其打资产的那些服务通常会沦为贫血的CRUD服务。

另一种实现的风格则是协同,它仅仅告知各个系统各自的职责,具体的实现留给他们自己。就上例而言,客户管理服务创建一个事件,邮件服务、积分服务、EMS服务会订阅这些事件并做相应的处理,如果其他的服务也关心客户创建这件事情,它们只需要简单的订阅该事件即可。这种方式能显著地消除耦合,但这需要额外做一些监控工作,以保证其正确进行。我们可以建一个跟业务流程相匹配的跟服务的监控服务,分别监控每个服务。

五.服务的版本管理

1.尽可能推迟修改

比如我们可以使用XPATH来读取XML,它可以忽略XML的一些修改,Martin Fowler称之为容错性读取器(http://martinfowler.com/bliki/TolerantReader.html)。

接收消息的一方应尽可能灵活地消费服务,这就是鲁棒性原则(https://tolls.ietf.org/html/rfc761),它认为每个模块都应该宽进严出。

2.及早发现破坏性修改

尽量对修改的影响进行全面的回归。

3.使用主义化的版本管理

每个服务的版本号支持:Major.Minor.Patch的格式,其中Major的改变意味着其中包含着向后不兼容的修改;Minor的改变意味着有新功能的加入但应该是向后兼容;Patch的改变代表对已有功能的缺陷修复。

4.不同版本的接口共存

当不得不这么做时,我们的生产环境可以同时存在接口的新老版本。

假如一个接口存在着V1、V2、V3三种版本,我们可以在所有对V1的请求转换给V2,然后V2转换给V3,这样是一种平滑的过度,首先扩张服务的能力,对新老两种都支持,然后等老的消费者都采用了新的方式,再通过收缩API去掉旧的功能。

我们也可以在URI中存放版本信息,但同时我们需要一套方法来对不同的请求进行路由。

5.不同版本的服务共存

短期内同时使用两个版本的服务是合理的,尤其是当你做蓝绿部署或者金丝雀发布时,在这些情况下,不同版本的服务可能只会存在几分钟或者几个小时,而且一般只会有两个版本。升级消费者到新版本的时间赵长,就越应该考虑在同一个微服务中暴露两套API的做法。

六.服务的UI管理

PC端的程序我们需要关注浏览器和分辨率;移动端的程序我们需要关注带宽和手机的电量,甚至是地区发展的水平(也许使用短信登录更符合当地的实际);在平板上,我们很难使用右键操作。我们通过把服务的功能进行不同的组合,可以为Web、移动端、可穿戴设备提供不同的体验。那么,如何很好的组织起来呢?这就是UI管理面临的问题。

如果组织一个移动端的页面,需要调用20个服务,那么对于移动设备来说会有些吃力,我们可以使用API Getway来缓解这一问题,这种模式下多个底层的调用会被聚合成一个调用。

另外一种方式是让服务暴露出一部分UI,然后只需要简单地把这些片段组合在一起就可以创建出整体UI。也许音乐商店的订单管理团队可以对所有与订单管理相关的页面负责。但在最后,我们仍然需要将这些UI集成在一起,我们可以使用类似服务器模板的技术来实现。这种方式的优势是可以完成快速修改,但很难保证用户体验的一致性,因为各个服务的维护,它们给出的UI风格可能迥异,同时如果你给PC、Web、平板、移动端都提供HTML方式的UI,那么你需要进行一系列的组件嵌入处理,而原生的应用有可能提供更大好的体验。

七.与外系统集成

可以在外系统上再包装出一些服务,对调用者隐藏细节,或者捕获所有的请求,并决定是否路由到遗留代码还是导向新的代码中,这种方式可以帮助我们从老系统进行替换,从而避免影响过大的重写。

参考

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

时间: 2024-10-21 08:40:58

微服务集成——《微服务设计》读书笔记的相关文章

响应式web设计读书笔记

1.媒体查询可以在链接link标签和具体的CSS中使用: 2.通过<link>标签的 media 属性为样式表指定设备类型和其他条件  中间用and和()来分隔,如下 <link rel="stylesheet" media="screen and (orientation: portrait) and (min-width: 800px)" href="800wide-portrait-screen.css" /> 3.

实现领域驱动设计 读书笔记 1-3章

前言 大事拆分为小事,小事抓住重要事,重要事中做好基础事,基础事中坚持规矩办事.--于18年2月杭州滨江出差时发的一个朋友圈 最近换了一个项目在做,有用到ddd架构,从此结缘ddd,遂翻书以作深入理解 1.什么是DDD,为什么要是使用它? 2.领域 子域 和限界上下文 3.上下文映射图 原文地址:https://www.cnblogs.com/jdzhang/p/8684828.html

《微服务设计》读书笔记大纲

cha1:微服务的概念--<微服务设计>读书笔记 cha2:微服务架构师的职责--<微服务设计读书笔记> cha3:建模:确定服务的边界--<微服务设计>读书笔记 cha4:微服务集成--<微服务设计>读书笔记 服务的协作:服务间的消息传递--<微服务设计>读书笔记 cha5:拆分:分解单块系统--<微服务设计>读书笔记 cha6:部署:持续集成(CI)与持续交付(CD)--<微服务设计>读书笔记 cha7:测试--<

读书笔记: 博弈论导论 - 17 - 不完整信息的动态博弈 建立信誉

读书笔记: 博弈论导论 - 17 - 不完整信息的动态博弈 建立信誉 建立信誉(Building a Reputation) 本文是Game Theory An Introduction (by Steven Tadelis) 的学习笔记. 为什么我们要建立良好的信誉?为什么我们更愿意和有信誉的人交往? 本章从囚徒困境这个问题,证明了即使在2阶段的囚徒困境中,如果一方有可能选择合作(也就是沉默),另一个方在第一阶段也有可能选择合作. 让我们回忆一下囚徒困境. 囚徒困境的均衡是双方都告密. 在有限

规模化微服务——《微服务设计》读书笔记

    系列文章目录:     <微服务设计>读书笔记大纲 改变思维的角度:故障无处不在 当微服务规模化后,故障是无可避免的,以往我们总是想尽力避免故障的发生,而当故障实际发生时,我们往往束手无策.我们花了很多时间在流程设计和应用设计的层面上来阻止故障的发生,但实际上很少花费时间思考如何第一时间从故障中恢复过来. 一些公司喜欢组织活动,活动当天系统会被关掉以模拟故障发生,然后不同团队演练如何应对这种情况.这些项目中最著名的是混乱猴子(Chaos Monkey),在一天的特定时间随机停掉服务器,

【读书笔记】微服务架构与实践

一:概述 微服务实在互联网大浪潮下顺势而起的 微服务降低了单个问题的复杂性,但是提高了整体上运维和部署的难度 二:基础篇 提出以下4个问题 神马是微服务 微服务到底怎么发展起来的? 微服务的优势在哪儿里?为什么现在大家都在谈微服务 微服务有不什么不足,或者对使用微服务说有什么挑战? 作为从业者的我们到底要怎么看待微服务,并且如何在实际的工作项目中使用它? 分别针对上面的四个问题,做出解答 什么是微服务? 微服务更像是一种架构模式,不是某种具体的技术.提倡将单一的应用划分为一组小的服务,服务之间相

微服务的4个设计原则和19个解决方案

转载本文需注明出处:微信公众号EAWorld,违者必究. 微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境. 本文将介绍微服务架构的演进.优缺点和微服务应用的设计原则,然后着重介绍作为一个"微服务应用平台"需要提供哪些能力.解决哪些问题才能更好的支撑企业应用架构. 微服务平台也是我目前正在参与的,还在研发过程中的平台产品,平台是以SpringCloud为基础,结合了普元多年来对企业应用的理

微服务的4大设计原则和19种解决方案

微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境. 本文将介绍微服务架构的演进.优缺点和微服务应用的设计原则,然后着重介绍作为一个"微服务应用平台"需要提供哪些能力.解决哪些问题才能更好的支撑企业应用架构. 微服务平台也是我目前正在参与的,还在研发过程中的平台产品,平台是以SpringCloud为基础,结合了普元多年来对企业应用的理解和产品的设计经验,逐步孵化的一个微服务应用平台. 目录:

《微服务》九大特性重读笔记

http://blog.didispace.com/20160917-microservices-note/ 今天重读了Martin Fowler的<Microservices>,在此记录一下对九大特性的理解. 服务组件化 组件,是一个可以独立更换和升级的单元.就像PC中的CPU.内存.显卡.硬盘一样,独立且可以更换升级而不影响其他单元. 在"微服务"架构中,需要我们对服务进行组件化分解.服务,是一种进程外的组件,它通过http等通信协议进行协作,而不是传统组件以嵌入的方式