微服务的一些思考和理解

98 阅读6分钟

微服务的核心概念是,将多个独立自治的小项目,组合成一个复杂的大型项目,依靠网关技术,实现权限校验、请求的路由与转发,通过引入注册中心,实现微服务之间的可视化,每个小项目之间依靠轻量级的Rest API实现协同与交互,最终形成一个完整的去中心化架构。 服务与服务之间相互依赖,可能会导致雪崩现象,为了避免这类问题的发生,就需要及时对访问进行限制,而这也称为服务降级。 所有服务都拥有自己的数据库,一个业务流程中,如果一个服务发生异常,其它的服务都不会回滚,无法保证操作的原子性,于是就提出了分布式事务的概念。

1. 微服务基本架构

1.1 单体架构与微服务架构

单体架构从视图层来看,是由不相关联的分离模块组成,从逻辑层来看是由紧耦合的模块之间相互协调完成,模块实现单独部署,所有模块共用一个数据库。 微服务架构,微服务之间从逻辑上相互隔离,独立开发,且拥有自己的数据库,所有的服务注册在同一个注册中心中,并依靠注册中心提供的服务信息,调用服务接口进行访问

1.2 远程调用

微服务之间从逻辑上相互隔离,但作为一个统一的服务,服务之间需要进行协调与交互。但是,服务之间数据库相互隔离,代码之间不相互依赖,无法直接访问,只能够依靠Http请求访问接口微服务使用统一的开发框架,可以使用统一的工具进行接口之间的调用。因此提出了Feign,统一进行接口调用。服务的接口调用都是用Feign,这个Feign就像是嵌入在各个微服务中一样,所以它应该成为一个单独的模块进行统一管理。

1.3 注册中心

一个服务往往拥有多个实例,每个实例都拥有一个IP和Port,在运行过程中,微服务的状态、IP和Port不可知。需要一个单独的服务进行统一的管理,保证微服务之间协调与交互的可靠性,而这个单独的服务就是注册中心。 注册中心在运行的过程中,需要存储服务的相关信息、配置等等,所以需要依靠数据库进行持久化,同时作为一个单独的服务,微服务如果想要访问这个注册中心,就需要配置其IP地址和Port。

1.4 网关

前端无法使用注册中心的服务,所以无法确定服务实例的IP和Port;前端有可能发送请求给任何微服务,这也就意味着每个微服务都需要有一个鉴权代码,显得冗余。 所以就提出了网关,由网关调用注册中心的服务,为前端提供统一的API接口,并提供统一的鉴权功能,微服务之间只需要直接传递用户信息即可。

2.微服务安全性问题

2.1 服务安全性

采取微服务的架构方式,服务与服务之间相互依赖。当一个服务出现异常,同时并发量巨大的时候,会导致依赖该服务的其它服务的tomcat资源耗尽,其它服务也出现异常,最终导致雪崩现象。 为了避免问题的发生,就需要在问题发生时对访问进行限制,通常采取的方法有使用旧数据和限制访问数量,这类方法统称为服务降级。

2.1.1 限流

限流是通过限制特定请求在单位时间的访问速度(即QPS),防止由于某一服务异常,导致tomcat资源被迅速占用。

2.1.2 隔离

由于隔离并不能解决根本问题,tomcat资源还是存在被全部占用的风险,所以提出了隔离。 隔离是通过限制某一服务中对特定请求的线程数,防止由于某一服务异常,导致tomcat资源被异常服务请求全部占用。

2.1.3 熔断

熔断是依靠隔离异常服务和服务降级的的方式解决雪崩问题。 由于隔离与限流的异常请求都会占用tomcat资源,但服务其实已经失效,这也就导致资源的浪费,所以从这一点考虑,可以直接拒绝异常服务,采用一些旧数据或者其它的服务保证服务的正常运行。

2.2 事务安全性

分布式服务往往存在着多个微服务,每一个微服务之间相互独立,拥有自己的数据库,如果任何一个服务出现了异常,其它的服务都不会发生回滚操作,也就无法保持数据库的ACID原则。于是,提出了分布式事务的概念

2.2.1 分布式事务的组成

分布式事务由事务协调者TC、事务管理者TM、资源管理器RM三部分组成。事务协调者是一个服务端,记录各个分支事务的执行情况,并协调全局事务的提交、回滚;事务管理器负责定义全局事务的入口,对全局事务进行提交和回滚;资源管理器RM负责分支事务的状态记录、提交和回滚。

2.2.2 XA模式

XA模式中,TM通知TC开启全局事务,随后调用分支,随后开启分支事务,分支执行Sql语句,并向TC报告分支执行情况,待所有分支全部执行完成后,再由TM进行全局事务的提交或回滚,TC检测所有事务的执行情况,再对所有的分支事务进行回滚或提交。 XA模式需要对数据进行锁定,存在严重的性能问题。

2.2.3 AT模式

XA模式存在严重的性能问题,于是就提出了AT模式。 XA模式中的性能问题主要是由于不执行提交操作,导致数据库中的数据被锁定。AT模式通过仿照MySql中的InnoDB引擎的undo-log,执行完Sql语句后就提交事务,如果出现异常导致回滚,由TC进行统一的通知,依靠undo-log进行撤销操作。 但是AT模式会在事务回滚时存在短暂的数据不一致问题,对于需要保证强一制性的业务不能够使用。