微服务笔记

微服务是一个这些年才流行起来的软件架构,这篇文章主要是基于Martin Fowler的那篇文章的学习笔记以及一些心得。然后尝试用于工作中的软件架构演进。


1. 基于服务的组件化: 模块的划分

  1. 首先这里定义一下组件(component)
  • 定义:是一个软件单元,可以独立替换,也可以独立升级;
  1. 微服务和LIB的区别,
  • 首先微服务也会使用LIB
  • LIB库(libraries)都会被link到程序中,并且在进行内存中的函数调用;
  • 而服务(services)是一个进程外的概念,通过web服务请求或者远端调用来访问;
  1. 我们这里把服务(services)当作一个组件(component),是因为服务是可以独立部署的,而library库则不可以。
  • 如果一个应用程序是由多个LIB库组成的,那么任何一个LIB库的修改都会导致整个app重新部署;
  • 如果一个应用程序是有多个服务构成的,那么任意一个服务的更新,只要重新部署这个服务就好(仅限于服务间的接口不发生变更);
  1. 微服务的缺陷
  • 远程调用更加消耗资源;
  • 远程API的颗粒度更粗,更不友好;

2. 围绕业务能力(Business Capability)进行组织: 开发团队的组织模式

举个例子,我们考虑实现一个应用程序(或者网站),通常我们会从技术层面进行拆分

  • 用户界面 -> 好的,交给UI 团队了;
  • 业务逻辑 -> 交给逻辑团队
  • 数据库 -> 交给数据库团队
    这个时候就会出现一个现象,任何一个小的改动(feature)都会涉及所有的团队;需要把这个功能再分解到各个团队,团队之间在进行沟通,讨论接口方案,而后各自实现,最终一致提交测试,最终交付。


微服务则不一样:基于业务能力(business capacity)来对服务进行划分和组织
每一个服务都可以使用不同的技术栈来实现

  • UI
  • 持久存储
  • 以及对外协作


这种情况下对于团队来说是跨职能的,需要各种各样的技术(Feature Team)

  • 用户体验
  • 数据库
  • 项目管理

3. 是产品(Product)不是项目(Program):项目管理的模式

传统的项目模式是,我们的目标是完成一个软件的开发,然后就提交给维护的组;项目结束,项目组解散。

微服务的目标是避免这种模式

  • 每个team应该负责整个产品的生命周期
  • 开发者需要接触他们软件的生产环境,增加与用户的联系

同样的方法也能用在单体应用程序上,但是服务的颗粒度更小,使得它更容易在开发者和用户之间建立个人关系。

4. 智能端点和哑管道:服务之间的交互原则

当我们在不同的进程间构建通信体系的时候,我们通常会把智能强压进通信机制本身。

微服务则主张另一种方法,智能端点(端点负责更多的处理)和哑管道(管道功能单一通用)
基于微服务而构建的应用程序会尽可能的解耦和内聚。

  • Endpoint要是智能的,可以处理和过滤消息
  • 管道是简单,只是负责转发消息

微服务团队使用的规则和协议正好就是设计万维网的规则(更扩展一步说,就是Unix的设计规则)。
第二种方法是基于轻量的消息总线,比如说RabbitMQ或者ZeroMQ

  • 只是提供一个可靠的异步通信结构(只做消息路由,所以称为哑的)
  • 只能依旧存在于Endpoint中,负责消息的生成和消费

单体应用程序,不同的组件都运行在同一个进程中;他们之间的通信都是通过函数调用的方式进行;
拆解成微服务后,最大的一个变化是通信方式的变化

  • 最简单的方法是,从内存函数调用转变成RPC;但是会导致通信频繁性能不佳;
  • 所以,你需要变更这种细颗粒度的通信到更粗颗粒度的通信方式

5. 去中心化治理:更高的自由度

5.1. 你可以使用各种你喜欢的技术栈来实现新功能了

集中治理的一个后果就是单一的技术平台标准化发展趋势。
你可能只会用一种语言去实现这种单一的应用程序。

单体的组件分裂成服务之后

  • 你可以用node.js去实现一个简单的报告页面
  • 也可以用C++去实现一个接近实时处理的组件
  • 等等

5.2 去中心化的数据管理

去中心化的数据管理表现在很多不同方面。
最抽象的来说的话,就是不同的系统里面对于世界的概念模型也是完全不一致的。比如说一个大公司里面,销售眼里的客户和技术支持里面客户就是不一样的。

这个问题(差异的世界观?)也常见于应用程序之间,但是它也会出现在应用程序内,尤其是一个应用程序被分割成了多个单独的组件。
一种非常有用的思维方式是领域却动的设计(Domain-Driven Design)。DDD这种设计方式会把一个复杂的领域划分成多个有界的上下文,并且建立出他们之间的映射关系。这种流程对于单体应用以及微服务都是有效的。

