Spring Boot框架的原理及应用详解(六)
本系列文章简介:
在当今的软件开发世界中,快速迭代、高效开发以及易于维护成为了开发者们不断追求的目标。Spring Boot作为Spring框架的一个子项目,自其诞生以来就凭借其“约定大于配置”的理念和自动配置的特性,迅速在Java开发社区中获得了广泛的关注和认可。它简化了Spring应用的初始搭建和开发过程,通过集成大量常用的第三方库配置,开发者可以更快地“上手”并专注于业务逻辑的实现。
本系列文章旨在深入解析Spring Boot框架的原理及应用,带领大家了解这一强大工具背后的设计理念和技术细节。我们将从Spring Boot的核心组件、自动配置机制、内嵌服务器、监控与管理等方面出发,逐步揭示其工作原理,并通过实际案例展示其在实际开发中的应用。
首先,我们将探讨Spring Boot的核心组件,包括自动配置器(AutoConfiguration)、起步依赖(Starters)、Spring Boot CLI等工具,它们共同构成了Spring Boot快速开发的基石。随后,我们将详细分析自动配置机制是如何工作的,以及它是如何帮助开发者减少手动配置的。
接着,我们将介绍Spring Boot如何通过内嵌服务器(如Tomcat、Jetty等)实现应用的快速部署和运行。这一特性使得开发者无需担心服务器的配置和管理,从而大大简化了开发流程。
此外,我们还将讨论Spring Boot在监控和管理方面的功能,包括健康检查、度量指标收集、外部配置等。这些功能为开发者提供了丰富的工具来监控应用的运行状态,并对其进行灵活的配置和管理。
最后,我们将通过几个实际案例来展示Spring Boot在Web开发、微服务架构等领域的应用。这些案例将涵盖从项目搭建到功能实现的整个过程,帮助读者更好地理解Spring Boot在实际开发中的使用方法和技巧。
希望通过本系列文章的介绍,大家能够对Spring Boot有一个全面而深入的了解,并在自己的项目中灵活运用这一强大工具,提高开发效率和质量。同时,我们也期待更多的开发者加入到Spring Boot的大家庭中来,共同推动Java开发技术的进步和发展。
欢迎大家订阅《Java技术栈高级攻略》专栏(PS:近期会涨价),一起学习,一起涨分!
目录
一、引言
二、Spring Boot在生产环境中的应用
2.1 应用程序打包与部署
2.2 Spring Boot的性能调优
2.3 Spring Boot的日志与异常处理
2.4 Spring Boot的集群与扩展性
三、Spring Boot案例分析与实践
四、总结与展望
五、结语
一、引言
Spring Boot是一个基于Spring框架的开源项目,旨在通过约定大于配置的原则来简化Spring应用的初始搭建以及开发过程。它通过使用特定的方式来进行配置,减少了样板化的配置,使开发人员能够更专注于业务逻辑的实现。
本文将跟随《Spring Boot框架的原理及应用详解(五)》的进度,继续介绍Spring Boot框架。希望通过本系列文章的学习,您将能够更好地理解Spring Boot框架的内部工作原理,掌握Spring Boot框架的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Spring Boot框架的潜力,为系统的高效运行提供有力保障。
二、Spring Boot在生产环境中的应用
2.1 应用程序打包与部署
Spring Boot在生产环境中的应用主要涉及到应用程序的打包与部署。以下是一个清晰、详细的步骤说明,并参考了相关文章中提到的信息:
1. 打包方式
Spring Boot支持两种主要的打包方式:Jar包和War包。
1.1 Jar包方式
- 默认方式:Spring Boot默认以Jar包形式进行打包部署。这是因为Spring Boot内置了一个嵌入式的Tomcat服务器,使得应用能够作为一个独立的可执行Jar文件运行。
 - 步骤: 
- 确保
pom.xml(Maven)或build.gradle(Gradle)文件中已经包含了Spring Boot的Maven/Gradle插件。 - 在命令行或IDE中执行打包命令,如
mvn clean package(Maven)或./gradlew clean build(Gradle)。 - 生成的Jar文件将位于
target(Maven)或build/libs(Gradle)目录下,文件名格式为your-project-name-<version>.jar。 
 - 确保
 
