史上最牛逼的微服务架构学习笔记,原来可以这么轻松的就学会了

什么是微服务
首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务 。
传统的WEB应用核心分为业务逻辑、适配器以及API或通过UI访问的WEB界面 。业务逻辑定义业务流程、业务规则以及领域实体 。适配器包括数据库访问组件、消息组件以及访问接口等 。一个打车软件的架构图如下:

史上最牛逼的微服务架构学习笔记,原来可以这么轻松的就学会了

文章插图
 
尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用 。例如JAVA应用程序会被打包成WAR,部署在Tomcat或者Jetty上 。
这种单体应用比较适合于小项目,优点是:
  • 开发简单直接,集中式管理
  • 基本不会重复开发
  • 功能都在本地,没有分布式的管理开销和调用开销

当然它的缺点也十分明显,特别对于互联网公司来说:
  • 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断
  • 代码维护难:代码功能耦合在一起,新人不知道何从下手
  • 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长
  • 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉
  • 扩展性不够:无法满足高并发情况下的业务需求

所以,现在主流的设计一般会采用微服务架构 。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互相连接的微服务 。一个微服务完成某个特定功能,比如乘客管理和下单管理等 。每个微服务都有自己的业务逻辑和适配器 。一些微服务还会提供API接口给其他微服务和应用客户端使用 。
比如,前面描述的系统可被分解为:
史上最牛逼的微服务架构学习笔记,原来可以这么轻松的就学会了

文章插图
 
每个业务逻辑都被分解为一个微服务,微服务之间通过REST API通信 。一些微服务也会向终端用户或客户端开发API接口 。但通常情况下,这些客户端并不能直接访问后台微服务,而是通过API Gateway来传递请求 。API Gateway一般负责服务路由、负载均衡、缓存、访问控制和鉴权等任务 。
微服务架构的优点
微服务架构有很多重要的优点 。首先,它解决了复杂性问题 。它将单体应用分解为一组服务 。虽然功能总量不变,但应用程序已被分解为可管理的模块或服务 。这些服务定义了明确的RPC或消息驱动的API边界 。微服务架构强化了应用模块化的水平,而这通过单体代码库很难实现 。因此,微服务开发的速度要快很多,更容易理解和维护 。
其次,这种体系结构使得每个服务都可以由专注于此服务的团队独立开发 。只要符合服务API契约,开发人员可以自由选择开发技术 。这就意味着开发人员可以采用新技术编写或重构服务,由于服务相对较小,所以这并不会对整体应用造成太大影响 。
第三,微服务架构可以使每个微服务独立部署 。开发人员无需协调对服务升级或更改的部署 。这些更改可以在测试通过后立即部署 。所以微服务架构也使得CI/CD成为可能 。
最后,微服务架构使得每个服务都可独立扩展 。我们只需定义满足服务部署要求的配置、容量、实例数量等约束条件即可 。比如我们可以在EC2计算优化实例上部署CPU密集型服务,在EC2内存优化实例上部署内存数据库服务 。
微服务架构的缺点和挑战
实际上并不存在silver bullets,微服务架构也会给我们带来新的问题和挑战 。其中一个就和它的名字类似,微服务强调了服务大小,但实际上这并没有一个统一的标准 。业务逻辑应该按照什么规则划分为微服务,这本身就是一个经验工程 。有些开发者主张10-100行代码就应该建立一个微服务 。虽然建立小型服务是微服务架构崇尚的,但要记住,微服务是达到目的的手段,而不是目标 。微服务的目标是充分分解应用程序,以促进敏捷开发和持续集成部署 。
微服务的另一个主要缺点是微服务的分布式特点带来的复杂性 。开发人员需要基于RPC或者消息实现微服务之间的调用和通信,而这就使得服务之间的发现、服务调用链的跟踪和质量问题变得的相当棘手 。
微服务的另一个挑战是分区的数据库体系和分布式事务 。更新多个业务实体的业务交易相当普遍 。这些类型的事务在单体应用中实现非常简单,因为单体应用往往只存在一个数据库 。但在微服务架构下,不同服务可能拥有不同的数据库 。CAP原理的约束,使得我们不得不放弃传统的强一致性,而转而追求最终一致性,这个对开发人员来说是一个挑战 。


推荐阅读