分布式八股
1 微服务概念
- 以前的模式是所有的代码在同一个工程中部署在同一个服务器中,同一个项目的不同模块不同功能互相抢占资源。
- 微服务是将工程根据不同的业务规则拆分成微服务,微服务部署在不同的机器上,服务之间进行相互调用。
- Java 微服务的框架有:dubbo(只能用来做微服务),spring cloud(提供了服务的发现,断路器等)。
2 多应用架构特点
多应用架构&微服务架构的区别
- 粒度: 微服务架构的粒度更细,每个服务只负责一个特定的业务功能。多应用架构的粒度较粗,每个应用程序可能包含多个业务功能。
- 通信: 微服务架构通常使用轻量级协议(如HTTP)进行通信,多应用架构可能使用更复杂的通信方式(如 API)。
- 耦合度: 微服务架构的服务之间耦合度低,多应用架构的应用程序之间耦合度较高。
- 独立性: 微服务架构的服务可以独立部署、扩展和升级,多应用架构的应用程序也有一定的独立性,但不如微服务架构那么灵活。
多应用架构 就是把原来的应用按照业务特点拆分成多个应用。
- 比如一个大型电商系统可能包含用户系统、商品系统、订单系统、评价系统等独立成单独的应用。
- 多应用架构的特点是应用之间各自独立,不相互调用。
多应用虽然解决了应用臃肿问题,但应用之间相互独立,有些共同的业务或代码无法复用。
3 微服务架构缺点
- 微服务架构可能带来过多的操作
- 需要 DevOps 技巧
- 可能付出双倍的努力
- 分布式部署导致问题难以跟踪
- 分布式系统可能复杂难以管理,且服务增加,管理复杂性增加
4 简述服务化的特点与好处
4.1 服务化的特点
- 应用按业务拆分成服务
- 各个服务均可独立部署
- 服务之间可以通信
- 服务可被多个应用共享
4.2 服务化的好处
- 架构上系统更加清晰
- 核心模块稳定,以服务组件为单位进行升级,避免了频繁发布带来的风险
- 开发管理方便
- 单独团队维护、工作分明,职责清晰
- 业务复用、代码复用
- 非常容易拓展
5 两种服务发现的方式是&各自的优缺点
5.1 客户端发现
- 优点:知道所有可用服务端实际地址
- 缺点:要自己定义负载均衡规则去筛选服务
5.2 服务端发现
- 优点:服务端对于客户端而言是透明的,无需关注服务端。
- 缺点:特定情况下需要特殊处理
6 Spring Cloud 概念
- Spring Cloud为开发人员提供了快速构建分布式系统的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。
- 分布式系统的协调导致了锅炉板模式,并且使用 Spring Cloud 开发人员可以快速地站起来来实现这些模式的服务和应用程序。
- 它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管平台,Cloud Foundry。
7 Spring Cloud 中的负载均衡实现原理
在分布式系统中,如果某个服务有多个实例运行,需要将请求分发到这些实例上以实现负载均衡。
- Spring Cloud 中可以通过集成负载均衡组件如 Ribbon 来实现负载均衡。
- Ribbon 是一个客户端负载均衡器,它可以根据设定的负载均衡策略和服务实例列表,将请求分发到不同的实例上。
8 负载平衡意义
- 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。
- 负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。
- 使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。
- 负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
9 Eureka 作用
Eureka是 Netflix 的一个子模块,也是核心模块之一。Eureka 是一个基于 REST 的服务,用于定位服务,做服务注册与发现。
10 Spring Cloud 中服务注册与发现概念&作用
服务注册与发现 是分布式系统中实现服务自动化管理的关键机制。
- 在 Spring Cloud 中,通过集成 Eureka、Consul、Zookeeper 等服务注册中心,实现了服务的自动注册与发现。
- 服务在启动时将自己的元数据(如服务名称、地址、端口等)注册到注册中心。
- 其他服务可以通过查询注册中心来获取所需服务的地址和实例列表。
这样,服务之间的通信就可以直接通过服务实例之间的网络通信进行,而不需要手动管理每个服务的地址和端口信息,极大地简化了服务的管理和维护。
11 如何理解 Spring Boot 中 Starters
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术。
例如,如果你想使用 Spring JPA 访问数据库,只要加入
spring-boot-starter-data-jpa
启动器依赖就能使用了。Starters 包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
12 列举常用 Spring Boot 依赖模块及其主要功能
spring-boot-starter
:核心启动器,包含自动配置、日志和 YAML 文件的支持。spring-boot-starter-web
:支持全栈 web 开发,包括 tomcat 和 spring-webmvc。spring-boot-starter-jdbc
:支持 JDBC 数据库。spring-boot-starter-test
:支持常规的测试依赖。spring-boot-starter-data-jpa
:支持 JPA。spring-boot-starter-security
:支持 spring-security。
13 如何实现 Spring Boot 应用程序的安全性
引入依赖 spring-boot-starter-security
,并且必须添加安全配置。
- 它只需要很少的代码。
- 配置类将必须继承
WebSecurityConfigurerAdapter
并重写方法。
14 列举三个 Spring Boot 的异常处理
error.html
:如果使用 Thymeleaf,可以直接在模板中创建error.html
。异常会直接传递到error.html
中。@ExceptionHandler
:在类中使用@ExceptionHandler
注解来捕抓特定的异常类。- 实现
@ControllerAdvice
类,来处理控制器类抛出的所有异常。
15 Spring Boot 中的监视器概念
Spring Boot Actuator 可帮助您访问生产环境中正在运行的应用程序的当前状态。
- 有几个指标必须在生产环境中进行检查和监控,外部应用程序可以使用这些指标向相关人员发送警报。
- Actuator 模块公开了一组 REST 端点,这些端点可通过 HTTP URL 直接访问,方便检查应用程序状态。
16 如何监视所有 Spring Boot 微服务
Spring Boot 提供监控器端点(Actuator endpoints)以监控各个微服务的度量指标。
- 这些端点对于获取应用程序信息(如是否已启动)以及其组件(如数据库)是否正常运行非常有帮助。
- 主要缺点是必须单独访问端点才能了解其状态或健康状况。
[Spring Boot Admin](https://github.com/codecentric/spring-boot-admin)
Spring Boot Admin 构建于 Spring Boot Actuator 之上,它提供了一个 Web UI 界面,使我们能够可视化多个应用程序的度量指标。
17 YAML 概念
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。
- 与属性文件相比,在配置文件中添加复杂的属性时,YAML 文件更加结构化,更少混淆。
- YAML 具有分层配置数据。
18 服务网关概念&作用
服务网关 是一个在微服务架构中充当所有外部请求入口的组件。
- 它可以进行 请求的路由和转发。
- 提供 负载均衡、安全认证、降级处理、限流、缓存 等一系列功能。
服务网关能够帮助开发者实现对外统一的 API 接口,提高系统的安全性和可维护性。
- 在 Spring Cloud 中,通过集成 Zuul 或 Spring Cloud Gateway 等组件,能够实现服务网关的功能。
19 Swagger 概念
- Swagger 广泛用于可视化 API, Swagger UI 为前端开发人员提供在线沙箱。
- Swagger 是用于生成 RESTful Web 服务的可视化表示的工具、规范和完整框架实现。
- Swagger 使文档能够以与服务器同步更新。
- 当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。
- 因此,Swagger 消除了调用服务时的猜测。
20 Spring Cloud 中的服务熔断概念&使用原因
服务熔断 是一种防止服务雪崩效应的机制。
- 即在服务不可用或异常时,快速停止对该服务的调用,并返回一个预设的响应,而不是等待超时或异常。
- 服务熔断可以提高系统的稳定性和可用性,避免级联故障的发生。
Hystrix 服务熔断
在 Spring Cloud 中,通过集成 Hystrix,实现了服务熔断功能。
- Hystrix 中的熔断器会根据预设的条件监控服务的调用情况。
- 当服务达到预设的阈值时,会触发熔断,从而停止对该服务的调用,并返回一个预设的响应,避免服务雪崩。