微服务
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表达式定义灵活
定时任务失败了,重试和统计
任务量大,分片执行
路由策略
轮询
故障转移:按照顺序依次进行心跳检测,
选择第一个心跳检测成功的机器
分片广播:广播触发对应集群中所有机器执行一次任务
同时系统自动传递分片参数
大数据量的任务同时需要执行
集群部署时,任务路由策略选择分片广播
通过对任务项进行取模就知道这个任务项属于哪个分片