购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 分布式微服务架构

1.3.1 微服务概述

微服务是在2014年由Martin Fowler大神提出的。首先,可以肯定的是SOA和微服务是一脉相承的。Martin Fowler提出这一概念可以说把SOA的理念继续升华,精进了一步。微服务的核心思想是在应用开发领域,使用一系列微小服务来实现单个应用,或者说微服务的目的是有效地拆分应用,实现敏捷开发和部署,可以使用不同的编程语言编写。

1.3.2 SOA与微服务

从实现的方式来看,两者都具有中立性,与语言无关,协议跨平台。相比SOA,微服务框架将能够带来更大的敏捷性,并为构建应用提供更轻量级、更高效率的开发。而SOA更适合大型企业中的业务过程编排和应用集成。

从服务粒度来看,既然是微服务,必然更倡导服务的细粒度,重用组合,甚至是每个操作(或方法)都是独立开发的服务,足够小到不能再进行拆分。而SOA没有这么极致的要求,只需要接口契约的规范化,内部实现可以更粗粒度。

从部署方式来看,传统的SOA服务粒度比较大,多数会采用将多个服务合并打成War包的方案。而微服务则打开了这个黑盒子,把应用拆分成一个一个的单个服务,应用Docker技术,不依赖任何服务器和数据模型,是一个全栈应用,可以通过自动化方式独立部署,每个服务运行在自己的进程中,通过轻量的通信机制联系,经常是基于HTTP或者RPC的,这些服务基于业务能力构建,能实现集中化管理。

另外,微服务是去ESB(总线)、去中心化、分布式的,而SOA还是以ESB总线为核心,大量的WS标准实现。

1.3.3 微服务架构的特点

微服务的主要特点有:

1.3.4 微服务架构的缺点

1. 复杂度高

微服务间通过REST、RPC等形式交互,需要考虑被调用方故障、过载、消息丢失等各种异常情况,代码逻辑更加复杂。

对于微服务间的事务性操作,因为不同的微服务采用不同的数据库,所以无法利用数据库本身的事务机制保证一致性,需要引入二阶段提交等分布式事务技术。

2. 运维复杂,成本高

在采用微服务架构时,系统由多个独立运行的微服务构成,需要一个设计良好的监控系统对各个微服务的运行状态进行监控。运维人员需要对系统有细致的了解才能够更好地运维系统,微服务架构的引入会带来运维成本的上升。

3. 影响性能

微服务之间通过REST、RPC等形式进行跨进程交互,增加网络IO,通信的时延会受到较大的影响。

4. 依赖更加复杂

微服务架构模式下,应用的改变将会波及多个服务。比如,在完成一个需求时需要修改服务A、B、C,而A依赖B,B依赖C。在单体应用中,只需要改变相关模块,整合变化,部署就好了。对比之下,微服务架构模式就需要考虑相关改变对不同服务的影响。比如,需要更新服务C,然后是B,最后才是A。

1.3.5 微服务架构全景图

微服务架构平台技术体系非常庞大,这里只能简单列举平台基础的技术,具体内容如图1-5所示。

图1-5 微服务架构简单全景图

图1-6只是简单列举微服务中重要的组成部分,企业中用的技术更为复杂,其他子系统更为繁多。

图1-6 微服务架构各部分协调与分工

图1-6只是微服务架构简单的全景图,接下来我们了解各个部分是如何协调与分工的。

1.3.6 微服务类型

我们根据服务的作用以及特点,将其分为4种类型:基础服务、业务服务、前置服务、组合服务。不同服务迁移的优先级不同。

1.3.7 微服务拆分原则与步骤

微服务拆分是一个渐进的过程,不能一步到位。服务拆分之前,需要确认公司业务是否适合,是否需要进行微服务化改造,毕竟很多传统的垂直系统是不适合走微服务这一套的;需要梳理系统的业务,对不同的业务进行分类;同时需要加强团队成员的微服务架基础知识的配置,比如Spring Boot技术、Spring Cloud技术等。

在进行微服务改造的过程中,优先对新业务系统进行微服务化,前期可以只有少量的项目进行微服务化改造,随着大家对技术的熟悉度增加,可以加大微服务改造的范围。这里总结几个微服务拆分的步骤:

(1)梳理业务

梳理出业务模块以及模块之间的依赖关联关系。这一过程需要相关的业务人员一起评估。

(2)优先对公共业务进行服务化

优先对公共业务进行服务化,如用户服务、邮箱服务、消息服务等。

(3)对业务服务进行服务化

对业务服务进行服务化,切分的服务之间尽量不要有任何的关联,开始服务化时,先粗粒度地进行服务的划分,之后再慢慢根据业务的情况进行细粒度服务的切分,不必追求一步到位。微服务拆分后,服务之间的依赖关系复杂,如果循环调用,升级的时候就很头疼,不知道应该先升级哪个,后升级哪个,难以维护。

(4)微服务的领域模型设计

微服务拆分完成后,需要设计每个服务设计的数据库表、表与表之间的关系。数据库表设计需要文档化,方便相关开发人员查阅。

(5)定义微服务接口

数据库表设计完成后,需要定义服务接口,让外部调用。服务接口的入参、出参、方法的名称以及注释等都需要仔细思考,必要时还需要开会评审。服务接口也需要文档化,方便调用者查阅。 XL6o7VGPFqPxIqX/vYLU8hXNqVY1XDTv5ll8q2pNonnSy8hAg99Bb+7Z392wWHNi

点击中间区域
呼出菜单
上一章
目录
下一章
×