1.2 War包方式
- 配置:如果需要将Spring Boot应用打包成War包并部署到外部的Servlet容器中,需要进行一些额外的配置。包括声明打包方式为War包、声明使用外部Tomcat服务器以及提供Spring Boot的Servlet初始化器。
 - 注意事项:War包部署后,访问项目时必须加上“项目名称”,否则会访问不到。
 
2. 部署
2.1 Jar包部署
- 命令:在生成Jar包后,可以通过
java -jar your-project-name-<version>.jar命令直接运行项目。 - 优点:部署简单方便,无需依赖外部Servlet容器。
 
2.2 War包部署
- 步骤:将生成的War包部署到Tomcat等Servlet容器的
webapps目录下。 - 注意事项:确保Tomcat等Servlet容器已经正确安装和配置,且端口没有冲突。
 
3. 打包与部署过程中的细节
- spring-boot-maven-plugin的repackage:这个插件可以将Maven的
mvn package命令生成的软件包再次打包为可执行的软件包,并生成两个jar文件。一个是包含业务代码的普通jar包(后缀为-original),另一个是包含应用依赖和Spring Boot相关class的可执行jar包。 - 选择生产环境配置文件:在打包之前,确保选择了正确的生产环境配置文件,以便应用能够按照生产环境的要求运行。
 
总结
Spring Boot的打包与部署过程相对简单,主要依赖于Maven或Gradle等构建工具以及Spring Boot的内置功能。通过选择合适的打包方式并进行正确的配置,可以方便地将Spring Boot应用部署到生产环境中。
2.2 Spring Boot的性能调优
Spring Boot在生产环境中的应用需要进行性能调优,以确保系统能够高效、稳定地运行。以下是一些关于Spring Boot性能调优的建议,结合参考文章中的相关数字和信息进行分点表示和归纳:
1、数据库优化
- SQL优化:确保SQL语句高效,避免复杂的关联查询和不必要的子查询。通过索引优化,合理创建索引,提高查询效率。
 - 连接池配置:使用高性能的数据库连接池,如HikariCP,合理配置连接池大小。通常建议将连接池大小设置为系统最大并发数的两倍,以避免因连接池太小导致无法获取数据库连接,或连接池太大浪费系统资源。
 - 避免频繁创建连接:通过连接池提高连接的复用性,减少频繁创建和关闭连接的开销。
 
2、缓存应用
- 本地缓存:使用如Caffeine等本地缓存技术,减少数据库访问,提高数据读取速度。
 - 分布式缓存:在分布式环境中使用Redis等作为缓存中间件,进一步提高缓存的效率和可靠性。
 
3、JVM优化
- 内存设置:调整JVM堆内存大小(如-Xms和-Xmx),确保内存分配合理,避免频繁的垃圾回收(GC)。同时,合理设置新生代与老年代比例(-XX:NewRatio)、新生代中Eden与Survivor区比例(-XX:SurvivorRatio)等参数。
 - 元空间大小:设置Metaspace的初始和最大大小(-XX:MetaspaceSize和-XX:MaxMetaspaceSize),以适应应用的元数据需求。
 - 垃圾收集器选择:根据应用特性选择合适的垃圾收集器,如G1、ZGC、Shenandoah等,并相应调整相关参数,以提高GC效率和减少停顿时间。
 
4、并发处理
- 线程池配置:根据应用的负载情况调整线程池大小,避免线程过多导致系统资源耗尽,或线程过少导致处理效率低下。
 - 避免线程竞争:减少同步代码块的使用,使用并发工具类(如CountDownLatch、CyclicBarrier等)来减少线程间的竞争和等待。
 
5、服务拆分与限流降级
- 微服务化:将单体应用拆分成微服务,分散压力,提高系统的可扩展性和容错性。
 - 服务限流与降级:使用如Hystrix、Sentinel等工具进行服务限流和降级处理,防止因某个服务异常导致整个系统崩溃。
 
6、API优化
- 减少不必要的API调用:优化API设计,减少冗余调用,提高API的响应速度和可靠性。
 - 接口响应时间优化:监控关键接口的响应时间,并进行优化,确保系统能够快速响应外部请求。
 
