什么是微服务
微服务应用是与单体应用区分开来的.
当一个单体项目随着业务的发展会越来越膨胀,变得更加难维护,从一开始仅需一两个人到需要两三个团队,多个团队维护同一个项目无疑是一场灾难,沟通成本大大增加,技术协同也会十分困难.
举个例子,我在上一家公司维护过一个后台项目,它是一个公共后台,全司上下各个团队都可能用它来看数据,都来维护它.面对这样一个项目,明明我只需要维护十几个类,但每次我都需要在几百上千个类中找到它们.一些配置项,公用组件我想改却改不了,因为就算我的部分测试通过,也不能保证以后在其他业务会不会产生新的问题,而且出了问题有时很难追踪是谁的责任.
单体项目膨胀到一定程度后,就需要拆分了.微服务本质上就是对单体应用的解耦,拆分,从业务,功能上抽象成若干个模块.代码上解耦/独立只是第一步,根据实际需求,微服务架构也可能需要做到数据库独立,团队独立等.
为什么需要微服务
如上,微服务的出现是为了解决单体架构带来的问题.这里再敞开具体聊聊.
- 复杂性逐渐变高
比如有的项目有几十万行代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题。 - 技术债务逐渐上升
公司的人员流动是再正常不过的事情,有的员工在离职之前,疏于代码质量的自我管束,导致留下来很多坑,由于单体项目代码量庞大的惊人,留下的坑很难被发觉,这就给新来的员工带来很大的烦恼,人员流动越大所留下的坑越多,也就是所谓的技术债务越来越多。 - 部署速度逐渐变慢
这个就很好理解了,单体架构模块非常多,代码量非常庞大,导致部署项目所花费的时间越来越多,曾经有的项目启动就要一二十分钟,这是多么恐怖的事情啊,启动几次项目一天的时间就过去了,留给开发者开发的时间就非常少了。 - 阻碍技术创新
比如以前的某个项目使用struts2写的,由于各个模块之间有着千丝万缕的联系,代码量大,逻辑不够清楚,如果现在想用spring mvc来重构这个项目将是非常困难的,付出的成本将非常大,所以更多的时候公司不得不硬着头皮继续使用老的struts架构,这就阻碍了技术的创新。 - 无法按需伸缩
比如说电影模块是CPU密集型的模块,而订单模块是IO密集型的模块,假如我们要提升订单模块的性能,比如加大内存、增加硬盘,但是由于所有的模块都在一个架构下,因此我们在扩展订单模块的性能时不得不考虑其它模块的因素,因为我们不能因为扩展某个模块的性能而损害其它模块的性能,从而无法按需进行伸缩。
那么微服务应该怎么学习呢,这里分享一份使用微服务的最佳实践。以贯穿整书的示例为出发点,由浅入深地阐述使用微服务的最佳实践,以及如何避免采用微服务架构可能带来的复杂性陷阱。
第1章会介绍微服务架构的整体概念,其中包括对微服务的基本定义。之后会快速浏览本书中所使用的样例程序。
第2章将阐明定义微服务组件的指导原则,并说明这些组件如何成为微服务架构的核心支柱。我们会通过Spring Boot 框架的Java 项目来有效地定义微服务组件,进而解释这些指导原则如何在实际中使用。最后,通过- -个微服务样例来实际演示基于Java的微服务组件如何进行配置和服务发现。
第3章会讨论并论证微服务间有效通信的原则。之后介绍使用不同技术(如使Spring框架本身或消息代理)实现同步和异步通信的选择标准。我们也会讲到常见问题的最佳处理方法。
第4章会讨论使用微服务架构时可能会遇到的常见安全问题和安全挑战。可以通过引入JWT、OpenID 和OAuth 2.0来提高微服务架构的安全性。
第5章首先解释基于微服务的数据模型与传统的数据模型的不同之处以及不同的原因。之后会解释数据技术如何被混合使用,以及针对每个微服务组件如何选择适合的数据管理策略。我们还将探索数据模型,解释不同数据模型的选择策略以及选择理由。
第6章将探讨测试技术在经常变化和自动部署的系统中的重要性。传统的测试方法和测试标准能完美地匹配微服务架构吗?或者说,我们需要探索完全不同的测试方法来适应微服务架构吗?也许两者都需要。
第7章主要着眼于微服务的部署。在微服务架构中,部署操作是非常频繁的,这是要把部署操作变得尽可能无痛点并且易于使用的一一个原因。另外- -个原因是,对自动化的追求和对系统扩展性的期望,会导致经常中断并部署新的微服务。Docker 会帮助我们定义微服务的部署流程,并将其自动化。
第8章将描述将系统演进至微服务架构的主要机制。这--章还会以示例说明如何演进至微服务架构。
第9章会描述监控和扩展基于微服务的系统的重要概念和准则,还会探索监控和扩展基于Java的微服务的实际方法,并给出示例说明如何进行监控和扩展。
第10章会总结在设计和开发微服务架构时的常见问题,并阐述常见的解决方法或最优方案。
本书从微服务架构本身的特征入手,讨论微服务组件的设计指导原则、有效通信的方式以及常见的安全挑战和数据模型的选择;然后进入微服务架构的测试部分,探讨微服务的测试挑战和解决方法、监控和扩展常用的实践以及如何将现有架构演变为微服务架构:最后总结微服务架构在设计和开发方面遇到的常见问题及解决方案。
本书既适合想学习微服务架构的开发人员作为入门参考书,也适合有微服务开发经验的技术人员在实践中遇到问题时作为技术手册,查阅最佳实践和解决方案。