写点什么

微服务之旅的经验分享

  • 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:0011337
用户头像

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

关注

评论

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

LeetCode:2695. 包装数组,详细解释

Lee Chen

JavaScript LeetCode

OpenHarmony 4.0 Beta1发布,邀您体验

OpenHarmony开发者

OpenHarmony

架构模块一作业

sandywrh

问道价值互联网,区块链的下一个十年 | 2023开放原子全球开源峰会区块链分论坛即将启幕

开放原子开源基金会

区块链 开源 开放原子全球开源峰会

Amazon CodeWhisperer代码提示体验本文带你了解

我叫于豆豆吖.

云计算 亚马逊 亚马逊云

百度离线资源治理

百度Geek说

数据库 大数据 离线 企业号 6 月 PK 榜 6 月 优质更文活动

大厂面试必备!字节大佬刷Leetcode总结的算法笔记

Java 数据结构 算法 LeetCode

【体验有奖】玩转 AIGC,函数计算 x 通义千问预体验,一键部署AI应用赢Airpods

Serverless Devs

函数计算FC AIGC

瞄准“量效”难题,百度营销创新推出大健康线索营销解决方案-医效通

说山水

赋能生态合作 共话数字创新 | 2023开放原子全球开源峰会软硬协同开源分论坛即将启幕

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 软硬协同开源

阿里P8现身说法,解密“架构”原理与实战笔记:从分布式到微服务

Java 架构 分布式 微服务

来自大佬的洗礼!全网独家的SpringBoot核心文档,讲的太清晰了

Java Spring Boot

等待还是转行?GitHub爆赞的10W字Java八股文,你没得选择

Java java面试 Java八股文 Java面试题 Java面试八股文

浅谈微服务异步解决方案

Java 微服务 异步

最强AIGC实战应用速成指南来了!14天掌握核心技术

飞桨PaddlePaddle

人工智能 深度学习 百度飞桨

深入了解mock.js,打造出类似真实数据的模拟数据

Apifox

程序员 前端 前端开发 API Mock

10分钟了解Kubernetes网络

俞凡

架构 Kubernetes 云原生

瓴羊Quick BI报表分析工具,大幅提升企业经营效率

夜雨微澜

深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt、Res2Net、Swin Transformer、Vision Transformer等模型结构、实现、模型特点详细介绍

汀丶人工智能

人工智能 深度学习 计算机视觉 图像分类 6 月 优质更文活动

深度学习应用篇-计算机视觉-目标检测[4]:综述、边界框bounding box、锚框(Anchor box)、交并比、非极大值抑制NMS、SoftNMS

汀丶人工智能

人工智能 深度学习 计算机视觉 目标检测 6 月 优质更文活动

“变脸的秘密”!直播源码app开发技术特效功能的实现

山东布谷科技

源码剖析 APP开发 软件开发、 源码搭建 直播源码

探究核心技术&最佳实践,云原生OLAP论坛火热开启!

阿里云大数据AI技术

云原生

Jogger慢跑者链游系统开发NFT技术

薇電13242772558

NFT 链游

2023世界人工智能大会“AI生成与垂直大语言模型”论坛重磅来袭!

NLP资深玩家

什么是双机热备技术?华为和思科如何实现双机热备?

Java 网络 双机热备

开源赋能 工业铸魂 | 2023开放原子全球开源峰会开源工业软件分论坛即将启幕

开放原子开源基金会

开源 开放原子全球开源峰会 开源工业软件

深入探究Flink:实时处理与批量处理的完美结合

xfgg

Java flink 6 月 优质更文活动

首款搭载OpenHarmony 3.2的智能POS终端通过“开源鸿蒙”兼容性测评

科技热闻

打造高可用的微服务架构:Spring Cloud 的优化与实践

xfgg

Java 微服务 SpringCloud 6 月 优质更文活动

来了解Amazon CodeWhisperer的强大吧

初学者

云计算 亚马逊 亚马逊云

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