7、异步处理
启用异步处理,通过@Async注解开启异步任务执行,避免同步处理阻塞主线程,提高系统吞吐量。同时,配置合适的异步请求超时时间(如spring.mvc.async.request-timeout),防止因异步任务超时导致系统资源耗尽。
8、资源文件处理
- 静态资源优化:压缩、合并静态资源,减少请求次数和传输时间。
 - 资源按需加载:实现资源的懒加载,减少系统启动时的资源加载时间。
 
综上所述,Spring Boot的性能调优需要从多个方面进行综合考虑和优化,包括数据库、缓存、JVM、并发处理、服务拆分与限流降级、API优化、异步处理以及资源文件处理等方面。通过合理的配置和调优,可以显著提高Spring Boot应用的性能和稳定性。
2.3 Spring Boot的日志与异常处理
Spring Boot在生产环境中的应用,特别是在日志与异常处理方面,具有一套完整且强大的机制。以下是关于Spring Boot日志与异常处理的详细说明:
日志处理
- 日志级别: 
- Spring Boot使用SLF4J(Simple Logging Facade for Java)作为日志门面,并允许使用如Logback、Log4j2等日志框架。
 - 日志级别从高到低包括:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL。通过配置不同的日志级别,可以控制日志的详细程度。
 
 - 日志配置: 
- 可以通过
application.yml或application.properties文件进行日志配置,包括日志级别、日志格式、日志输出位置等。 - 也可以通过
logback-spring.xml进行更复杂的自定义配置。 
 - 可以通过
 - 日志的作用: 
- 记录程序运行时的详细信息,有助于调试和监控。
 - 记录用户行为,用于分析用户习惯和行为模式。
 - 记录系统关键操作,有助于数据恢复和故障定位。
 
 - 日志输出与持久化: 
- 日志可以输出到控制台、文件、数据库等多种目的地。
 - 对于生产环境,推荐将日志持久化到文件或数据库,以便长期保存和查询。
 
 - 日志工具: 
- Spring Boot推荐使用Lombok库简化日志对象的创建和使用。
 - 使用MDC(Mapped Diagnostic Context)可以在日志中输出一个唯一标识(如UUID),以便将同一次业务调用链上的日志串起来。
 
 
异常处理
- 基本异常处理: 
- 使用try-catch语句捕获并处理异常。
 - 可以在catch块中记录异常信息到日志,或者返回友好的错误消息给前端用户。
 
 - 全局异常处理: 
- 使用
@ControllerAdvice注解定义全局的异常处理逻辑。 - 在
@ControllerAdvice注解的类中,可以使用@ExceptionHandler注解指定要处理的异常类型,并定义相应的处理方法。 - 全局异常处理可以统一处理所有的异常,避免在每个Controller中都编写相同的异常处理代码。
 
 - 使用
 - 自定义异常类: 
- 在处理异常时,可以自定义异常类来表示特定类型的异常。
 - 自定义异常类可以让程序更加清晰易懂,同时也方便在全局异常处理器中进行针对性的异常处理。
 
 - 错误页面: 
- Spring Boot提供了一个默认的
/error路径来处理未捕获的异常,并展示一个默认的错误页面。 - 可以自定义错误页面,并在
src/main/resources/templates目录下创建error.html文件。 - 还可以根据状态码创建特定的错误页面,如
404.html、500.html等。 
 - Spring Boot提供了一个默认的
 - HTTP状态码: 
- 在处理异常时,可以根据异常类型返回不同的HTTP状态码,以便前端用户或调用方根据状态码进行相应的处理。
 
 
通过合理地配置和使用Spring Boot的日志与异常处理机制,可以大大提高生产环境中应用程序的稳定性和可维护性。
2.4 Spring Boot的集群与扩展性
在Spring Boot的生产环境应用中,集群和扩展性是确保系统高可用性和灵活性的关键要素。以下是对Spring Boot集群与扩展性的详细讨论,结合参考文章中的相关数字和信息进行分点表示和归纳:
1、集群配置
- 单节点与多节点集群: 
- 初始阶段,可以使用单节点Redis集群进行模拟,但随着业务增长,需要过渡到多节点集群以提供更高的可用性和容错性。
 - 多节点集群允许数据在多个节点之间复制和分布,从而提高性能和扩展性。
 
 - 负载均衡: 
