springboot第46集:Nginx,Sentinel,计算机硬件的介绍

1899476dd1ba14d747ea96f15fd0c46e.png
d19d74ab962a6489f5fc3502996d378b.png
34d809f9894feb8e247c7ceaff8c6164.png
d20d29be15e88e971796d3267768aa6e.png
cee703bb1199e30261419424a607bdae.png
2e87288a844a9caa75e12d041297a460.png
007895367507e7162465ed6e3309c704.png
380d3257e4de814b82acff4e5959b852.png
ab2b1800f7a136436df5e5691be08df1.png
8f05e9739e65508c50838d6b1a8fd868.png
d13bbfb1a3521c17e5bfd54f17baf405.png
31fae2a6c2dbc5096065ca260b44b970.png
b686f2fe7b395d5bc74734e1bac2604b.png
a6dca3588ea86da5e7e5c93fc7fd2db4.png
419ad612e099191ad07c8fa6d97de029.png
  1. 什么是单点容错率低: 单点容错率低指的是系统中存在某个关键节点,一旦这个节点发生故障或崩溃,整个系统的容错能力会显著下降。这可能导致系统无法正常运行,因为系统的其他部分可能会依赖于该节点。
  2. 什么场景无法针对不同模块进行针对性优化和水平扩展: 在某些场景中,系统的不同模块之间存在强耦合或复杂的依赖关系,导致无法对单独的模块进行优化和水平扩展。例如,如果一个系统的各个模块之间紧密耦合,修改其中一个模块可能会影响其他模块,使得无法独立扩展或优化某个特定功能。
  3. 什么是系统间耦合度变高: 系统间耦合度变高表示不同系统之间的依赖关系增加,一个系统的改动可能会对其他系统产生较大影响。这可能导致系统难以维护、升级,降低了系统的灵活性和可维护性。
  4. 如何操作使用一个调度中心对集群进行实时管理: 使用调度中心,可以通过集中管理和监控集群中的各个节点,实时获取节点的状态、资源利用率等信息。操作包括节点的动态伸缩、任务的调度与分配,以确保集群中的各项任务高效运行。
  5. 如何资源调度和治理中心(SOA Service Oriented Architecture): 在SOA中,资源调度和治理中心负责协调和管理各个服务,包括服务的注册与发现、负载均衡、流量控制等。通过中心化的资源调度和治理,可以更好地维护和监控整个服务架构。
  6. 是否有过服务间会有依赖关系,一旦某个环节出错会影响较大(服务雪崩): 是的,服务雪崩是指系统中的多个服务之间存在依赖关系,当其中一个服务出现故障时,可能引起整个系统的级联故障,导致大范围的服务不可用。为了避免服务雪崩,需要采取合适的容错机制、熔断策略和限流措施。
  7. 如何理解服务关系复杂,运维、测试部署困难 & 微服务架构比较,什么是微服务,如何做到微服务集群架构,如何做到每个服务于服务之间互不影响: 微服务是一种架构风格,将一个大型的应用程序拆分为一组小型、独立、可独立开发、部署和扩展的服务。微服务集群架构通过独立的服务单元组成整个应用,每个服务都有自己的数据库,通过轻量级的通信机制进行交互。互不影响的关键在于服务之间的独立性,服务应该定义明确的接口,通过API进行通信,使得修改一个服务不会影响其他服务。
  8. 如何理解SOA架构粒度会更加精细,SOA 架构中可能数据库存储会发生共享: SOA(面向服务的架构)的粒度较微服务更加粗,服务可能包含多个功能模块。在SOA中,服务的设计和划分更注重业务过程和功能模块的组织,数据库存储可能会共享。SOA通常采用企业服务总线(ESB)来协调和整合各个服务。
  9. 微服务强调每个服务都是单独数据库,保证每个服务于服务之间互不影响,如何做到: 为了保证每个微服务的独立性,每个服务都应该有自己的数据存储,不直接共享数据库。服务之间通过定义清晰的API进行通信,而不是直接访问数据库。这样做可以确保修改一个服务不会影响其他服务,提高了系统的可维护性和独立性。
  10. 讲解你对nacos,restful rpc dubbo feign,gateway,sentinel,skywalking的理解:
  • Nacos: Nacos是一个开源的服务发现、配置管理和服务管理平台,可以实现动态配置管理、服务发现和服务健康监测。
  • RESTful: RESTful是一种基于HTTP协议的Web服务架构风格,强调使用标准的HTTP方法和状态码进行通信。
  • RPC(远程过程调用): RPC是一种通过网络调用远程计算机上的程序或服务的协议,Dubbo是一种常见的RPC框架。
  • Feign: Feign是一个声明式的Web Service客户端,可以简化HTTP API的调用。
  • Gateway: Gateway是一个API网关服务,用于处理和路由请求,提供负载均衡、安全性和监控等功能。
  • Sentinel: Sentinel是一款开源的流量控制和服务保护框架,用于应对分布式系统中的流量突增和服务异常。
  • SkyWalking: SkyWalking

