微服务概念:简单来说就是把一个单体系统通过功能或业务拆分为多个小型系统,多个小型系统对外为一个整体,但是每个小型系统都是独立的,它们通过网络来互相通信。将系统拆分为多个小系统之后将便于开发人员开发,和后期系统的维护,同时能满足更复杂业务的开发需求。
微服务架构的系统是分布式系统,但分布式系统不单指微服务系统。
Spring-cloud:是开发微服务架构实现的工具集,通俗来讲就是搭建微服务架构系统的平台,它提供了多种多样的工具, 如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。
目前市面上主流工具的选用:
服务发现、配置管理:nacos
负载均衡:ribbon
服务调用:openfeign
分布式事务:seata
服务网关:gateway
服务容错:sentinel
服务发现:
为解决微服务架构系统每个独立系统之间的联系,这里采用nacos服务器作为服务发现的服务器,nacos在主要起到的作用为管理配置文件、服务发现、健康检测的作用,还可以动态管理配置,在不重启项目的状态下实现修改配置文件更改业务逻辑的功能。
主要原理为:1.生产者在启动时注册服务到nacos上
2.消费者拉取注册服务表
3.nacos对生产者进行健康监测
4.生产者出现变更,nacos通知消费者
5.消费者重新拉取注册服务列表
负载均衡:
当某一系统采用分布式集群部署时,为了处理请求的合理分发到每个服务器上,提高系统运行的效率,需要使用ribbon来设置负载均衡的策略。
Ribbon 内置了七种负载均衡的策略:
1.BestAvailableRule: 该策略会将请求发给最小并发请求的服务器
2. AvailabilityFilteringRule:会选择发送给健康的并且并发数较小的服务器
3. WeightedResponseTimeRule:会根据效应时间加权来选择处理请求快的服务器
4. RetryRule:对选定的负载均衡策略机上重试机制
5. RoundRobinRule:轮询选择服务器发送请求
6. RandomRule:随机发送请求到服务器
7. ZoneAvoidanceRule:综合判断服务器的性能和可用性选择服务器
服务调用:
这里采用的是声明式服务调用工具openfeign,它为http形式的Rest Api提供了高效简洁的RPC调用方式,特别是相对于okhttp,resttemplate等方式更加快捷高效,只需要调用接口就可以将系统与系统之间进行通信。
基本原理为:
1.通过spring-aop实现动态代理(jdk动态代理)生成代理类,代理类中进行服务发现、负载均衡、服务调用等处理
2.反射得到请求方式、服务名、参数名、参数类型、返回值类型
分布式事务:
为解决分布式系统下不同数据库进行sql操作时发生异常时不能同时回滚的问题,引入分布式事务。常用的解决方案有XA协议、TCC(需要拆分为三个接口)、SAGAS(适用长事务)、AT模式、重试+幂等性校验。
分布式事务基本概念:
TC:事务协调者
TM:事务发起者
RM:事务参与者
两阶段:
阶段一:TC通知所有分支事务开始业务并获取反馈通知
阶段二:所有分支事务都成功时,全局事务提交,TC通知分支事务提交,若有一未成功,TC则通知分支实务回滚。
主要介绍AT模式(使用便捷):
原理:阶段一:执行事务,seata代理数据源拦截数据库操作,获取到数据库操作前后的数据镜像,生成sql保存到undo_log表中,加入当前事务。
阶段二:事务正常执行提交,删除undo_log表的数据,若发生异常,则通过undo_log表中的数据计算生成回滚用的sql,并执行提交,最后删除undo_log表的数据。
服务网关:
服务网关是分布式系统的唯一入口,做ip黑白名单、日志记录、性能监测、动态路由、权限控制(认证鉴权)、解决跨域问题、协议转换、限流等功能。采用spring-cloud-gateway工具,基于Reactive技术栈,底层为netty,不能与starter-web依赖同时使用。网关服务器需要单独搭建,需要配置路由转发的地址相关信息。
原理:接收到外界发来的请求,通过predicate匹配请求信息路由,filter处理请求地址获取到实际转发的地址,进行uri转发。
服务网关有两种过滤器:网关过滤器(gatewayfilter)只针对某一个路由做操作。
全局过滤器(globalfilter)针对所有路由做处理。
可以通过实现globalfilter进行登录鉴权处理,但是在过滤器之间是有顺序的,所以还需要实现ordered接口,在nettyroutingfilter转发进行前可以进行相关处理,当然根据ordered实现顺序后,可以在转发前后实现一些业务,类似于spring-aop在代理类里的操作类似。
单点登录:
为实现在分布式系统上登录一次就可以访问隶属于同一个网站的多个不同的页面系统需要实现单点登录的功能。简单来说就是将每个用户登录时生成的token存到cooki和其他信息存到redis中,所用分支系统共用一个redis服务器,访问时只需要验证redis中用户登录状态即可认证登录,同时在设置cookie指定一个父域名,就可以后续访问时实现cookie跨域的问题。
服务容错:
采用sentinel服务容错框架,为了解决系统的不可避免的发生异常时保证一定的服务之间的稳定性。Sentinel提供了流量控制、熔断降级等功能,流量模式提供了直连(单一保护某个路径资源设置QPS每秒查询率(Query Per Second),限制请求数量)、关联(当被关联方被请求冲击时,设置QPS保护主动关联方)、链路(只统计一个接口的访问量,限制与它链接的所有接口)。
熔断原理:
当一接口被访问调用时,可通过设置降级策略(响应时间(RT)、异常比例、异常数量)来判断是否将熔断器打开,若成功打开,熔断器便通过设置的窗口时间间隔向接口释放请求,判断系统是否正常,若未恢复复正常熔断器不会关闭。