微服务八股
微服务
5大组件
注册中心(Eureka、Nacos、zookeeper等)
远程调用(Feign等)
负载均衡(Ribbon等)
服务熔断(Hystrix、Sentinel等)
网关(Getway、Zuul等)
注册中心
主要作用:服务注册和发现、服务健康监控
服务注册:服务提供者需要把自己的信息注册到注册中心中,如服务名称、ip和端口等
服务发现:消费者拉取服务列表信息,如果服务提供者有集群,则会利用负载均衡算法,选择一个发起调用
服务监控:服务提供者每隔一段时间向注册中心发送心跳,报告健康状态,如果长时间没有收到心跳,这从服务列表里剔除
负载均衡
Ribbon负载均衡策略:
- RoundRobinRule:简单轮询
- WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小
- RandomRule:随机选择
- BestAvailableRule:选择当前并发度低的服务器
- RetryRule:重试机制的选择逻辑
- AvailabilityFilteringRule:先过滤非健康的,再选择连接数较小的实例
- ZoneAvoidanceRule:按区域就近选择服务器
自定义负载均衡策略:
- 实现IRule接口(全局生效)
- 通过配置文件给单独的服务选择负载均衡策略(局部)
服务雪崩
服务雪崩:一个服务失败,导致整条链路的服务都失败的情况
解决方式:
服务降级
在远程调用@FeignClient()中设置fallback
服务熔断
Hystrix熔断机制:如果10s内请求的失败率超过50%触发熔断机制,所有请求都会失败。熔断时间结束后尝试放行请求,如果成功则关闭断路器
限流
监控
用于问题定位和性能分析
常见服务监控工具
- Spring Boot admin
- prometheus + Grafana
- zipkin
- skywalking
限流
为何要限流:
- 并发大
- 防止恶意刷接口
实现方式:
Nginx:漏桶算法(突发流量)、控制并发连接数

网关:过滤器RequestRateLimiter(令牌桶)
自定义拦截器
分布式系统理论
CAP定理:
Consistency:一致性,用户访问分布式系统中的任意节点,得到的数据必须一致
Availability:可用性,访问节点必须得到响应
Partition tolerance:分区容错性,出现分区时也要对外提供服务
分区:由于网络故障等原因造成部分节点与其他节点失去联系
同时只能满足两个,如果要可用性则只能牺牲一致性,反之亦然
BASE理论:
- Basically Available:基本可用,保证核心可用
- Soft State:软状态,允许出现临时的数据不一致
- Eventually Consistent:最终一致性,在软状态结束后,最终达到数据一致
接口幂等性
幂等:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致
如:点击提交订单,点击多次也只能有一次是成功的
| 请求方式 | 说明 |
|---|---|
| GET | 查询操作,天然幂等 |
| POST | 新增操作,不是幂等的 |
| PUT | 更新操作,如果是设置值,是幂等的;如果是在一个值上进行增量操作,不是幂等的 |
| DELETE | 删除操作,是幂等的 |
保证幂等的方式:
token+redis:

如点击购买,生成token存放到redis并返回给前端;之后提交订单则前端带着token来验证,验证成功则生成订单并删除redis中的token,之后的请求就不会重复生成订单
分布式锁:
如第一次提交订单则加锁来生成订单,之后的请求就会由于抢不到锁而不重复生成订单