网页是通过 HTTPS 加密协议加载的,但是尝试连接到不安全的 WebSocket 地址 'ws://',而不是安全的 WebSocket 地址 'wss:///r'。

浏览器强制执行同源策略,要求在加载通过 HTTPS 加密协议的网页时,所有的资源请求也必须通过 HTTPS。由于 WebSocket 连接是通过 JavaScript 代码发起的,浏览器会阻止不安全的 WebSocket 连接,以确保安全性。

解决方法是确保 WebSocket 连接也使用安全的 'wss' 协议,而不是 'ws'。确保你的服务器支持安全的 WebSocket 连接,同时确保在代码中使用的 WebSocket 地址是 ''。这样就能解决混合内容错误。

DOMException: Failed to construct 'WebSocket':不安全的WebSocket连接可能无法从通过HTTPS加载的页面启动。

3967196a386f72ad8a191b5c8832a145.png

image.png

使用GIF上报的原因

向服务器端上报数据,可以通过请求接口,请求普通文件,或者请求图片资源的方式进行。只要能上报数据,无论是请求GIF文件还是请求js文件或者是调用页面接口,服务器端其实并不关心具体的上报方式。那为什么所有系统都统一使用了请求GIF图片的方式上报数据呢?

  • 防止跨域

一般而言,打点域名都不是当前域名,所以所有的接口请求都会构成跨域。而跨域请求很容易出现由于配置不当被浏览器拦截并报错,这是不能接受的。但图片的src属性并不会跨域,并且同样可以发起请求。(排除接口上报)

  • 防止阻塞页面加载,影响用户体验

通常,创建资源节点后只有将对象注入到浏览器DOM树后,浏览器才会实际发送资源请求。反复操作DOM不仅会引发性能问题,而且载入js/css资源还会阻塞页面渲染,影响用户体验。

但是图片请求例外。构造图片打点不仅不用插入DOM,只要在js中new出Image对象就能发起请求,而且还没有阻塞问题,在没有js的浏览器环境中也能通过img标签正常打点,这是其他类型的资源请求所做不到的。(排除文件方式)

  • 相比PNG/JPG,GIF的体积最小

最小的BMP文件需要74个字节,PNG需要67个字节,而合法的GIF,只需要43个字节。

