AICon日程100%就绪,9折倒计时最后一周 了解详情
写点什么

微服务之旅的经验分享

  • 2016-12-12
  • 本文字数:1635 字

    阅读完需:约 5 分钟

多年来,我们一直努力展示众多微服务实践者在采用微服务的过程中获得的经验和教训 Piotr Gankiewicz 是一名软件工程师。他踏上了微服务之旅,现在决定分享一些过程当中的经验和教训。当然,就像所有的经验一样,它不是全都与你的实践相关,但是这些经验和教训还是值得了解的。正如 Piotr 说的:

不久前,我终于决定深入到微服务的世界了。我确实花了相当长的时间寻找使用这种架构模式的机会,并最终找到了。在经过三个月的尝试和学习,其中大部分都是自学(困难的方式),我相信是时候分享一些经验了。

他从讲述一些核心的系统设计方面开始,其中包括 API 管理(gateway)。他引入了“服务总线”的概念,而没有真的定义它。他还讨论了存储服务的添加:

[…] 为了在只读数据库(这里就是 CQRS 一类的东西)中存储对象,你很可能需要订阅所有类型的事件,像 UserCreated 和 InvoicePaid 等等。然后你需要与特定的(微)服务通信获取数据,然后将它存入数据库中。在这种场景下,你的 API 需要负责订阅事件、映射数据和保存数据到数据库。这有问题吗? 多数情况下当然没有。但是,我更倾向于下述解决方案。它将 API 和微服务完全分离。这样,就出现了所谓的存储服务,由它来订阅事件,从(微)服务获取数据等等。存储服务知道怎样扁平化数据。API 只需要给存储服务发送 HTTP 请求来获取数据。它并不需要关心数据是从哪里来的,是内部的数据库,还是缓存,还是处于天涯海角的某个服务。

最后在给出他的经验和教训(他称为“小贴士和窍门”)之前, 他用对服务的定义总结了设计方面。服务的部分定义包括:

每个(微)服务处理自己的领域模型、仓库、业务逻辑等等。整个基础服务唯一共有的是服务总线和一套命令和事件集合。

那么回到小贴士和窍门。我们这里只包含其中一部分。对那些认为微服务的大小重要的人,首先是“让服务尽量小”。

创建多个小型的专注于单一领域的微服务比创建少量臃肿的执行完全不同任务、在相同的范围内管理不相干职责的微服务要好。最常见的例子有:创建 / 验证用户账户、 发送消息、管理产品、处理支付等等。每个领域纳入到单独的有独特实体的服务中。

从别人对微服务、事件溯源和 CQRS 的说法展开,Piotr 认为 CQRS 至关重要:

遵循 CQRS,你需要做的全部事情是发送无返回值的命令和执行幂等的查询。如果你遵循这一模式,你会很快发现扩展应用程序简单多了,只需要分离读写操作。

接下来回到数据。为服务选择数据库的方式至关重要。这再次和其他人讨论的相似:

每个服务(不是单个服务实例,因为你可能有许多同一服务的实例运行在不同的节点上)都应该有自己的数据库。这样你不仅能消除单点故障(整个系统使用单一的庞大数据库) ,最重要的是还能自由选择最适合特定任务的数据库。你可能想使用 SQL 执行严重依赖事务的金融操作,或者使用 NoSQL 数据库存储数十亿 JSON 文档。

Piotr 提到了其它一些事情,如请求追踪(他举例说明了在他的学习之旅中的实现方法 )、使用异步消息方法(使用 HTTP)、确保新服务易于部署(可能隐晦地引用到持续集成和持续部署)以及编写端到端测试。最后提到的是“包含故障恢复、服务发现和其它一些有用的机制"。

任何时候出错了,你可能希望保证整个系统不会崩溃或者至少其中一部分不会崩溃。确保你引入了重试机制(比如 Polly )、服务发现工具,如 Consul 以及集中保存证书,比如使用 Vault Azure Key Vault 或者我的开源项目 Lockbox

