注册中心的核心作用是:服务注册和发现,常见的注册中心:eureka、nocas、zookeeper
负载均衡
的方式进行远程调用
eureka作为注册中心,这个也是spring cloud体系中的一个核心组件
服务注册:服务提供者需要把自己的信息注册到eureka,由eureka来保存这些信息,比如服务名称、ip、端口等等
服务发现:消费者向eureka拉取服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法,选择一个发起调用
服务监控:服务提供者会每隔30秒向eureka发送心跳,报告健康状态,如果eureka服务90秒没接收到心跳,从eureka中剔除
Nacos与eureka的共同点(注册中心)
Nacos与Eureka的区别(注册中心)
由于一个项目中存在大量微服务,如果一个服务出现问题,会导致整个接口的调用也出现问题,那么如何定位问题服务就尤为重要。
项目中采用的skywalking进行监控的
1,skywalking主要可以监控接口、服务、物理实例的一些状态。特别是在压测的时候可以看到众多服务中哪些服务和接口比较慢,我们可以针对性的分析和优化。
2,我们还在skywalking设置了告警规则,特别是在项目上线以后,如果报错,我们分别设置了可以给相关负责人发短信和发邮件,第一时间知道项目的bug情况,第一时间修复
限流的实现方式:
Tomcat:可以设置最大连接数
Nginx,漏桶算法
控制速率(突发流量),使用的漏桶算法来实现过滤,让请求以固定的速率处理请求,可以应对突发流量
控制并发数,限制单个ip的链接数和并发链接的总数
分布式系统有三个指标:Consistency(一致性)、Availability(可用性)、Partition tolerance (分区容错性)
Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致
Availability (可用性):用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝
Partition(分区):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。
Tolerance(容错):在集群出现分区时,整个系统也要持续对外提供服务
分布式系统节点之间肯定是需要网络连接的,分区(P)是必然存在的
如果保证访问的高可用性(A),可以持续对外提供服务,但不能保证数据的强一致性–> AP
如果保证访问的数据强一致性(C),就要放弃高可用性 --> CP
BASE理论是对CAP的一种解决思路,包含三个思想:
•Basically Available(基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
•Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。
•Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。
上图中,各个服务可以在事务提交前发送相应的执行情况给事务协调者,事务协调者来判断各个事务的状态从而决定是否提交。此时的服务就处于以一种软状态。
解决分布式事务的思想和模型:
最终一致思想:各分支事务分别执行并提交,如果有不一致的情况,再想办法恢复数据(AP)
强一致思想:各分支事务执行完业务不要提交,等待彼此结果。而后统一提交或回滚(CP)
只要是发生了多个服务之间的写操作,都需要进行分布式事务控制
Seata事务管理中有三个重要的角色:
TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。
TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - **资源管理器:**管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
- XA模式,CP,需要互相等待各个分支事务提交,可以保证强一致性,性能差
- AT模式,AP,底层使用undo log 实现,性能好
- TCC模式,AP,性能较好,不过需要人工编码实现
幂等: 多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。
需要幂等场景:
接口幂等以及解决方式:基于RESTful API的角度对部分常见类型请求的幂等性特点进行分析
public void saveOrder(Item item) throws InterruptedException {
//获取锁(重入锁),执行锁的名称
RLock lock = redissonClient.getLock("heimalock");
//尝试获取锁,参数分别是:获取锁的最大等待时间(期间会重试),锁自动释放时间,时间单位
boolean isLock = lock.tryLock(10, TimeUnit.SECONDS);
try {
//判断是否获取成功
if (!isLock) {
log.info("下单操作获取锁失败,order:{}",item);
throw new RuntimeException("新增或修改失败");
}
//下单操作
} finally {
//释放锁
lock.unlock();
}
}
快速失败(抢不到锁的线程)
控制锁的粒度
xxl-job解决的问题:
解决集群任务的重复执行问题
cron表达式定义灵活
定时任务失败了,重试和统计
任务量大,分片执行
1.FIRST(第一个):固定选择第一个机器;
2.LAST(最后一个):固定选择最后一个机器;
3.ROUND(轮询)
4.RANDOM(随机):随机选择在线的机器;
5.CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
6.LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
7.LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
8.FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
9.BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
10.SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
故障转移(上面的路由策略)+失败重试(设置重试次数),查看日志分析----> 邮件告警
执行器集群部署时,任务路由策略选择分片广播情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务。l在任务执行的代码中可以获取分片总数和当前分片,按照取模的方式分摊到各个实例执行