同样的响应,GIF可以比BMP节约41%的流量,比PNG节约35%的流量。

  • PerformanceTiming.navigationStart
  • 是一个无符号long long 型的毫秒数,表征了从同一个浏览器上下文的上一个文档卸载(unload)结束时的UNIX时间戳。如果没有上一个文档,这个值会和PerformanceTiming.fetchStart相同。
  • PerformanceTiming.unloadEventStart
  • 是一个无符号long long 型的毫秒数,表征了unload事件抛出时的UNIX时间戳。如果没有上一个文档,or if the previous document, or one of the needed redirects, is not of the same origin, 这个值会返回0.
  • PerformanceTiming.unloadEventEnd
  • 是一个无符号long long 型的毫秒数,表征了unload事件处理完成时的UNIX时间戳。如果没有上一个文档,or if the previous document, or one of the needed redirects, is not of the same origin, 这个值会返回0.
  • PerformanceTiming.redirectStart
  • 是一个无符号long long 型的毫秒数,表征了第一个HTTP重定向开始时的UNIX时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回0.
  • PerformanceTiming.redirectEnd
  • 是一个无符号long long 型的毫秒数,表征了最后一个HTTP重定向完成时(也就是说是HTTP响应的最后一个比特直接被收到的时间)的UNIX时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回0.
  • PerformanceTiming.fetchStart
  • 是一个无符号long long 型的毫秒数,表征了浏览器准备好使用HTTP请求来获取(fetch)文档的UNIX时间戳。这个时间点会在检查任何应用缓存之前。
  • PerformanceTiming.domainLookupStart
  • 是一个无符号long long 型的毫秒数,表征了域名查询开始的UNIX时间戳。如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 PerformanceTiming.fetchStart一致。
  • PerformanceTiming.domainLookupEnd
  • 是一个无符号long long 型的毫秒数,表征了域名查询结束的UNIX时间戳。如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 PerformanceTiming.fetchStart一致。
  • PerformanceTiming.connectStart
  • 是一个无符号long long 型的毫秒数,返回HTTP请求开始向服务器发送时的Unix毫秒时间戳。如果使用持久连接(persistent connection),则返回值等同于fetchStart属性的值。
  • PerformanceTiming.connectEnd
  • 是一个无符号long long 型的毫秒数,返回浏览器与服务器之间的连接建立时的Unix毫秒时间戳。如果建立的是持久连接,则返回值等同于fetchStart属性的值。连接建立指的是所有握手和认证过程全部结束。
  • PerformanceTiming.secureConnectionStart
  • 是一个无符号long long 型的毫秒数,返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。如果当前网页不要求安全连接,则返回0。
  • PerformanceTiming.requestStart
  • 是一个无符号long long 型的毫秒数,返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。
  • PerformanceTiming.responseStart
  • 是一个无符号long long 型的毫秒数,返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。如果传输层在开始请求之后失败并且连接被重开,该属性将会被数制成新的请求的相对应的发起时间。
  • PerformanceTiming.responseEnd
  • 是一个无符号long long 型的毫秒数,返回浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。
  • PerformanceTiming.domLoading
  • 是一个无符号long long 型的毫秒数,返回当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的 readystatechange事件触发时)的Unix毫秒时间戳。
  • PerformanceTiming.domInteractive
  • 是一个无符号long long 型的毫秒数,返回当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的Unix毫秒时间戳。
  • PerformanceTiming.domContentLoadedEventStart
  • 是一个无符号long long 型的毫秒数,返回当解析器发送DOMContentLoaded 事件,即所有需要被执行的脚本已经被解析时的Unix毫秒时间戳。
  • PerformanceTiming.domContentLoadedEventEnd
  • 是一个无符号long long 型的毫秒数,返回当所有需要立即执行的脚本已经被执行(不论执行顺序)时的Unix毫秒时间戳。
  • PerformanceTiming.domComplete
  • 是一个无符号long long 型的毫秒数,返回当前文档解析完成,即Document.readyState 变为 'complete'且相对应的``readystatechange 被触发时的Unix毫秒时间戳。
  • PerformanceTiming.loadEventStart
  • 是一个无符号long long 型的毫秒数,返回该文档下,load事件被发送时的Unix毫秒时间戳。如果这个事件还未被发送,它的值将会是0。
  • PerformanceTiming.loadEventEnd
  • 是一个无符号long long 型的毫秒数,返回当load事件结束,即加载事件完成时的Unix毫秒时间戳。如果这个事件还未被发送,或者尚未完成,它的值将会是0.

1.区间阶段耗时

DNS 解析耗时

代码语言:javascript
复制
dns: timing.domainLookupEnd - timing.domainLookupStart

TCP 连接耗时

代码语言:javascript
复制
tcp: timing.connectEnd - timing.connectStart

SSL 安全连接耗时

代码语言:javascript
复制
ssl: timing.connectEnd - timing.secureConnectionStart

Time to First Byte(TTFB),网络请求耗时 TTFB 有多种计算方式,ARMS 以 Google Development 定义为准

代码语言:javascript
复制
ttfb: timing.responseStart - timing.requestStart

数据传输耗时

代码语言:javascript
复制
trans: timing.responseEnd - timing.responseStart

DOM 解析耗时

代码语言:javascript
复制
dom: timing.domInteractive - timing.responseEnd

资源加载耗时

