分布式基础
微服务
所谓微服务,就是把传统的单体项目的各个服务拆分出来单独部署,每个小服务 运行在自己 的进程中,他们之间通过 HTTP 调用进行通信。提高服务弹性、可维护性。
集群&分布式&节点
- 集群指的是将几台服务器集中在一起,实现同一业务。
- 分布式是指将不同的业务分布在不同的地方,也就是多个节点。
- 每个节点都可以做个集群,比如一个项目有 ABC 三个服务分别部署,这就是分布式,每个服务可能要部署在多个服务器提高并发量如 A1、A2、A3、B1、B2、B3,每个服务就形成了自己的集群。
远程调用+负载均衡
各个微服务之间一般通过 http+json 完成调用,若 A 服务调用 B 服务,B 服务部署了多个服务器,那么 A 调用任意一个服务器均可完成功能。 为了使每一个服务器都不要太忙或者太闲,可以负载均衡的调用每一个服务器,提升网站的健壮性。
常见负载均衡算法:
**轮询:**按顺序往后依次调用,然后循环。
最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
散列:根据请求源的 IP 的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
服务注册发现&注册中心
A 服务调用 B 服务,就得知道 B 服务的 IP 地址、哪个服务可以正常调用,哪个服务已经下线。解决这个问题可以引入注册中心;每个服务上线后把自己注册到注册中心,其他服务要调用时就从注册中心获取可调用的服务 IP 地址即可。
配置中心
每个服务单独部署出来,可能配置是不同的,如果单独写死在服务上可维护扩展性差,为了满足灵活的配置变更,可以把所有服务的配置写在配置中心,让每个服务在配置中心获取自己的配置。

服务熔断&降级
在微服务架构中,服务之间往往形成链式调用,A->B->C,假如在 B 服务不可用,可能会阻塞到该服务,导致后续的服务进来后也一直阻塞直到资源耗尽,整条链路发生雪崩,因此要有熔断和降级机制保护服务。
- 服务熔断
设置服务的超时,当被调用的服务在规定时间内没返回数据或达到一定失败次数,就触发断路保护机制,后来的请求不再去调用这个服务,本地直接返回默认的数据。- 服务降级
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】
API 网关
一夫当关,万夫莫开。微服务的入口,一般抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能。

微服务解决方案&工具
个人以为常用的微服务解决体系大概有两套,分别是 SpringCloud 和 SpringCloudAlibaba,比如 API 网关,SpringCloud 用的是 GateWay,SpringCloudAlibaba 则是 Higress,当然两者的各个工具也是可以混用的。
Nacos
Nacos 通常作为注册配置中心,用于服务注册、发现、配置管理等
面试题

OpenFeign
OpenFeign 是一个声明式http 远程调用工具,底层内置 Ribbon,可以直接根据服务名称去注册中心拿到指定的可用服务 IP 集合,并进行负载均衡式的调用,还可以设置超时、重试机制、兜底返回 fallback,该方式简化了微服务之间的通信,减少了代码编写。
除了声明式,还有编程式 RestTemplate,该方式需要在代码中手动编程调用。
有意思的是,如果 MVC 的注解写在 controll 层就是接受请求,写在 FeignClient 就是发送请求,如下图:

客户端和服务端负载均衡区别

Sentinel
资源&规则
所有 web 接口皆可视为资源,除此之外还要设置资源的访问规则,如流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则、热点参数规则

Gateway
略
Seata
分布式事务的解决方案,一个购买操作涉及账户、订单、库存三个服务,每个服务分别部署,其数据库也不同,单个子操作的事务是一致性的,但是要保证三个子操作的事务一致性。

