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里面配置邮箱账号密码

相关推荐
不懒不懒2 小时前
【HTML容器与表格布局实战指南】
java·开发语言
J_liaty2 小时前
Java实现PDF添加水印的完整方案(支持灵活配置、平铺、多页策略)
java·开发语言·pdf
一路向北⁢2 小时前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(二)
java·数据库·spring boot·sse·通信
chilavert3182 小时前
技术演进中的开发沉思-349:高效并发(下)
java·jvm
敲敲了个代码3 小时前
从N倍人力到1次修改:Vite Plugin Modular 如何拯救多产品前端维护困境
前端·javascript·面试·职场和发展·typescript·vite
shejizuopin3 小时前
基于SSM的高校旧书交易系统的设计与实现(任务书)
java·mysql·毕业设计·论文·任务书·基于ssm的·高校旧书交易系统的设计与实现
1candobetter3 小时前
JAVA后端开发——Spring Boot 组件化自动配置机制
java·开发语言·spring boot
码农小卡拉3 小时前
MyBatis-Flex 全面解析与实战教程:轻量高效的 MyBatis 增强方案
java·mybatis
没有bug.的程序员3 小时前
Spring Boot 与 Sleuth:分布式链路追踪的集成、原理与线上故障排查实战
java·spring boot·分布式·后端·分布式链路追踪·sleuth·线上故障排查
专注VB编程开发20年3 小时前
无 $ 后缀的变体版函数(Mid、InStr)
java·开发语言