代码语言:javascript
复制
res: timing.loadEventStart - timing.domContentLoadedEventEnd

2.关键性能指标

首包时间

代码语言:javascript
复制
firstbyte: timing.responseStart - timing.domainLookupStart

First Paint Time, 首次渲染时间 / 白屏时间

代码语言:javascript
复制
fpt: timing.responseEnd - timing.fetchStart

Time to Interact,首次可交互时间

代码语言:javascript
复制
tti: timing.domInteractive - timing.fetchStart

HTML 加载完成时间, 即 DOM Ready 时间

代码语言:javascript
复制
ready: timing.domContentLoadedEventEnd - timing.fetchStart

页面完全加载时间

代码语言:javascript
复制
load:timing.loadEventEnd - timing.fetchStart
代码语言:javascript
复制
<template>
  <input
    type="file"
    id="myFile"
    ref="file"
    @change="handleUpload($event)"
    accept=".pdf" <!-- 限制文件类型为 PDF -->
  />
</template>

<script>
export default {
  methods: {
    handleUpload(event) {
      const fileInput = event.target;
      const file = fileInput.files[0];

      if (!file) {
        return; // 用户取消选择文件
      }

      // 检查文件类型
      if (file.type !== "application/pdf") {
        alert("请选择 PDF 文件");
        fileInput.value = ""; // 清空文件选择框
        return;
      }

      // 检查文件大小
      const maxSize = 5 * 1024 * 1024; // 5MB
      if (file.size > maxSize) {
        alert("文件大小不能超过 5MB");
        fileInput.value = ""; // 清空文件选择框
        return;
      }

      // 执行上传文件的操作
      // 这里可以调用你的上传文件的函数
      // this.uploadFile(file);
    },
  },
};
</script>

QPS 是 "Queries Per Second"(每秒查询数)的缩写。它是衡量系统性能的一个指标,表示系统每秒能够处理的查询或请求的数量。QPS 常用于衡量一个服务、系统或网络设备的性能,特别是在涉及到大量请求的网络服务中,QPS 是一个重要的性能指标。

高 QPS 值通常表示系统能够高效地处理大量请求,而低 QPS 值可能意味着系统性能不足,无法满足用户或客户端的需求。QPS 的具体值取决于系统的设计、硬件性能、网络状况等多个因素。

在一些场景中,特别是在互联网服务、数据库、缓存等领域,QPS 是评估系统性能的重要标准之一。维护一个较高的 QPS 对于确保系统的高可用性和稳定性至关重要。

  • <project.build.sourceEncoding> 指定了项目的源代码编码为 UTF-8。
  • <project.reporting.outputEncoding> 指定了项目报告的输出编码为 UTF-8。
  • <java.version> 指定了项目使用的 Java 版本为 1.8。

这是 Maven 项目的 pom.xml 文件中的 <parent> 元素,用于指定 Spring Boot 项目的父级。Spring Boot 提供了一个用于简化构建的 Maven POM 文件,称为 "spring-boot-starter-parent"。

具体来说:

  • <groupId> 指定了 Maven 组织的标识符,这里是 "org.springframework.boot",表示 Spring Boot 组织。
  • <artifactId> 指定了 Maven 构件的标识符,这里是 "spring-boot-starter-parent",表示 Spring Boot 父级构建。
  • <version> 指定了 Spring Boot 父级构建的版本号,这里是 "2.3.2.RELEASE",表示使用的 Spring Boot 版本。