Piotr 讨论的大部分和过去这些年别人说的非常相似,所以在使用微服务开发时我们很可能正趋向一个关于方法有效还是无效的共识。但是需要注意的是,尽管 Piotr 讨论了他的一些经验和教训,但是没有任何关于他开发的应用程序表现如何的说明(负载下扩展、恢复能力等等)。可能后期会有,我们拭目以待。

查看英文原文: Sharing Experiences from a Microservices Journey


感谢冬雨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-12-12 18:0010835
用户头像

发布了 33 篇内容, 共 11.2 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

等级测评是什么意思?工作流程包含哪些?

行云管家

网络安全 等保 等保测评 等级测评

24小时自助洗车让洗车更自由

共享电单车厂家

自助洗车加盟 24小时自助洗车

云流化技术在汽车行业中的应用

3DCAT实时渲染

XR 云流化

几个跨端开发神器

Geek_99967b

小程序 小程序容器

JS ES5也可以创建常量?🎃

德育处主任

JavaScript ES5 6月月更

观测云与 TDengine 达成深度合作,优化企业上云体验

TDengine

tdengine 物联网 观测云

更多龙蜥自研特性!生产可用的 Anolis OS 8.6 正式发布

OpenAnolis小助手

开源 操作系统 龙蜥社区 Anolis OS 8.6 版本发布

我的远程办公总结|社区征文

DS小龙哥

远程办公 初夏征文

【等级测评师】等级测评师怎么报名?多少分及格?

行云管家

等保 等保测评师 等级测评师

图文并茂!手把手教你在VMware中的安装部署Linux-CentOS7.4

迷彩

Linux centos 开发 6月月更

聊聊远程办公那些事儿 | 社区征文

joe

初夏征文

智能自助洗车机洗车都有哪些优势

共享电单车厂家

自助洗车加盟 智能自助洗车机

什么是XR扩展现实,XR云串流平台有哪些

3DCAT实时渲染

XR 云XR

做自助洗车合伙人要投入多少

共享电单车厂家

自助洗车加盟 自助洗车合伙人

Mybatis省略@Param注解原理

吴明

MyBatis标签 6月月更

dart:字符串replace相关的方法

坚果

flutter dart 6月月更

7 月 2 日邀你来TD Hero 线上发布会

TDengine

数据库 tdengine

“低代码”在企业数字化转型中扮演着什么角色?

优秀

低代码 数字化

Substrate 跨链技术源码级探索: XCVM的概览

彭亚伦

Substrate 跨链技术 波卡

Hologres共享集群助力淘宝订阅极致精细化运营

阿里云大数据AI技术

sql 大数据 分布式计算 存储 数据可视化

如何成为一名共享自助洗车合伙人

共享电单车厂家

共享自助洗车 自助洗车加盟 自助洗车合伙人

大学生研究生毕业找工作,该选择哪个方向?

C++后台开发

后端开发 应届生 C++后台开发 研究生 C++开发

实时渲染和预渲染有什么区别

3DCAT实时渲染

渲染 实时渲染

《网络是怎么样连接的》读书笔记 - 汇总篇

懒时小窝

网络

为了使远程工作不受影响,我写了一个内部的聊天室 | 社区征文

云小梦

微信小程序 wepy 初夏征文

你的城市还没有自助洗车?赶紧开个

共享电单车厂家

自助洗车加盟 开自助洗车店

2022中国国潮发展新动向

易观分析

国潮消费

一对一直播app开发时,如何使用Nginx安全?

开源直播系统源码

软件开发 直播系统 一对一直播 一对一直播源码 直播源码

大数据培训 | Flink专题面试

@零度

flink 大数据开发

数据安全合规之后,给风控团队带来了新的问题

博文视点Broadview

互联网研发效能实践之去哪儿网(Qunar)核心领域DevOps落地实践

laofo

DevOps 研发效能 持续交付 研发管理工具 工程效率

微服务之旅的经验分享_SOA_Mark Little_InfoQ精选文章