什么是微服务






4.19/5 (22投票s)
将大型项目分解成小的可执行模块就是微服务。
引言
当今世界都在谈论微服务,所以我想为什么不写一篇关于我对微服务的理解的文章呢。
到目前为止,我觉得这主要适用于云环境,并且可以看到这方面的大量发展趋势。
什么是微服务?
将大型项目分解成小的可执行模块就是微服务,其中每个模块都是独立的,并且可以在不依赖其他模块的情况下执行。模块之间通过 API 进行通信。
我们在单体应用中做什么
我们创建一个解决方案,通常包括表示层、应用程序层、中间层和数据访问层。为了运行它,我们会创建一个包并部署它,它将负责所有这些。现在,由于我们将它们归为一个包,即使我们有不同的层和它们各自的职责,它们也变成了单体。
所以问题是,尽管我们进行了分离,但最终我们还是将它们归为一体,并使它们相互依赖。如果任何一部分失败,整个应用程序都会受到影响。
举个现实世界的例子
我们正在制作披萨,我们需要蔬菜、奶酪、披萨饼底和酱料。
我们从不同地方收集了所有这些食材,现在我们准备制作披萨。我们会将酱料涂抹在饼底上;添加蔬菜,最后放上奶酪,然后就可以烘烤了。现在想象一下,供应给披萨的蔬菜是腐烂的。结果会怎样?你的整个披萨都坏了,尽管我们有来自不同地方的材料,但由于它们被组合在一起,现在无法食用,因为不适合吃。虽然 4 种配料中只有一种腐烂了,但却让披萨变得毫无用处。单体方法的案例就是这样。
单体应用的几个缺点
1. 技术变更,因为一切都在一起,所以很难考虑。
2. 可伸缩性具有挑战性。
3. 任何一个组件的失败都可能导致整个应用程序瘫痪。
4. 对相互连接的模块依赖性很高,开发人员因此不得不等待。
有了这些,我们现在来谈谈微服务
当创建任何应用程序时,我们会创建各种方法来实现其功能。现在想象一下,如果每个方法都是一个独立的服务,并且可以独立部署,而无需等待其他方法完成。
这肯定会提高开发人员的时间,因为与其他模块的依赖被切断了,并且方法应该能够独立测试。开发人员只需要关注他们方法的函数。他们可以随时对代码进行任何更改并重新部署,而不会对其他模块产生任何影响。
这是微服务最大的优势,即可伸缩性。
如果任何服务是应用程序的瓶颈,可以单独处理,而不会影响其他服务,这在单体应用中是一个艰难而漫长的过程。
可以监视每个服务的性能,并根据结果在需要时对单个服务进行调整。
真实世界示例
让我们用同样的披萨例子,现在我们所有的食材都单独包装并进行了测试。在测试蔬菜时,我们已经知道它们是腐烂的。所以我们可以跳过它们,添加其余的食材来准备披萨。
微服务的优点是
- 易于理解,因为开发人员一次只需关注一个服务。即使引入了一个新开发人员,他也会专注于单个服务的函数。
- 服务可以是技术的混合体,因此对技术的依赖或升级到新技术变得更容易。
- 由于代码被分解成小块,可维护性得到了提高。
- 监控变得简单,因为每个服务都有自己的进程和部署。
- 数据可以由单个服务保存,因此可以根据个体设计逻辑使用数据库。例如,一个服务使用 mongoDB,另一个服务使用 MYSQL。
- 部署到各种环境,从开发到质量保证,再到用户验收测试,只需一键即可完成。
现在我们有一个包中有四个服务,并且我们发现服务 2 运行缓慢,在这种情况下,我们不必使整个包停机。我们可以只调整服务 2 并重新部署,因为它们都是独立部署的。
微服务的缺点
- 代码可能冗余,因为每个服务都需要单独执行,所以为了实现功能,相同的代码段可能需要重复多次。
- 测试将耗时,因为每个服务都需要单独测试,然后还需要测试与应用程序相互通信的完整功能。
- 最终解决方案的部署将很棘手,因为所有独立托管的服务都需要能够相互通信,这不会那么直接。
简单的 UI 来展示包装的区别
微服务的部署
每个基于微服务的应用程序将包含多个服务,这些服务可能使用不同的语言和框架编写。每个服务都必须有自己的数据库,这意味着每个服务都作为一个独立的应用程序进行部署。服务实例根据需求而定,并且必须相互隔离。每个实例都需要合适的 CPU 和内存。此外,应用程序的部署应该是成本效益高且可靠的。
以下是可用于部署微服务的模式
- 每台主机上的多个服务实例
- 每台主机上的单个服务实例
- 每个 VM 的服务实例
- 每个容器的服务实例
部署微服务的最佳方法是将其部署在容器中,因为它们可以满足隔离和专用硬件分配的目的。
结论
微服务正在快速发展,并成为市场上的一个热点。每种新技术都有其优缺点,但我们可以根据用途来决定选择什么。