通过引入 Spring Boot 父级,你可以继承其配置和依赖管理,使得构建 Spring Boot 项目更加简便。

  • <dependencyManagement> 元素用于集中管理项目的依赖版本,以确保项目中的所有模块使用相同的依赖版本。
  • <dependencies> 元素包含了需要进行版本管理的依赖项。
  • 对于 Spring Cloud,通过 <dependency> 元素引入了 "spring-cloud-dependencies" POM,用于管理 Spring Cloud 相关的依赖。

    • <groupId> 指定了 Maven 组织的标识符,这里是 "org.springframework.cloud"。
    • <artifactId> 指定了 Maven 构件的标识符,这里是 "spring-cloud-dependencies"。
    • <version> 指定了 Spring Cloud 的版本号,这里是 "Hoxton.SR9"。
    • <type> 指定了依赖的类型,这里是 "pom",表示引入的是一个 POM 文件。
    • <scope> 指定了依赖的范围,这里是 "import",表示引入的 POM 文件仅用于版本管理,不会导入实际的依赖。
  • 同样,对于 Spring Cloud Alibaba,通过 <dependency> 元素引入了 "spring-cloud-alibaba-dependencies" POM,用于管理 Spring Cloud Alibaba 相关的依赖。
    • <groupId> 指定了 Maven 组织的标识符,这里是 "com.alibaba.cloud"。
    • <artifactId> 指定了 Maven 构件的标识符,这里是 "spring-cloud-alibaba-dependencies"。
    • <version> 指定了 Spring Cloud Alibaba 的版本号,这里是 "2.2.6.RELEASE"。
    • <type> 指定了依赖的类型,这里同样是 "pom"。
    • <scope> 指定了依赖的范围,这里同样是 "import"。

这是 Maven 项目的 pom.xml 文件中的一些依赖配置,主要包括 Spring Boot、Spring Web、Spring Kafka 和 Spring Boot Starter for Redis 的依赖。

  • <dependency> 元素用于定义项目的依赖。
  • <groupId> 指定了 Maven 组织的标识符,表示依赖的组织。
  • <artifactId> 指定了 Maven 构件的标识符,表示依赖的具体模块或库。
  • 没有指定 <version> 元素的情况下,Maven 会使用 <dependencyManagement> 中的版本管理进行版本控制。

