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

1899476dd1ba14d747ea96f15fd0c46e.png
image.png
d19d74ab962a6489f5fc3502996d378b.png
image.png
34d809f9894feb8e247c7ceaff8c6164.png
image.png
d20d29be15e88e971796d3267768aa6e.png
image.png
cee703bb1199e30261419424a607bdae.png
image.png
2e87288a844a9caa75e12d041297a460.png
image.png
007895367507e7162465ed6e3309c704.png
image.png
380d3257e4de814b82acff4e5959b852.png
image.png
ab2b1800f7a136436df5e5691be08df1.png
image.png
8f05e9739e65508c50838d6b1a8fd868.png
image.png
d13bbfb1a3521c17e5bfd54f17baf405.png
image.png
31fae2a6c2dbc5096065ca260b44b970.png
image.png
b686f2fe7b395d5bc74734e1bac2604b.png
image.png
a6dca3588ea86da5e7e5c93fc7fd2db4.png
image.png
419ad612e099191ad07c8fa6d97de029.png
image.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 解析耗时

dns: timing.domainLookupEnd - timing.domainLookupStart

TCP 连接耗时

tcp: timing.connectEnd - timing.connectStart

SSL 安全连接耗时

ssl: timing.connectEnd - timing.secureConnectionStart

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

ttfb: timing.responseStart - timing.requestStart

数据传输耗时

trans: timing.responseEnd - timing.responseStart

DOM 解析耗时

dom: timing.domInteractive - timing.responseEnd

资源加载耗时

res: timing.loadEventStart - timing.domContentLoadedEventEnd

2.关键性能指标

首包时间

firstbyte: timing.responseStart - timing.domainLookupStart

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

fpt: timing.responseEnd - timing.fetchStart

Time to Interact,首次可交互时间

tti: timing.domInteractive - timing.fetchStart

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

ready: timing.domContentLoadedEventEnd - timing.fetchStart

页面完全加载时间

load:timing.loadEventEnd - timing.fetchStart
<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
image.png
2a398f32116b15fe3645d7d911e09e15.png
image.png
1c0c1b1a450c1f325da9c066540478be.png
image.png
600edde6594acba2312f2fa63f527726.png
image.png
3d000cd4d6f4ec65d43c14f037be058f.png
image.png

加群联系作者vx:xiaoda0423

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

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值