在本文中,我将详细介绍在转向微服务时需要考虑的内容,以及会面临的一些挑战。
每当您的团队从头开始开发一个新的应用程序时,不需要陷入多年前做出的过时决策和继承技术债时,感觉很好。现在开发新应用的大多数团队可能会选择使用Docker,并采用微服务体系结构来实现速度和敏捷性。
然而,在你开始之前,有以下几点需要考虑:
第一个决定是——你希望你的服务有多独立?你可选择下列其中一项:
这两种方法都有利有弊,所以你需要决定你能接受什么。我们选择了第二种方法,因为我们不希望处理不一致的数据,然后花时间寻找方法来确保一致性。
有几种方法可以组织代码库。您可以为每个服务创建一个存储库,您可以为所有服务创建一个“mono repo”,并为每个服务创建一个文件夹。我们选择mono repo方法。
要为一个单体应用程序确定技术栈已经够困难了,但是现在必须为每个微服务选择技术栈。如果您的服务过于异构,那么在理论上看起来有吸引力的内容在实践中可能会出现问题。标准化会成为一个问题,牛仔行为(过于自由的选择)也有可能出现。而且,如果每个团队都使用完全不同的技术栈,那么在团队之间转换移动就更困难了。
我们建议采用一种平衡的方法,即在应用程序中存在首选的技术堆栈。如果任何团队想要覆盖这个默认堆栈,他们应该用赞成和反对的理由来证明他们的决定,为什么不同的堆栈更适合他们的微服务。您的技术堆栈应该包括编程语言、测试和日志框架、云提供程序、基础设施、存储和监视等。
微服务极大地增加了操作复杂性,因为您需要从非常基本的角度重新考虑操作。
你需要考虑以下方面:
在您决定转向微服务之前,操作复杂性本身应该让您暂停一下。除非您意识到微服务的挑战,并有一个解决它们的计划,否则这将是一个痛苦的过渡。
我们同意Martin Fowler的观点,他在他关于微服务权衡的博客文章中写道:
“能够迅速部署小型独立单元对开发来说是一个巨大的利好,但它给运营带来了额外的压力,因为6个应用程序现在变成了数 百个小微服务。许多组织会发现处理这样一群快速变化的工具是非常困难的。这加强了持续交付的重要作用。尽管持续交付对整 体而言是一项有价值的技能,但它几乎总是值得付出努力去获得的,对于一个严肃的微服务设置来说,这是必不可少的。“
使用微服务的公司,如Netflix和Amazon,有资源为他们的微服务构建自定义的持续交付管道。然而,并不是每个组织都能负担得起。即使您负担得起,您也应该考虑,您的时间是花在构建脆弱的、必须为每个微服务定制的自定义自动化上的最佳时间,还是您希望改进自己的产品。
你有三个选择:
最后但并非最不重要的是,您需要重新组织您的团队,以确保每个微服务都是独立地开发、部署和维护的。你不能让你的工程师在多个微服务上工作,因为这必然会导致一些决策的优化,而这些决策与对每一个微服务的最佳状态并不相关。
一个独立的、独立的团队应该处理每个微服务。亚马逊的团队模式——它应该足够小,即少于10人。在某些情况下,每个团队都应该在开发、测试、操作、DB管理、UX甚至产品管理等方面拥有专业知识。这并不意味着每个角色都需要一个独特的团队成员,只是需要在团队中解决它们。例如,DevOps工程师满足Dev和Ops的双重角色。类似地,每个团队也可以有一个编写spec和定义UX的经理。
上面的方法有一些变化,比如集中项目操作系统、产品管理或平台团队。这些文章进一步阐明了如何组织团队。
如果您想将现有的整块集成到微服务中,您仍然需要考虑上面描述的所有要点。但是,还有一个针对您的情况的额外挑战。你将需要一种策略来帮助你在各个阶段进行过渡。
这是一个广泛的话题,就像罗马不是一天建成的,你的过渡需要时间和专注。
简而言之,你需要做以下事情:
正如您所看到的,采用微服务并不是微不足道的,只有当您看到应用程序的足够价值时,才应该进行。