具体来说:

  1. <dependency> 元素引入了 Spring Boot 项目的核心依赖,spring-boot 模块。
  2. <dependency> 元素引入了 Spring Boot Starter for Web,用于支持构建 Web 应用。
  3. <dependency> 元素引入了 Spring Kafka,用于支持与 Apache Kafka 集成。
  4. <dependency> 元素引入了 Spring Boot Starter for Redis,用于支持与 Redis 数据库集成。
  5. <dependency> 元素引入了 Spring Boot Starter for AOP,用于支持面向切面编程(AOP)。
  6. <dependency> 元素引入了 Spring Boot Starter for Logging,用于支持日志功能。通常情况下,它会包括 Spring Boot 默认的日志实现,例如 Logback。
  7. <dependency> 元素引入了 Spring Cloud Starter for OpenFeign,用于支持声明式的 HTTP 客户端(Feign)。
  8. <dependency> 元素引入了 Spring Cloud Starter Netflix Ribbon,用于支持客户端负载均衡(Ribbon)。
  9. <dependency> 元素引入了 Spring Cloud Alibaba Nacos Discovery 的 Starter,用于支持基于 Nacos 的服务注册和发现。在这里,通过 <exclusions> 元素排除了对 com.alibaba.nacos 下的 nacos-client 的传递性依赖。这可能是因为项目中已经有自定义的版本或是其他原因。
  10. <dependency> 元素引入了 Alibaba 的 EasyExcel 库,版本为 3.1.1。EasyExcel 是一个用于操作 Excel 文件的 Java 库,它提供了方便的 API,支持读取、写入 Excel 文件,并且易于使用。
  11. <dependency> 元素引入了 MyBatis Spring Boot Starter,版本为 2.1.0。这是 MyBatis 框架与 Spring Boot 集成的 Starter,简化了 MyBatis 在 Spring Boot 项目中的配置。
  12. <dependency> 元素引入了 PageHelper,版本为 5.1.3。PageHelper 是一个用于 MyBatis 的分页插件,能够方便地对查询结果进行分页处理。
  13. <dependency> 元素引入了通用 Mapper,版本为 3.4.6。通用 Mapper 是一个 MyBatis 插件,它提供了一种简单的方式来处理 MyBatis 的 CRUD 操作,无需手动编写 SQL。
  14. <dependency> 元素引入了 Druid 数据库连接池,版本为 1.1.12。Druid 是一个开源的、高性能的数据库连接池,支持监控和扩展功能。
  15. <dependency> 元素引入了 Jedis,该库是 Redis 的 Java 客户端。通过 Jedis,你可以在 Java 项目中方便地与 Redis 数据库进行交互。
  16. <dependency> 元素引入了 springfox-swagger2,版本为 2.7.0。Swagger 是一个用于设计、构建、文件和使用 RESTful API 的工具。Springfox 是 Swagger 在 Spring Boot 项目中的实现,可以生成 API 文档,方便进行 API 的测试和文档查看。
  17. <dependency> 元素引入了 springfox-swagger-ui,版本为 2.7.0。Swagger UI 是 Swagger 生成的 API 文档的用户界面,它允许用户直观地查看和测试 API。
  18. <dependency> 元素引入了 knife4j-spring-boot-starter,版本为 2.0.4。Knife4j 是 Swagger 的增强工具,提供了更多的界面展示和交互功能,使 API 文档更加友好。
  19. <dependency> 元素引入了 mysql-connector-java,版本为 5.1.48。这是 MySQL 数据库的 Java 连接器,用于在 Java 项目中与 MySQL 数据库进行连接和交互。
  20. <dependency> 元素引入了 org.apache.httpcomponents:httpclient,版本为 4.5.12。这是 Apache HttpClient 库,用于在 Java 中进行 HTTP 请求和处理响应。
  21. <dependency> 元素引入了 org.apache.httpcomponents:httpmime,版本为 4.5.12。这是 Apache HttpClient 的 MIME 扩展,提供了对 MIME 类型的支持,通常用于处理文件上传等场景。
  22. <dependency> 元素引入了 com.google.code.gson:gson,版本为 2.8.5。Gson 是 Google 提供的用于在 Java 对象和 JSON 数据之间进行转换的库。在项目中,它常用于处理 JSON 数据的序列化和反序列化。
  23. <dependency> 元素引入了 Lombok(org.projectlombok:lombok,版本 1.18.8)。Lombok 是一个 Java 库,通过注解简化了 Java 代码,提供了诸如自动生成 Getter/Setter、构造函数等功能,从而减少了冗长的代码。在使用 Lombok 的项目中,你可以使用注解来自动生成一些常用的 Java 代码,提高代码的简洁性和可读性。
  24. <dependency> 元素引入了 Apache Commons Lang3(org.apache.commons:commons-lang3,版本 3.9)。这是 Apache Commons 中的一个项目,提供了许多用于操作字符串、集合、日期等的工具类。Commons Lang3 为 Java 开发人员提供了许多实用的工具方法,用于简化常见任务。
  25. <dependency> 元素引入了 DataStax Cassandra 驱动(com.datastax.cassandra:cassandra-driver-core,版本 3.1.2)。这是与 Apache Cassandra 数据库交互的 Java 驱动程序。它允许 Java 应用程序与 Cassandra 数据库进行通信,执行查询并处理结果。
  26. <dependency> 元素引入了 Codahale Metrics(com.codahale.metrics:metrics-core,版本 3.0.2)。Codahale Metrics 是一个用于度量应用程序性能的 Java 库。它提供了一组度量工具和报告工具,用于监视应用程序的各个方面,例如吞吐量、延迟、错误率等。
  27. <dependency> 元素引入了 Google Guava(com.google.guava:guava,版本 18.0)。Guava 是 Google 提供的一个开源 Java 核心库,包含许多实用的工具类和数据结构。它提供了诸如集合框架、并发工具、缓存、字符串处理等功能,以帮助开发者更轻松地编写高效且可读性强的 Java 代码。
  28. <dependency> 元素引入了 Elasticsearch 客户端 Transport 模块(org.elasticsearch.client:transport,版本 7.11.2)。这是与 Elasticsearch 服务器进行通信的 Java 客户端库。它使 Java 应用程序能够执行与 Elasticsearch 集群的交互,包括索引、搜索等操作。在这个依赖中,<exclusions> 元素用于排除与 commons-logging 相关的传递性依赖。
  29. <dependency> 元素引入了 Apache Commons Lang(org.apache.commons:commons-lang3,版本 3.9)。Commons Lang 提供了许多用于处理字符串、集合、异常等的实用工具类,以简化 Java 编程。
  30. <dependency> 元素引入了 Apache Commons Collections(commons-collections:commons-collections,版本 3.2.1)。Commons Collections 提供了一组扩展了 Java 标准集合框架的实用类,例如列表、映射、队列等。
  31. <dependency> 元素引入了 Nacos 客户端库(com.alibaba.nacos:nacos-client)。Nacos 是一个动态服务发现和配置管理工具,用于构建和维护微服务架构中的服务注册、发现和配置的功能。
  32. <dependency> 元素引入了 Elasticsearch 客户端库(org.elasticsearch:elasticsearch,版本 7.11.2)。这是 Elasticsearch 的官方 Java 客户端库,允许 Java 应用程序与 Elasticsearch 集群进行交互,执行索引、搜索等操作。
  • <groupId>org.elasticsearch.client,指定依赖项的组织标识符,表示 Elasticsearch 客户端库的一部分。
  • <artifactId>transport,指定依赖项的项目标识符,表示 Elasticsearch 客户端库的 transport 模块,该模块用于与 Elasticsearch 集群进行通信。
  • <version>7.11.2,指定了依赖项的版本号,表示所使用的 Elasticsearch 客户端库的版本。
  • <exclusions>:用于排除传递性依赖。在这里,排除了 commons-logging 这个传递性依赖,表示不引入 commons-logging 库。
  1. Elasticsearch 相关依赖:
  • <groupId>org.elasticsearch.plugin,这个依赖用于 Elasticsearch 的插件,特别是 transport-netty4-client 插件,提供与 Elasticsearch 集群的通信。
  • <artifactId>transport-netty4-client,指定了 Elasticsearch 插件的项目标识符。
  • <version>7.11.2,表示所使用的 Elasticsearch 插件的版本。
  • <groupId>org.elasticsearch.client,这个依赖用于 Elasticsearch 的 REST 客户端,提供与 Elasticsearch 集群的通信。
  • <artifactId>elasticsearch-rest-client,指定了 Elasticsearch REST 客户端的项目标识符。
  • <version>7.11.2,表示所使用的 Elasticsearch REST 客户端的版本。

