框架之初为了快速迭代出产品,而选择简单的技术架构,构建单体应用。这些架构可以适应初期业务的快速发展,但是随着业务变得越来越复杂,就会发现这些架构越来越难支撑业务的发展,各业务模块相互调用,业务边界越来越模糊,同时对系统更正性、完善性、预防性等维护工作越来越难,往往牵一发而动全身,最终可能造成测试工作不足,上线后才发现各种bug。另外会出现在一个类中写好几千行代码,一个方法中到处都是if else语句,后面介入的人员几乎无法理解这些代码,到最后产品越来越难迭代,只能推翻重做。
微服务是当前业界的一大趋势,原理就是将单一职责的功能模块独立化为子服务,降低服务间的耦合,服务间互相调用。单体应用将所有功能都放在一个系统中,并且只能通过整体复制的方式进行横向扩展。而微服务将每个功能都分割成一个一个服务,然后在分布式集群中按需进行横向扩展。
1、微服务技术架构
1.1、去中心化技术治理
每个微服务技术架构可以不同、开发语言可以不同,新需求作为一个独立微服务设计、构建,对其它微服务没有影响,实现成本低。单体应用技术架构升级成本高,需要设计所有模块。
项目初期根据统一架构A进行微服务A/B/C设计、构建,随着项目进行微服务X/Z采用新的架构B进行设计、构建。在满足需求的情况下技术架构尽量少,并且由统一的架构团队维护。
1.2、去中心化数据管理
每个微服务都有独立数据库,根据数据库访问特点、数据量特点可以选择不同的数据库管理系统。
例如客户服务/商品服务数据量不大,但需要经常读取,可以采用MySQL+Redis组合。交易服务对应交易数据,具有高并发、事务性强特性,可以采用横向/纵向切分,分布到多个数据库中。经营分析/业务查询服务需要海量数据查询,易采用elastic进行数据索引,NoSQL+大数据分析平台。
三种数据库类型特点:
(1)关系型数据库:二维表形式存储数据库,具有强一致性,二维表存储结构,代表数据有MySQL、Oracle等。
(2)NoSQL数据库:适合分布式,一致性较弱,key-value存储结构。
(3)NewSQL数据库:既能保证一致性,又能进行分布式,典型的NewSQL有TiDB,完全兼容MySQL(存储过程、触发器除外)。
2、微服务优势及带来的问题
微服务架构将原来耦合在一起的复杂业务拆分为各单个服务,服务间通信采用轻量级通信机制,规避了原本复杂度无止境的积累。
每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界;每个服务开发者只专注服务本身,通过使用缓存、DAL等各种技术手段来提升系统的性能,而对于消费方来说完全透明。微服务的核心要素在于服务的发现、注册、路由、熔断、降级、分布式配置。
2.1、微服务优势
(1)易于开发和维护:基于领域模型对服务进行拆分,一个微服务只会关注一个特定的业务功能,所以业务清晰、代码量较少。开发和维护单个微服务相对简单。
(2)局部修改容易部署:单体应用只要有修改,就得重新部署整个应用。对微服务架构来说,如果某个微服务进行升级,只需要重新部署这个服务即可。
(3)服务治理:微服务不只是简单的应用划分,还包括服务注册/发现、过载保护、服务熔断、分布式调度等领域。
(4)技术栈不受限制:在微服务架构中,可以结合项目业务及团队的特点,合理的选择技术栈。
(5)按需伸缩:可根据需求,实现细粒度的扩展。
2.2、缺点
(1)运维要求高:更多的服务意味着要投入更多的运维。
(2)分布式固有的复杂性:使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来众多问题。
(4)基于以上优缺点分析,权衡利弊,对一个大型应用系统微服务化是必然选择。
3、Spring Cloud
Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性,简化了分布式系统基础设施的开发。Spring Cloud为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
Spring Cloud特点
- 包含了微服务生态大多组件,例如配置中心、服务中心、熔断器、网关、负载均衡、集群工具、分布式链路监控、消息组件等。
- 标准化的将微服务的成熟产品和框架结合一起,Spring Cloud 提供整套的微服务解决方案,开发成本较低,且风险较小。
- 基于Spring Boot,具有简单配置、快速开发、轻松部署、方便测试的特点。
- 支持REST服务调用,相比于 RPC,更加轻量化和灵活(服务之间只依赖一纸契约,不存在代码级别的强依赖),有利于跨语言服务的实现,以及服务的发布部署。另外,结合 Swagger,也使得服务的文档一体化。