- 在多节点集群中,负载均衡是确保请求均匀分布到各个节点的关键。
 - 可以采用如Nginx或HAProxy等负载均衡器,或者使用Spring Cloud中的Ribbon和Eureka进行服务发现和负载均衡。
 
 - 容灾备份: 
- 集群配置应考虑容灾备份,以防止数据丢失或服务中断。
 - 使用Redis等缓存中间件时,可以配置主从复制或集群模式,确保数据在多个节点之间备份。
 
 
2、扩展性
- 微服务化: 
- 将单体应用拆分成微服务,每个微服务负责一个独立的业务功能。
 - 微服务化可以提高系统的可扩展性,因为每个微服务都可以独立扩展、部署和更新。
 
 - 服务拆分: 
- 根据业务逻辑和功能将应用拆分成多个服务,每个服务独立运行并与其他服务通信。
 - 服务拆分可以降低系统复杂度,提高可维护性和可扩展性。
 
 - 容器化: 
- 使用Docker等容器技术将应用打包成可移植的容器镜像。
 - 容器化可以简化应用的部署和管理,提高系统的可扩展性和灵活性。
 
 - 自动扩展: 
- 使用Kubernetes等容器编排工具实现应用的自动扩展。
 - 根据系统负载和资源使用情况,自动增加或减少容器的数量,以满足业务需求。
 
 - 分布式缓存: 
- 使用Redis等分布式缓存中间件缓存热点数据,减少对数据库的访问压力。
 - 分布式缓存可以提高系统的响应速度和可扩展性。
 
 - 数据库扩展: 
- 对于数据库扩展,可以采用读写分离、分库分表等技术来减轻单一数据库的压力。
 - 读写分离可以提高查询性能,分库分表可以支持更大的数据量并提高扩展性。
 
 - API网关: 
- 使用Spring Cloud Gateway等API网关对请求进行路由、限流、熔断、负载均衡等处理。
 - API网关可以提高系统的可用性和响应速度,同时支持服务的灵活扩展和调整。
 
 