ClickHouse 相关依赖:

  • <groupId>ru.yandex.clickhouse,指定 ClickHouse JDBC 驱动的组织标识符。
  • <artifactId>clickhouse-jdbc,指定 ClickHouse JDBC 驱动的项目标识符。
  • <version>0.2.4,表示所使用的 ClickHouse JDBC 驱动的版本。

Elasticsearch REST 高级客户端依赖:

  • <groupId>org.elasticsearch.client,这个依赖用于 Elasticsearch 的 REST 高级客户端,提供更高级别的抽象,以简化与 Elasticsearch 集群的交互。
  • <artifactId>elasticsearch-rest-high-level-client,指定了 Elasticsearch REST 高级客户端的项目标识符。
  • <version>7.11.2,表示所使用的 Elasticsearch REST 高级客户端的版本。

FastJSON 依赖:

  • <groupId>com.alibaba,这个依赖用于 FastJSON,它是一个用于 Java 的 JSON 处理库,由阿里巴巴开发和维护。
  • <artifactId>fastjson,指定了 FastJSON 库的项目标识符。
  • <version>1.2.75,表示所使用的 FastJSON 库的版本。
  • <scope>compile,表示这个依赖在编译期和运行期都可用。
  • <plugin>:指定 Maven 插件的配置块。
  • <groupId>org.apache.maven.plugins,Maven 插件的 Group ID,表示插件的来源组织。
  • <artifactId>maven-jar-plugin,Maven 插件的 Artifact ID,标识插件的具体实现。
  • <version>2.4,Maven 插件的版本号,指定所使用的插件版本。
  • <configuration>:用于指定插件的配置信息。
  • <archive>:用于配置 JAR 文件的归档信息。
  • <manifest>:用于配置 JAR 文件的 MANIFEST.MF 文件。
  • <addClasspath>:设置为 true,将构建的 JAR 文件的 MANIFEST.MF 文件中包含类路径信息。
  • <classpathPrefix>:设置为 lib/,指定类路径的前缀。
  • <mainClass>:指定了应用程序的主类,即启动 JAR 文件时运行的主类。
  • <plugin>:指定 Maven 插件的配置块。
  • <groupId>org.apache.maven.plugins,Maven 插件的 Group ID,表示插件的来源组织。
  • <artifactId>maven-jar-plugin,Maven 插件的 Artifact ID,标识插件的具体实现。
  • <version>2.4,Maven 插件的版本号,指定所使用的插件版本。
  • <configuration>:用于指定插件的配置信息。
  • <archive>:用于配置 JAR 文件的归档信息。
  • <manifest>:用于配置 JAR 文件的 MANIFEST.MF 文件。
  • <addClasspath>:设置为 true,将构建的 JAR 文件的 MANIFEST.MF 文件中包含类路径信息。
  • <classpathPrefix>:设置为 lib/,指定类路径的前缀。
  • <mainClass>:指定了应用程序的主类,即启动 JAR 文件时运行的主类。
  • <plugin>:指定 Maven 插件的配置块。
  • <groupId>org.apache.maven.plugins,Maven 插件的 Group ID,表示插件的来源组织。
  • <artifactId>maven-dependency-plugin,Maven 插件的 Artifact ID,标识插件的具体实现。
  • <version>3.3.0,Maven 插件的版本号,指定所使用的插件版本。
  • <executions>:用于配置插件执行的一系列任务。
  • <execution>:表示一个具体的插件执行任务。
  • <id>copy,指定任务的唯一标识符。
  • <phase>package,指定了在 Maven 生命周期的哪个阶段执行该任务。在这里,是在打包阶段执行。
  • <goals>:配置在指定阶段执行的目标(goal)。
  • <goal>copy-dependencies,表示执行 Dependency 插件的 copy-dependencies 目标。
  • <configuration>:用于指定插件执行的配置信息。
  • <outputDirectory>:指定依赖项复制的输出目录,这里是 ${project.build.directory}/lib,即 target 目录下的 lib 子目录。
  • <excludeTransitive>:设置为 false,表示不排除传递性依赖。
  • <stripVersion>:设置为 false,表示不剥离依赖项的版本信息。
  • <includeScope>runtime,表示只包括运行时(runtime)范围的依赖项。

