java面试day4 | 微服务、Spring Cloud、注册中心、负载均衡、CAP、BASE、分布式接口幂等性、xxl-job

目录

[Spring Cloud](#Spring Cloud)

常见组件

注册中心eureka/nocas

Nacos

Springcloud-ribbon负载均衡、负载均衡策略、自定义负载均衡

Feign

服务雪崩、熔断降级

微服务的监控--skywalking

业务问题

微服务限流

分布式系统理论--CAP和BASE

业务问题

分布式事务解决方案

分布式服务的接口幂等性如何设计

[项目中使用了什么分布式任务调度? xxl-job](#项目中使用了什么分布式任务调度? xxl-job)


Spring Cloud

常见组件

左边:

这些是 Spring Cloud 早期依赖的 Netflix 公司的组件,曾是微服务的 "经典组合":

组件 通俗理解(类比电商场景) 核心作用
Eureka 「服务注册中心」→ 电商的 "员工通讯录" 所有服务启动时,都到 Eureka 登记自己的地址;其他服务要调用时,先去 Eureka 查 "谁在线"。
Ribbon 「负载均衡器」→ 电商的 "智能分流员" 当一个服务有多个实例(比如商品服务部署了 3 台服务器),Ribbon 帮你选压力最小的实例调用,防止某台服务器被打崩。
Feign 「远程调用工具」→ 电商的 "跨部门传话筒" 让服务间的远程调用像 "本地方法调用" 一样简单(不用自己写 HTTP 请求)。比如订单服务调用商品服务,像调用自己的方法。
Hystrix 「服务熔断 / 降级」→ 电商的 "电路保险丝" 当某个服务(比如支付服务)响应超时或崩溃,Hystrix 会 "熔断"(暂时切断调用),防止故障蔓延;同时返回降级结果(比如 "支付繁忙,请稍后再试")。
Zuul/Gateway 「网关」→ 电商的 "前台接待员" 所有外部请求(用户访问、App 调用)都先经过网关,由网关统一做权限校验、路由转发(比如/user/**的请求转发到用户服务)。

右边:

因为 Netflix 部分组件停止维护,国内更多用 Spring Cloud Alibaba(阿里开源的微服务方案),核心组件更适配国内场景:

组件 通俗理解(类比电商场景) 核心作用
Nacos 「注册中心 + 配置中心」→ 电商的 "通讯录 + 配置共享文档" 同时干 Eureka(服务注册)和 "配置中心" 的活(所有服务的配置,比如数据库地址,都存在 Nacos,动态刷新)。
Sentinel 「服务保护」→ 电商的 "智能保险丝 + 流控闸门" 替代 Hystrix,更强大的服务熔断、限流工具。比如限制商品服务每秒最多处理 1000 个请求,防止流量洪峰压垮服务。
Ribbon/Feign/Gateway (和左边作用一致) 负载均衡、远程调用、网关的功能和左边一致,Spring Cloud Alibaba 也支持这

注册中心eureka/nocas

注册中心功能:服务健康监控

如果注册中心90秒没有接收到某一个服务提供者的心跳续约,就认为这个服务器不可使用

Nacos

默认ephemeral是true,即临时实例

在分布式系统中,一致性Consistensy和可用性availability是矛盾的 --- CAP定理

注册中心需要在两者间做权衡:

  • Eureka :只支持 AP 模式(优先保证可用性)。即使集群中部分节点故障,仍能提供服务,但数据可能暂时不一致(比如某个服务已经下线,但个别节点还没同步到)。
  • Nacos :默认用 AP 模式 (和 Eureka 一样,优先保证可用性);但如果注册中心存在非临时实例 ,会自动切换为 CP 模式(优先保证一致性,此时如果集群节点不足,可能暂时不可用,但数据绝对一致)。

简单说:Nacos 能根据实例类型,灵活切换 "更在乎可用性" 还是 "更在乎一致性",而 Eureka 只选 "可用性"。

Eureka 只有 "服务注册" 一个功能 ,而 Nacos 还能当 "配置中心"

  • 什么是配置中心?比如微服务的数据库地址、限流规则、功能开关等配置,都可以集中存在 Nacos 里,所有服务从 Nacos 拉取配置。
  • 好处:不用把配置写死在代码里,改配置时不用重启服务,直接从 Nacos 动态刷新即可(比如要修改数据库地址,改 Nacos 里的配置,所有服务会自动更新)。

Springcloud-ribbon负载均衡、负载均衡策略、自定义负载均衡

默认的ribbon负载均衡策略是ZoneAvoidanceRule

Feign

Feign 是 Spring Cloud 中的一个组件,它是一种声明式、模板化的 HTTP 客户端, 主要用于在微服务架构中实现服务间的远程调用。

在微服务架构中,各个服务是独立部署运行的,服务 A 可能需要调用服务 B 提供的接口来完成某些业务逻辑,Feign 就是用来简化这种跨服务调用过程的。 它让开发者可以像调用本地方法一样调用远程服务的 API,而不需要手动编写复杂的 HTTP 请求代码,比如创建HttpURLConnection对象、设置请求头、处理响应等。

  1. 接口定义 :开发者通过定义一个带有@FeignClient注解的接口来声明要调用的远程服务。@FeignClient注解指定了被调用服务的名称等信息,Feign 会根据这些信息找到对应的服务实例。
  2. 动态代理:Feign 利用 Java 的动态代理机制,在运行时为定义的接口生成代理对象。
  3. 请求处理 :当调用代理对象的方法时,Feign 会将方法调用转换为对应的 HTTP 请求,并根据接口方法上的注解(如@GetMapping@PostMapping等)来确定请求的类型、路径等信息。
  4. 响应处理:Feign 发送 HTTP 请求到目标服务,获取响应后,会将响应数据按照定义的返回值类型进行解析和转换,返回给调用方。

服务雪崩、熔断降级

如果降级太多,会发生熔断机制

服务降级:针对某一个接口

服务熔断:针对于整个服务

微服务的监控--skywalking

zipkin和代码有耦合,不常使用

zipkin、skywalking都是链路追踪工具

APM工具:应用程序性能监控工具

问题定位:

性能分析:

服务关系:

服务告警:可自行配置规则

业务问题

微服务限流

单体项目可以使用tomcat,

令牌桶存储的是令牌,漏桶存储的是请求,两个都可以处理突发的请求

令牌桶生成的令牌是存储到redis的

分布式系统理论--CAP和BASE

业务问题

分布式事务解决方案

seata的XA模式是CP:保证强一致性,需要互相等待

AT模式是AP:高可用,是seata推荐的模式,也是开发常用的模式

TCC也是AP模式,性能相对也是比较高的,

缺点是TCC中的try资源预留、confirm资源操作、cancel资源释放完全是需要自己编程实现的,而XA和AT模式中的这些操作是框架来完成的

借呗和支付宝不是一个系统,通过MQ解决分布式事务的问题,异步,性能高,但是实时性差,如果对数据一致性要求没有那么高,可以使用这个方法

但是要保证mysql和MQ的操作要在同一个事务内执行

分布式服务的接口幂等性如何设计

锁的粒度越小越好,其他的进程等待的时间越少

项目中使用了什么分布式任务调度? xxl-job

邮件发送需要在application.properties里面配置邮箱账号密码

相关推荐
超级大只老咪5 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶5 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长5 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子5 小时前
JDK 安装配置
java·开发语言
星哥说事5 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
写写闲篇儿5 小时前
微软面试之白板做题
面试·职场和发展
派大鑫wink5 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII5 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home6 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
醇氧6 小时前
org.jetbrains.annotations的@Nullable 学习
java·开发语言·学习·intellij-idea