微服务八股(自用)

时间:2025-05-14 13:15:59

微服务

SpringCloud

注册中心:Eureka

负载均衡:Ribbon

远程调用:Feign

服务熔断:Hystrix

网关:Gateway/Zuul

Alibaba

配置中心:Nacos

负载均衡:Ribbon

服务调用:Feign

服务保护:sentinel

服务网关:Gateway

注册中心:服务注册和发现

1.注册服务(心跳续约,每30s一次)

2.拉取服务,服务提供者信息

3.负载均衡选择服务提供者

4.远程调用

Nacos

yml设置非临时实例

临时实例采用心跳监测

非临时实例nacos主动询问,主动向服务消费者推送变更消息

Nacos和Eureka

同:服务注册,服务拉取,心跳方式健康监测

异:

  1. nacos支持服务端主动监测提供者状态

    1. 临时实例:心跳模式

    2. 非临时实例:主动检测模式

  2. 临时实例不正常会被剔除,非临时实例不会剔除

  3. nacos服务变更推送

  4. 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表达式定义灵活

定时任务失败了,重试和统计

任务量大,分片执行

路由策略

轮询

故障转移:按照顺序依次进行心跳检测,

选择第一个心跳检测成功的机器

分片广播:广播触发对应集群中所有机器执行一次任务

同时系统自动传递分片参数

大数据量的任务同时需要执行

集群部署时,任务路由策略选择分片广播

通过对任务项进行取模就知道这个任务项属于哪个分片