在Spring Boot的生产环境应用中,集群和扩展性是确保系统高可用性和灵活性的重要手段。通过合理的集群配置、微服务化、服务拆分、容器化、自动扩展、分布式缓存、数据库扩展以及API网关等技术,可以显著提高系统的可扩展性和灵活性,满足不断变化的业务需求。
三、Spring Boot案例分析与实践
详见《Spring Boot框架的原理及应用详解(七)》
四、总结与展望
详见《Spring Boot框架的原理及应用详解(七)》
五、结语
文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!
相关文章:
Spring Boot框架的原理及应用详解(六)
本系列文章简介: 在当今的软件开发世界中,快速迭代、高效开发以及易于维护成为了开发者们不断追求的目标。Spring Boot作为Spring框架的一个子项目,自其诞生以来就凭借其“约定大于配置”的理念和自动配置的特性,迅速在Java开发社…...
密码学与信息安全面试题及参考答案(2万字长文)
目录 什么是密码学?它的主要目标是什么? 请解释明文、密文、加密和解密的概念。 密码系统的安全性通常基于哪三种假设? 什么是Kerckhoffs原则?它对现代密码学设计有何意义? 简述密码学中的“混淆”和“扩散”概念。 什么是AES(高级加密标准)?AES有几种常见的密钥…...
C++语法19 循环嵌套结构(for/while循环)
语法阶段已经更新到第18章了,前面的知识你都学会了吗?如果还没有学习前面的知识,请点击👉语法专栏进行学习哦! 目录 循环嵌套 训练:数字矩形 解析 参考代码 训练:星号三角形 解析 参考代码 …...
AtomicInteger原理和CAS与Synchronized(juc编程)
AtomicInteger原理 4.6.1 原理介绍 AtomicInteger的本质:自旋锁 CAS算法 CAS的全成是: Compare And Swap(比较再交换); 是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作,这…...
抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版
抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版 接口及参数 打开网页版抖音,右键视频进入详情页。F12打开控制台筛选detail,然后刷新网页,找到请求。可以发现我们本次的参数目标a_bogus。a_bogus有时长度为168有时为172…...
【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践
文章目录 引言第一章 半监督学习的基本概念1.1 什么是半监督学习1.2 半监督学习的优势 第二章 半监督学习的核心算法2.1 自训练(Self-Training)2.2 协同训练(Co-Training)2.3 图半监督学习(Graph-Based Semi-Supervise…...
leetcode70 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#x…...
ENVI实战—一文搞定非监督分类
实验1:使用isodata法分类 目的:学会使用isodata法开展非监督分类 过程: ①导入影像:打开ENVI,按照“文件→打开为→光学传感器→ESA→Sentinel-2”的顺序,打开实验1下载的哨兵2号数据。 图1 ②区域裁剪…...
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt系统相关 | Qt事件 | 事件的介绍及基本概念 文章编号:Qt…...
具身智能特点及实现路线
多模态——多功能的“小脑” 人类具有眼耳鼻舌身意,说明对于物理世界的充分感知和理解,是意识和智慧的来源。而传统AI更多的是被动观测,主要是“看”(计算机视觉)和“读”(文本NLP),…...
重温react-04
兄弟组件之间通信 兄弟1 import React, { Component } from react import pubsub from ./pubsub export default class learnReact01 extends Component {render() {return (<div>我是兄弟1<button onClick{this.clickMessage}>向兄弟2发信息</button><…...
lock-锁的概念
锁的简介 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免发生资源争抢) 在并发环境下,多个线程会对同一个资源进行争抢,可能会导致数据不一致的问题。为了解决这一问题,需要通过一种抽象的锁来对资源进行…...
Docker 可用镜像源
当使用 docker 发现拉取不到镜像时,可以编辑 /etc/docker/daemon.json 文件,添加如下内容: 这文章不涉及政治,不涉及敏感信息,三番五次的审核不通过,一删再删,只好换图片了。 重新加载服务配置…...
MySQL 搭建主从报错 1236
错误信息: Last_IO_Error: Got fatal error 1236 from source when reading data from binary log: Could not find first log file name in binary log index file 大致内容: MySQL 在尝试从二进制日志(binary log)中读取数据…...
华为OD机试真题2024版-求幸存数之和
题目描述\n给一个正整数列 nums,一个跳数 jump,及幸存数量 left。运算过程为:从索引为 0 的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止。然后返回幸存数之和。\n约束: 1、0 是第一个起跳点。…...
Python - 各种计算器合集【附源码】
计算器合集 一:极简版计算器二:简易版计算器三:不简易的计算器四:还可以计算器 一:极简版计算器 运行效果: import tkinter as tk import tkinter.messagebox win tk.Tk() win.title("计算器")…...
【已解决】better-scroll在PC端如何开启鼠标滚动以及如何始终显示滚动条
总结 需要安装插件 mouse-wheel 和 scrollbar 在PC端如何开启鼠标滚动? 需要安装官方提供的滚动插件:mouse-wheel https://better-scroll.github.io/docs/zh-CN/plugins/mouse-wheel.html 为了开启鼠标滚动功能,你需要首先引入 mouseWheel 插件&…...
AJAX 综合案例-day2
Bootstrap 弹框 功能:不离开当前页面,显示单独内容,供用户操作 步骤: 1. 引入 bootstrap.css 和 bootstrap.js 2. 准备 弹框标签 ,确认结构 3. 通过 自定义属性 ,控制弹框的 显示 和 隐藏 1. 通过属性…...
【Esp32连接微信小程序蓝牙】附Arduino源码《 返回10007 相同特征id冲突问题》
前言 最近接了一个外包,发现了esp32连接小程序会有很多bug,所以接下来会慢慢更新解决方案,还是需要多接触项目才能进步呀兄弟们! 附上uuid的生成链接: // See the following for generating UUIDs: // https://www.uu…...
并发控制技术
事物的隔离性实现主要依赖于多种并发控制技术,这些技术确保在并发执行的事物中,一个事物的操作不会被其他事物干扰。并发控制技术按照其对可能冲突的操作采取的不同策略可以分为乐观并发控制和悲观并发控制两大类。 基于封锁的并发控制 对于并发可能冲突的操作,比如读-写,…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
