单体应用

早期应用技术栈两大流派:

  • LAMP(Linux + Apache + MySQL + PHP)
  • MVC(Spring + iBatis/Hibernate + Tomcat)

随着业务规模的不断扩大,团队开发人员的不断扩张,单体应用架构就会开始出现问题:

  • 部署效率低下
  • 团队协作开发成本高
  • 系统高可用性差
  • 线上发布变慢

什么是服务化?

用通俗的话来讲,服务化就是把传统的单机应用中通过 JAR 包依赖产生的本地方法调用,改造成通过 RPC 接口产生的远程方法调用。

什么是微服务?

从 2014 年开始,得益于以 Docker 为代表的容器化技术的成熟以及 DevOps 文化的兴起,服务化的思想进一步演化,演变为今天我们所熟知的微服务。

微服务相比于服务化又有什么不同呢?

  • 服务拆分粒度更细
  • 服务独立部署
  • 服务独立维护
  • 服务治理能力要求高

总结

今天,我介绍了微服务的发展由来,它是由单体应用进化到服务化拆分部署,后期随着移动互联网规模的不断扩大敏捷开发持续交付DevOps 理论的发展和实践,以及基于 Docker 容器化技术的成熟,微服务架构开始流行,逐渐成为应用架构的未来演进方向。

精选留言

Colin

服务化最难的是在数据库层,因为数据库中很多数据都是相互关联的,比如用户用户跟订单,订单和商品等等这些数据之间都是有关联的,服务拆分之后会面临以下问题:

1当需要读取关联数据时,如果采用表连接的方式查询数据会出现跨数据库查询的可能,

2如果是通过RPC的方式多次调用(比如要查订单,就需要查询商品及订单详细信息),也会出现多次调用导致的频繁多次的数据库连接,而如果使用缓存,也会面临数据库与缓存之间的数据同步问题,特别是数据库与缓存服务器都存在集群的情况下,会更难处理,这也是在做微服务之前必须要考虑的问题。

作者回复: 是的,服务化拆分最好不要涉及跨数据库表交互

技术修行者

看了文章和留言,讲的很清楚,请教一个问题,之前也有同学问了。

对于典型的复杂web应用,当由单体应用改造成微服务时,一般会按照业务进行服务划分,彼此独立的业务拆分到不同的微服务中。但是在数据层面,涉及到下面两个问题:
1. 数据库是否拆分?从数据架构的角度看,可能有三个选择:1) 一个db实例,所有微服务在一个schema中,2) 一个db实例,每个微服务有自己的schema,3) 每个微服务有自己的db实例。我们在实际项目中应该如何取舍?
2. DAO层是否拆分?可能有两个选择: 1) DAO层保持不变或者单独部署成微服务,所有业务微服务通过引用jar包或者HTTP的方式和DAO进行交互。2) 把DAO进行拆分,每个业务微服务内部管理自己会用到的db数据。在所有微服务采用的技术栈相同的情况下,上面哪种方式更可取?

作者回复: 第一个问题:数据库拆分其实不是微服务拆分的关键,如果会引入分布式事务的话,最好不要拆分。 第二个问题:长远来看,建议方案2,这样会减少每个微服务同db的连接,在集群规模上千台的情况下,db的连接数不会成为瓶颈,服务启动也会变快,因为初始化连接也会变少。