开始用一款"摩诺利"(Monolith, Not a Discriptiond Mess),我见过太多的团队直接跳入微服务,因为它听起来很现代.
结果通常是分布式单体:所有网络呼叫的痛苦,没有好处.
起先为结构完善的单体.
绘制清晰的模块边框,以软件包结构强制实施,只有在您有具体缩放或团队原因时才会提取服务.
Pitfall 1:技术层的过度分拆 分层服务(UI,业务逻辑,数据)是一个陷阱.
每个服务最终都会在链中调用下一个,将每个用户的请求变成网络跳水的瀑布.
相反,被业务能力分割。
思考"订单","支付","库存",而不是"前端","后端","数据库".
坑道2:忽略数据所有权 在一个单片中,共享一个数据库是好的.
于微役中以死为刑.
如果两个服务机构写到同一个表格,你已经失去了证明微服务合理性的独立性.
每一个服务机构必须只拥有自己的数据。
其他服务只能通过其API访问.
这意味着你需要复制一些数据 或使用事件驱动同步,这很好。
坑道3:同步所有东西 如果每个服务呼叫都是同步的HTTP,你就会建立一个脆弱的链.
一个缓慢的服务 带来了整个请求。
使用同步通信,用于任何不需要即时反应的东西.
事件,消息队列,甚至简单的背景工作可以解开服务并增强复原力.
坑道 4: 忽略分配的交易 你不能有ACID交易 跨服务。
试图用两个阶段的动作来模拟它们是一种噩梦。
接受最终一致性。
使用sagas或发包模式.
设计您的商业逻辑来容忍暂时的不一致.
这更难,但这是唯一可行的方法.
陷阱 5: 不计划失败 在一个单片中,一个虫子撞倒了整个应用程序.
在微服务中,一个bug可以崩溃一个服务,但剩下的必须继续.
这需要暂停、复试、断路器和散货头。
如果你们不从第一天开始建造这些设备, 在停产期间,你会在生产过程中了解这些设备。
坑道6:忘记守望 你不能调试分布式系统,日志分散在服务器上.
你需要集中记录 测量和追踪 设置一个关联ID,通过每一个服务电话流出.
使用Jaeger或Zipkin等工具来作痕迹.
若先分出一役前未得此相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 坑道7:过度工程部署 第一天你不需要库伯内特 多克·康普斯(Docker Corpose)对于一些服务来说是好的.
你增加的基础设施越多 你就越需要维护 开始简单,自动化 逐渐, 并且只有在你的大小 真正要求它。
坑道8:忽略团队边界微服务应映射到团队所有权.
如果你有一个团队负责10个服务, 你会得到协调地狱。
规则是:一个团队,一个或几个服务.
如果你是一个小团队(不到10人),你可能根本不应该做微观服务.
微服务是一种工具,而不是目标。
它们解决了组织上和规模上的问题,但也带来了复杂性.
通过刻意避免这些陷阱: 开始单一, 被能力分裂, 拥有你的数据, 拥抱同声, 计划失败, 投资观察。
如果你这样做,微服务可以工作。
如果你忽略这些,你就会有一个缓慢而脆弱的分布单地.
记住:最好的建筑是满足你需要的最简单的建筑.
不要让"出声"驱动你的设计.