一个处理 Microsoft Office 格式文件(如Word和Excel)的强大工具。"POI" 也可能指代 Apache POI

频繁的输入输出 (I/O) 操作可能导致性能问题的原因有几个:

  1. 阻塞:I/O 操作通常是阻塞的,即程序在等待数据读取或写入时会被阻塞。如果你的程序频繁进行 I/O 操作,可能会导致大量的等待时间,从而影响整体性能。
  2. 资源竞争:如果多个线程或进程同时竞争相同的 I/O 资源,可能会导致资源竞争问题,例如争夺文件读写锁。这会引起性能下降和潜在的数据一致性问题。
  3. 上下文切换:频繁的 I/O 操作可能导致系统频繁进行线程或进程的上下文切换,这是由于 I/O 操作的等待时间,切换上下文本身也会带来开销。
  4. 磁盘寻址延迟:对于磁盘 I/O,频繁的读写操作可能受到磁盘寻址延迟的影响。机械硬盘需要进行磁头寻址,而这个过程可能比较慢,尤其是在大量随机读写的情况下。
  5. 缓存未命中:如果数据无法从缓存中获取,每次都需要从磁盘或网络中读取数据,会增加访问时间。

解决频繁 I/O 操作导致性能问题的方法包括:

  • 异步 I/O:使用异步 I/O 操作可以在等待数据就绪的同时执行其他任务,提高效率。
  • 缓存:对于重复读取的数据,可以使用缓存来减少对外部存储的依赖。
  • 优化文件操作:如果是文件 I/O,可以考虑对文件的读写进行优化,减少不必要的文件访问。
  • 并发控制:合理地控制并发访问,避免资源竞争问题。
  • 使用更高效的存储设备:使用固态硬盘等更快速的存储设备可以降低磁盘寻址延迟。

计算机组成:

物理层面:计算机硬件:CPU,内存,存储设备(磁盘,光盘,磁带),输入设备(键盘,鼠标),输出设备(显示器,打印机),通信设备(调制解调器,网卡)

6a8755d4300602729975344fb9de00e6.png
2a398f32116b15fe3645d7d911e09e15.png
1c0c1b1a450c1f325da9c066540478be.png
600edde6594acba2312f2fa63f527726.png
3d000cd4d6f4ec65d43c14f037be058f.png

仓库地址:https://github.com/webVueBlog/JavaGuideInterview