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

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

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 著 / 崔力强 张骏 译)

相关文章: 

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

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

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

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


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

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

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

相关文章

什么是加密算法

转载自 什么是加密算法 Java的加密知识也是Java常见的领域之一,加密技术的底层确实很复杂,运用了大量的数学知识,要弄明白非常复杂。但是Java语言中运用密码加密工具却是非常简单。我们在Java里面运用这些加密技术,只需要把原理…

Android传感器的使用

Android 中主要的传感器有以下几种 TYPE_ACCELEROMETER 加速度传感器又叫 G-sensor,该数值包含地心引力的影响,单位是 m/s 测量应用于设备 x 、y、z 轴上的加速度。 将手机平放在桌面上,x 轴默认为0,y 轴默认0,z 轴默…

理解C# 4 dynamic(2) – ExpandoObject的使用

ExpandoObject的使用非常简单,很容易入手。上一篇里面已经有详细的介绍了,可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用) 下面对ExpandoObject的使用场合和一些认为需要注意的地方,谈一下自己的看法: 一…

谈谈服务限流算法的几种实现

转载自 谈谈服务限流算法的几种实现 保障服务稳定的三大利器:熔断降级、服务限流和故障模拟。今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流。 为什么需要限流 按照服务的调用方&…

Android如何实现NoActionBar以及Theme.NoTitleBar.Fullscreen效果

效果一 NoActionBar 无论Activity继承自Activity还是AppCompatActivity 只需要在styles中的修改Theme <style name"AppTheme" parent"Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name"colorPrima…

自己动手写一个能操作redis的客户端

转载自 自己动手写一个能操作redis的客户端 引言 redis大家在项目中经常会使用到。官网也提供了多语言的客户端供大家操作redis,如下图所示 但是&#xff0c;大家有思考过&#xff0c;这些语言操作redis背后的原理么&#xff1f;其实&#xff0c;某些大神会说 只要按照redis…

离线安装 VS2017 的正确姿势

国内的网络环境&#xff0c;真的是有很大的不同&#xff0c;有的人装 VS 的时候&#xff0c;号称满速&#xff0c;有的人&#xff08;其实就是我&#xff09;要等它下载很久&#xff0c;还告诉我有个组件没有安装成功。很久很久以前&#xff0c;VS 是提供 ISO 版的离线安装包的…

Android中ImageView的旋转与缩放

说明在代码中已经注释 XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wra…

ASP.NET Core MVC四种枚举绑定方式

前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便&#xff0c;之前我们探讨过在ASP.NET MVC中下拉框绑定方式&#xff0c;这节我们来再来重点看看枚举绑定的方式&#xff0c;充分实现你所能想到的场景&#xff0c;满满的干货&#xff0c;你值得拥有。 探讨枚举绑…

关于分布式事务、两阶段提交协议、三阶提交协议

转载自 关于分布式事务、两阶段提交协议、三阶提交协议 随着大型网站的各种高并发访问、海量数据处理等场景越来越多&#xff0c;如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。 为了解决这样一系列问题&#xff0c;大型网站的架构也在不断发展。提高…

React对标签属性进行限制(props)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>对props进行限制</title> </head> <body><!-- 准备好一个“容器” --><div id"test1"></div><div …

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

在微服务集成——《微服务设计》读书笔记文章中&#xff0c;我们说过服务间的消息传递有几种方式&#xff0c;一种是请求/响应技术&#xff0c;另一种是基于事件的机制。 RPC&#xff08;远程过程调用&#xff09; RPC是Remote Procedure Call的简称。 这是请求/响应技术的一种…

jdbc事务和事务的隔离级别

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

Android自定义View画钟表

第一种使用背景表盘 主要代码&#xff1a; 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的问题就是它是一个万金油&#xff0c;什么都可以做&#xff0c;但是又都不专注。使用DynamicObject正好可以解决这个问题。这篇文章介绍DynamicJson是如何继承…

jsx中的注释的写法

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

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

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

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

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

分布式系统Paxos算法

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