微服务
SpringCloud
注册中心:Eureka
负载均衡:Ribbon
远程调用:Feign
服务熔断:Hystrix
网关:Gateway/Zuul
Alibaba
配置中心:Nacos
负载均衡:Ribbon
服务调用:Feign
服务保护:sentinel
服务网关:Gateway
注册中心:服务注册和发现
1.注册服务(心跳续约,每30s一次)
2.拉取服务,服务提供者信息
3.负载均衡选择服务提供者
4.远程调用
Nacos
yml设置非临时实例
临时实例采用心跳监测
非临时实例nacos主动询问,主动向服务消费者推送变更消息
Nacos和Eureka
同:服务注册,服务拉取,心跳方式健康监测
异:
-
nacos支持服务端主动监测提供者状态
-
临时实例:心跳模式
-
非临时实例:主动检测模式
-
-
临时实例不正常会被剔除,非临时实例不会剔除
-
nacos服务变更推送
-
nacos集群默认采用ap方式,当存在非临时实例采用cp方式
eureka采用ap方式
nacos支持配置中心
负载均衡
发起远程调用feign使用Ribbon
feign发送请求给Ribbon,Ribbon拉取服务列表
注册中心向Ribbon返回服务列表,决定访问哪一个服务器
负载均衡策略有哪些
1.轮询
2.权重,响应时间长,权重小
3.随机
4.区域敏感策略
区域可用的服务器为基础进行服务器选择,再对区域内的服务器进行轮询(默认)
如何设置负载均衡策略
创建类实现iRule接口,
通过配置类(全局)或者配置文件配置(局部,某一个服务调用)
服务雪崩
一个服务失败,导致整条链路的服务都失败
服务降级
保护下游服务
防止请求突增不可用,确保服务不崩溃
如果降级太多,会触发熔断机制
在OpenFeign的接口上增加一个自定义的fallback回调函数(继承之后重写里面的方法)
服务熔断
Hystrix熔断机制,监控微服务调用情况,默认关闭(引导类添加注解打开)
请求失败率超过一定阈值,触发熔断(快速失败),一定时间内重新尝试请求,
不能响应,继续走熔断机制,微服务可达,关闭熔断,恢复正常请求
微服务监控方式
Springboot-admin
prometheus+Grafana
zipkin 链路追踪工具
skywalking 链路追踪工具
skywalking 程序性能监控工具,链路追踪能力
可以监控:
服务(微服务)
端点(接口)
实例(物理机)
告警服务:发短信发邮件
限流
并发大
用户恶意刷接口
实现方式:
1.Tomcat:可以设置最大的连接数 在xml文件设置
2.Nginx:漏桶算法
3.网关:令牌桶算法
4.自定义拦截器
Nginx限流(漏桶算法)
水滴代表请求的流量
漏桶存储请求
多余请求等待或抛弃
漏桶以固定速率漏出请求
控制并发连接数
网关限流(令牌桶算法)
yml配置文件,微服务路由设置添加局部过滤器
限流对象、平均速率、令牌桶总容量
固定速度生成令牌,存入令牌桶,桶满后暂停生成
请求需要到令牌桶申请令牌
申请到令牌的请求才会被服务处理
没有令牌的请求,会被阻塞或被丢弃
CAP
C一致性(任意节点数据必须一致)
A可用性(不能超时或拒绝)
P分区容错性
分区:因为网络故障导致部分节点与其他节点失联,独立分区
容错:集群出现分区,也要对外提供服务
分区P必然存在(需要网络连接)
AP最终一致性
CP强一致性
BASE是对CAP的一种解决思路
基本可用:允许损失部分可用性,保证核心可用
软状态:允许出现中间状态,临时不一致状态
最终一致性
分布式事务解决方式
seata(XA、AT、TCC)
MQ
seata架构
TC事务协调者:协调全局事务提交或回滚
TM事务管理器:定义全局事务范围,开始、提交、回滚全局事务
RM资源管理器:向TC注册报告分支事务状态,驱动分支事务提交、回滚
XA模式
TM向TC开启全局事务
TM向RM调用分支
RM向TC注册分支事务
RM内部执行业务sql
RM向TC报告事务状态
TM向TC提交、回滚全局事务
TC检查分支事务的状态
TC向RM提交、回滚
AT模式
TM向TC开启全局事务
调用分支
RM向TC注册分支事务
执行业务sql并提交
记录更新前后快照 undo.log
RM向TC报告事务状态
TM向TC提交、回滚全局事务
TC检查事务分支状态
TC通知RM提交/回滚事务
RM删除log/恢复log数据
TCC模式
TM向TC开启全局事务
TM调用分支
RM注册分支事务
RM内进行资源预留(Try)
RM向TC报告事务的状态
TM向TC提交、回滚全局事务
TC检查分支事务状态
TC通知RM提交(完成资源操作业务,try成功Confirm一定成功)
/回滚(预留资源释放,try的反向操作)
MQ模式实现分布式事务 异步 性能最好
分布式服务的接口幂等性
多次调用方法或者接口不会改变业务状态
重复调用的结果与单次调用的结果一致
网络波动用户重复点击、MQ消息重复、使用失败或超时重试机制
RESTful API
GET DELETE 幂等
POST PUT 不是幂等的
新增 数据库唯一索引
token+redis 新增修改
分布式锁 新增修改
token+redis
创建商品、提交订单、转账、支付
第一次请求
客户端获取token
生成唯一token将token存入redis中
返回token
第二次请求
带token请求业务接口
验证token是否存在
存在则处理业务(删除token)
不存在返回
返回请求结果
分布式锁(redisson)
抢不到锁的线程快速失败
控制锁的粒度
xxl-job
解决集群任务的重复执行
cron表达式定义灵活
定时任务失败了,重试和统计
任务量大,分片执行
路由策略
轮询
故障转移:按照顺序依次进行心跳检测,
选择第一个心跳检测成功的机器
分片广播:广播触发对应集群中所有机器执行一次任务
同时系统自动传递分片参数
大数据量的任务同时需要执行
集群部署时,任务路由策略选择分片广播
通过对任务项进行取模就知道这个任务项属于哪个分片