和概念模型的去中心化决策一样,微服务也会使用去中心化数据存储决策。单体应用更喜欢单一的逻辑数据库做数据存储,而企业也更倾向于多个应用程序共用一个数据库(有时候也是由于license所决定的)。
微服务则允许每个服务管理自己的数据库,可以使用相同的数据库技术的不同实体,也可以使用不同的数据库技术。
这就是所谓的混合持久化(Polyglot Persistence)


对于微服务之间的数据,去中心化的责任(会有不同的服务组件影响这些数据)对于管理升级是有影响的。处理更新最常用的方法是用事物来保证一致性。

NOTE: 使用事务有助于一致性,但是会带来明显的临时耦合。而分布式事务是非常难以实现的,所以微服务架构强调服务间的无事务协作。 这里需要有个明确的认知,就是所谓的一致性只是在最终达到一致,或者是通过一些补偿的操作来进行处理.

5.3 允许试错

对于很多个开发团队来说,这样的非一致性管理的方法是一种新的挑战,然而这又是一种匹配日常业务(business)时间的处理方式。日常的业务会处理很多的不一致性以达到快速响应的目的。我们允许试错,允许返工,并以此为代价(牺牲一致性)来保证生意不会丢。

6. 基础设施的自动化:让你的生活更加简单

其实微服务的自动化是在先前的持续集成以及持续交付的基础上发展而来的。
自动化的编译,集成测试,性能测试,以及生产环境的部署。


image.png

几个关键点
- 自动化测试
- 自动化部署

自动化的引入让“做正确的事情”这件事儿变得更加容易了。

7. 为失败设计: 设计模块的前提就是要容忍各种失败

7.1 任何时候都有可能失败

使用服务作为组件的一个后果就是,应用程序需要设计成他们能容忍某些服务的失败,任何服务的调用都可能由于提供服务方的不工作而失败,调用端需要能容忍这些失败。
这个是相对于单体应用的一个劣势,你需要考虑各种可能失败的场景以及对于用户体验的影响。
由于服务会在任何时候都会失败,所以需要尽快的检测到失败,并且如果可能的话,要能自动恢复服务。

7.2. 所以我们需要实时监控

微服务应用程序增强了应用程序的实时监控,不仅检查软件架构相关的元素(比如说一秒钟多少次数据库查询请求),还要业务相关的指标(比如说每分钟收到的订单次数)
这种监控对于微服务架构尤为重要,因为微服务偏好编排和时间协作,但是这个会导致突发行为的发生。监测对于快速发现不良的突发行为至关重要

NOTE: 同步调用被认为是有害的

8. 进化式设计:让重构变得更加简单

8.1. 学会控制变化

微服务的从业者,通常有进化式设计的背景,并且把服务的分解看成是一个进一步的工具来保证开发者可以控制应用程序的变化但是却又并不会减缓应用程序的变化。
控制变化并不意味着就是减少变化。使用正确的态度和工具,你可以迅速频繁的并且可控的去修改软件。 (持续的重构,模块越小,重构的负担就越轻,就越加可控)
不管什么时候你去尝试把一个系统变成多个组件,你都会面临这样的决策,怎么切分。这个时候切分的原则是什么呢?

  • 组件的关键特性是,独立的替换,独立的升级;这就意味着如果我们重写了一个组件,那么我们不会影响它的协作方。

8.2. 记住,任何一个服务都是有可能会被废弃的

很多微服务组织会明确的表明这里面的一些组件有可能被废弃,以这个为前提来进行划分组件

Guardian这个网站就是一个最初设计成单体应用,但是最终演进到微服务架构的一个很好的例子。这个网站的核心依旧是个单体应用,但是他们非常乐于通过添加微服务组件的方式来添加新的功能,而这些微服务组件使用的还是单体应用的API。这种方法对于天然临时的特性特别方便,比如说处理体育赛事的专题页面,网站的这一部分可以使用快速开发语言去构建,赛事结束后立即丢弃。 --> 模块的可丢弃性

8.3. 更一般的原则,服务是可替代的

模块设计过程中,强调可替代性是一个更加一般的原则。

  • 你应该要想办法把会同一时间发生变更的内容(功能)放到同一个模块中去
  • 而这个时候不怎么变化的那些内容(功能),我们应该放到别的组件中去
  • 如果你发现你重复的在一起修改两个服务,那你就有可能要把他们合并到一起去了

参考

https://martinfowler.com/articles/microservices.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容