分布式系统概念:
只要是将一个项目拆分成了多个模块,并将这些模块分开部署并通过一定通信机制进行通信、协调,而对外表现如同一个系统,那就算是分布式。
主流的分布式实现有两种方式:水平拆分,或垂直拆分(也称为“横向拆分”和“垂直拆分”),具体如下:
水平拆分:根据“分层”的思想进行拆分。例如,可以将一个项目根据“三层架构”拆分成 控制层(jsp+servlet)、业务逻辑层(service)和数据访问层(dao),然后再分开部署,或一个完整的单体项目的多个副本集群部署。
垂直拆分:根据业务进行拆分。例如,可以根据业务逻辑,将“电商项目”拆分成“订单项目”、“用户项目”和“秒杀项目”。显然这三个拆分后的项目,仍然可以作为独立的项目使用。像这种拆分的方法,就成为垂直拆分。
微服务:
从名字上即可以理解为微小、微型的服务器,是一种非常细粒度的垂直拆分,是以一组小型服务器的方式来开发的一个独立的应用系统。这些微服务可以使用不同的语言来编写,并且可以使用不同的编写语言,数据库存储技术,只要满足统一的通信、协调标准即可。
微服务使用环境:微服务的诞生源于技术的突破性发展,用户量、业务复杂度、数据量都大大增长,单体应用模式是无法应付这种增长的,所以微服务架构是必然趋势。
Spring-Cloud:
Spring Cloud是基于Spring Boot开发的一系列框架的有序集合,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁等,都可以用Spring Boot的开发风格做到一键启动和部署,对于想快速实践微服务的开发者来说,Spring Boot是当前最好的工具集。
Spring Cloud的主要子项目:
spring-cloud-netflix:最早开源的项目,包括:eureka服务发现、ribbon负载均衡、hyxtrix服务容错、archlius配置管理、zuul服务网关等。
spring-cloud-alibaba:由阿里巴巴开发,国内使用广泛,包括:nacos服务发现和配置管理、dubbo服务调用、sentinel服务容错、seata分布式事务。
spring-cloud官方:由spring官方提供,包括:gateway服务网关、loadbalancer负载均衡、openfeign服务调用。
服务发现与调用
在微服务架构下,各个单一服务器之间需要频繁通信,进行服务的提供或发现服务进行调用因此需要进行统一管理,最好的解决方式即增加一个中间件进行统一的服务注册、服务发现与服务管理,这里仅简单介绍阿里开发的服务发现中间件Nacos和spring官方提供的声明式服务调用组件Openfeign。
Nacos作为脱胎于阿里内部的ConfigServer,而ConfigServer早在3.0版本就解决了Eureka在1.0版本留下的隐患,所以从技术的更新和迭代角度来看,稳定版本的Nacos将更适合做为微服务体系中的服务注册发现组件,当然了他也不单单只是注册和发现,Nacos还提供了服务健康检测、动态DNS服务和服务及元数据管理等功能。
附图:
OpenfeignOpenFeign是Spring Cloud在Feign的基础上改进所得,支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@Feignclient可以解析SpringMVc的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。其出现取代并简化了restTemplate的服务调用方法。
负载均衡
在微服务架构下,同一服务可能有多个服务器进行服务,如不能进行协调,则会造成多个服务器压力不均衡的现象,因此需要配置来进行各服务器之间的负载协调,这里仅简单介绍Ribbon。
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单地说,就是在配置文件中列出Load Balancer(简称LB)后面所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。主流的负载均衡配置如:BestAvailableRule(最小并发数)、WeightedResponseTimeRule(响应时间加权)、RoundRobinRule(轮询)、RandomRule(随机)等都可以通过Ribbon进行配置。
分布式事务
微服务架构下,一个业务操作必须经过多个服务,而每个服务有自己独立的数据库,造成一个业务操作必然在多个数据库实例中执行,必须达到多个数据库实例同时成功或者失败的效果,才能实现这个业务操作。因此需要分布式事务相关组件对多个数据库实例进行协调处理,主流的分布式事务解决方案有:XA协议、Try-Confirm-Cancel、SAGAS、 AT模式、重试+幂等性校验等,这里仅简单介绍AT模式。
AT模式基本概念:
全局事务:指分布式事务本身。
分支事务:单个服务内部的业务。
事务协调者:TC协调每个分支事务的中间件,统一提交,统一回滚。
事务发起者:TM发起全局事务的方法。
事务参与者:RM参全局事务,维护分支事务。
事务的两个阶段
阶段一:
1、执行业务
2、获取并持久化回滚数据
1)seata代理数据源,拦截所有数据库操作(sql)
2)获取数据操作前后的数据镜像,生成inster插入到undo_log表中
3)加入到当前事务,提交
阶段二:
1、正常提交:删除undo_log表中的记录
2、异常提交:
1).seata自动从各个分支事务对应的undo_log表中提取记录,计算生成回滚所需要的sql。
2).执行回滚sql,提交事务
附图:
服务网关
微服务架构同样需要单体项目下需要类似于过滤器对请求进行统一处理的组件,在分布式的环境下,我们把这类组件称为服务网关(Service Gateway)。
在微服务下,gateway相当于所有服务的门户,将客户端请求与服务端应用相分离,客户端请求通过gateway后由定义的路由和断言进行转发,路由代表需要转发请求的地址,断言相当于请求这些地址时所满足的条件,只有同时符合路由和断言才给予转发。
网关选型通常有:Spring Cloud Gateway、netflix-zuul、kong。这里仅简单介绍Spring Cloud Gateway。
Spring Cloud Gateway:基于过滤器实现,同 zuul 类似,有pre和post两种方式的 filter,分别处理前置逻辑和后置逻辑(根据请求处理在分发前后判定)。客户端的请求先经过pre类型的 filter,然后将请求转发到具体的业务服务,收到业务服务的响应之后,再经过post类型的 filter 处理,最后返回响应到客户端。
单点登录
sso(single sign on)单点登录:隶属于同一个网站的多个不同的页面系统,只需要登陆一次,就可以访问任何其他的系统。
Sa-Token 是一个国内开发的轻量级 Java 权限认证框架,主要解决:微服务下的登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权 等一系列权限相关问题。
服务容错
微服务架构因为部署了多组服务器,其故障率相比单体项目也是呈指数级上升,甚至因为服务的相互调用会出现雪崩效应,因此需要搭设一个中间件来进行服务容错,降低故障率同时解决雪崩效应。
Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件,提供了简单易、完善的 SPI 扩展接口,我们可以通过实现这些扩展接口快速地定制逻辑,例如定制规则管理、适配动态数据源等,从而解决微服务架构下的服务容错和服务雪崩等问题。