万物云原生下的服务进化 | 京东云技术团队

news2024/10/6 17:21:48

导读:

在万物云原生下的环境下,Java的市场份额也因耗资源、启动慢等缺点,导致在云原生环境里被放大而降低,通过这篇文章,读者可以更好地了解如何在云原生环境下通过升级相关版本和使用GraalVM打出原生镜像到方式,优化Java应用的性能和资源利用率,使Java应用更好地适应云原生环境。

1.引言(Introduction)

1.1、目的:

现在我们的项目能正常运行,为什么要耗费大量人力重构?

1.2、背景:

云原生时代下和java的爱恨情仇:

在云原生时代,随着技术的日新月异变化,我们寻找最佳技术解决方案的道路上总是充满坎坷。作为分布式应用的主流技术,Kubernetes(简称k8s)和Java在这个时代交织出一段爱恨情仇般的佳话。那云原生下这两个技术究竟是敌是友,需要我们进行深入分析。首先,我们站在云原生的角度来看,难以忽视的是k8s 的确被时代认可,尤其在微服务架构、容器化部署和资源管理等方面。其强大的自动化、弹性伸缩和容错能力成为了很多软件系统的最佳实践。而Java作为一门拥有28多年历史的编程语言,无论是在市场份额和生态圈都有无可撼动的地位。Java在分布式系统、中间件、业务逻辑处理等方面有着丰富的实践经验,为开发人员提供了良好的编程体验和广阔的生态支持。而在众多应用架构的背后的技术架构都离不开Kubernetes和Java。从这个角度看来,它们似乎是一对黄金搭档,但关系到具体实践过程时,细节往往能决定成败。我们来看看这两个技术在实际操作中产生的爱恨情仇。

1.2.1、 爱与恨:资源限制与管理

在云原生架构中,k8s为应用提供了资源限制与管理的能力,使得应用能够按需分配资源。然而,Java在处理资源方面存在一定的局限性。因为JVM在内存管理方面依赖于Xms和Xmx等参数进行配置,导致应用在Kubernetes中的资源管理相对复杂。在这期间我们发现java也不甘示弱 在JVM层面对资源管理等方面也进行了改进 比如增加了Containters标志,使得Java应用在k8s环境中的资源配置更为简化。

1.2.2、恩怨难分:服务发现与负载均衡

在微服务架构中,服务发现和负载均衡是关键。过去,Java生态中有很多解决方案,例如Eureka、Zookeeper等,这让java在服务发现和负载均衡方面有多种选择,

但在k8s环境中,天然具备服务发现和负载均衡的能力,如果需要转到云原生就需要对微服务进行调整以适配k8s环境。

1.2.3、 重逢:持续集成与持续部署(CI/CD)

k8s在持续集成与持续部署方面具备很强的能力,与GitLab、Jenkins等CI/CD工具的结合可以为Java应用提供极致的开发、构建和部署体验。通过将k8s和Java生态中优秀的CI/CD工具整合在一起,架构师能够实现敏捷的开发、快速的迭代和高效的运维。

1.2.4、共生:爱恨交织

在k8s的世界里,Java应用程序的部署和管理已然变得越来越高效。但随着微服务、Serverless 架构的兴起,Java的致命缺陷开始暴露出来。首先是启动时间,Java应用程序在启动时需要加载众多类文件,带来了相对较长的启动时间。再者,Java应用程序的内存占用往往较高,这在云原生环境中意味着更高的运行成本。然后我们开始寻找替代方案,以求摆脱Java在云原生领域的束缚,进而拥抱更快、更轻量级的应用程序运行环境。

1.2.5、曙光:曾经失去的统统要拿回来

于是,GraalVM应运而生。GraalVM是一个高性能的Runtime,支持多种编程语言(这也是它通用的原因)。它提供了Java与云原生领域的桥梁,可以将Java代码编译成本地可执行文件,这意味着更快的启动速度和更低的内存使用。与之同时,GraalVM还提供了对Java的完整支持,便于将现有的Java应用程序迁移到云原生领域。此外,GraalVM还集成了许多强大的特性,如 (AOT)编译、即时编译(JIT)以及强大的GC回收机制。这些特性使得GraalVM成为了在云原生领域的新宠。

2、技术选型:

2.1、五要素:

2.1.1、充分利用现有代码库:

如果已经拥有一个功能完备且经过充分测试的Java应用程序,那么将其转换为native-image可以最大程度地复用现有代码库,减少重新编写应用程序所需的工作量和风险。此外我们部门项目都是Java,使用native-image能有效降低迁移成本。

2.1.2、开发者熟悉度:

如果队伍中已经具备较为丰富的Java开发经验,那么将Java应用转换为native-image会降低学习成本和培训成本,相较于使用全新的编程语言来重写应用,这会使得开发者更容易上手。

2.1.3、性能优化:

虽然Java应用在某些性能方面可能不如其他编程语言,但通过使用native-image,可以将Java应用转换为与C或C++等编译型语言类似的二进制文件,从而缩小性能差距。native-image为应用带来更快的启动速度和更低的内存占用,而这在k8s这种容器化的环境中尤为重要。

2.1.4、 跨平台能力:

Java具有良好的跨平台兼容性,而借助GraalVM进行native-image编译,我们依然可以保留这一特性。这为应用部署提供较高的灵活性,降低了环境迁移和维护的复杂度。

2.1.5、 开发和生态系统:

Java拥有庞大的开发社区和一个成熟、丰富的生态系统,提供了大量的库和框架来支持各种应用的开发。使用native-image可以更好地利用这些资源,简化应用的开发和维护过程。

2.1.6、最终方案:

采用jdk17+springboot3+native-iamge=原生轻量化服务

对于低频流量的业务系统,采用试点项目的方式保证可行性的落地,根据业务功能进行项目合并,而对于合并后的全新项目,直接升级(jdk 和spring框架) version 完成项目合并后保证java版本的项目跑起来,之后采用native-image的方式打包成原生镜像,让项目在 新特性/稳定性的版本基础上 晋升为真正的轻量化应用。

3、概念:

3.1、为什么要升级jdk?

3.1.1、新的语言特性

JDK 8 到 JDK 17 之间引入了许多新的语言特性和功能,如Lambda 表达式、Stream API、Optional 类、默认方法、接口私有方法等。这些特性可以使代码更简洁、可读性更好,并支持函数式编程风格,提高开发效率和代码质量。

3.1.2、性能优化和增强:

JDK 17 中进行了多项性能优化和增强,包括垃圾回收器的改进、JIT 编译器的增强、并发类库的改进等。这些优化可以提高应用程序的性能和吞吐量,特别是在大规模和高并发的情况下。

3.1.3、模块化系统:

JDK 9 引入了模块化系统(Java Platform Module System,JPMS),它提供了更好的代码组织和隔离,使得复杂的应用程序可以更容易地维护和扩展。模块化系统还可以帮助识别和解决潜在的依赖冲突问题,提高应用程序的稳定性和可靠性。

3.1.4、安全性增强

JDK 17 在安全性方面有多项改进,包括加强的加密算法(SHA-3、X25519、Ed25519 )、更新的安全协议(TLS 1.3)、安全性增强的 API 等。这些改进可以提升应用程序的安全性,防范潜在的安全漏洞和攻击。

3.1.5、工具和性能分析:

JDK 17 提供了许多工具和性能分析的改进,例如 JShell(交互式编程工具)、Java Flight Recorder(JFR,低开销的性能分析工具)、JDK Mission Control(JMC,性能监控和故障诊断工具)等。这些工具可以帮助架构师和开发团队更好地分析和优化应用程序的性能和行为。

3.1.6、持续改进和稳定性:

从 JDK 8 到 JDK 17,Java 平台一直在持续改进和演进。JDK 17 是一个长期支持(LTS)版本,意味着它将获得长期的支持和维护,包括安全更新、错误修复和性能改进。作为架构师,选择升级到 JDK 17 可以获得更稳定和可靠的平台,并确保应用程序能够得到长期的支持。

3.2、为什么要升级springboot组件?

3.2.1、充分利用 JDK 17 的新功能和性能优化:

JDK 17 引入了许多新的功能、改进和性能优化。这些包括新的语言特性、增强的性能和安全性、更好的垃圾回收器、模块化系统等。通过将 Spring Boot 升级到版本3,可以利用 JDK 17 的新功能,提高应用程序的性能、稳定性和安全性。

3.2.2、支持新的 Java 版本:

Spring Boot 1.x 系列最初是为 JDK 6 和 JDK 7 开发的,而 Spring Boot 2.x 系列则对 JDK 8 有更好的支持。我们将 JDK8 升级到 JDK 17,将 Spring Boot 从版本1.x、2.x升级到版本3,可以确保应用程序能够充分利用 JDK 17 的新特性,并获得更好的兼容性和性能。

3.2.3、修复已知的问题和漏洞:

随着时间的推移,Spring Boot 的新版本会修复旧版本中存在的问题、漏洞和错误。通过升级到最新的 Spring Boot 版本,您可以获得这些修复,并提高应用程序的稳定性和安全性。

3.2.4、社区支持和文档更新:

随着时间的推移,Spring Boot 社区会随着新版本的发布而更新和改进文档、示例和社区支持。通过升级到最新版本,您可以获得最新的文档和社区支持,使您能够更好地使用和维护 Spring Boot 应用程序。

3.3、升级jdk/springboot可能导致的差异?

3.3.1、API 变动:

JDK 在不同的版本中引入了新的 API,并对旧 API 进行了修改和弃用。在升级到 JDK 17 之前,需要仔细检查你的代码,查找并解决所有使用了已弃用的 API 的地方。还应该熟悉 JDK 9、JDK 11、JDK 14 和 JDK 17 之间的主要 API 变动,以便在升级过程中进行必要的修改 (servlet api没报错先忽略)。

3.3.2、模块化系统(Module System):

1.JDK 9 引入了模块化系统,将 JDK 中的功能划分为一组模块。如果你的应用程序依赖于 JDK 8 中不存在的模块,或者使用了模块化系统中的新特性(如模块路径),在升级到 JDK 17 时需要进行相应的调整。确保你的应用程序的模块声明和依赖关系与 JDK 17 兼容,并进行必要的迁移工作(jdk8升的忽略)。

3.3.3、移除的功能:

JDK 8 到 JDK 17 期间,JDK 团队可能会移除一些不再支持的功能。在升级之前,查看 JDK 的发布说明和文档,了解哪些功能将被移除或弃用。检查你的代码是否使用了这些功能,以便及时进行修改和适应。

3.3.4、字节码和运行时差异:

JDK 17 中引入了一些新的字节码指令和运行时优化,这可能会导致你的应用程序在升级后出现不同的行为。特别是在使用反射、字节码增强和动态代理等技术的情况下,需要仔细测试和验证升级后的应用程序是否仍然正常运行。

3.3.5、第三方库和工具兼容性:

升级 JDK 可能会对你的应用程序依赖的第三方库和工具产生影响。在进行升级之前,确保你所使用的所有库和工具与 JDK 17 兼容,并及时更新到最新版本。此外,还要留意一些特定的库或工具可能会有与 JDK 版本相关的限制或要求。

3.3.6、性能和稳定性:

升级 JDK 可能会带来性能改进和 bug 修复,但也可能引入新的性能问题或稳定性问题。在升级之后,通过全面的性能和稳定性测试,确保你的应用程序在新的 JDK 版。

3.3.7、移除的功能:

如果代码使用了 JDK 8 中被移除或弃用的功能。查找 JDK 17 的发布说明,找到替代的功能或方法,并进行相应的修改。比如sun.misc.Unsafe 其大部分方法已被标记为 @Deprecated

3.3.8、字节码和运行时差异:

在升级到 JDK 17 后,你的应用程序出现了意料之外的行为。 使用调试工具和日志记录,对代码进行详细调查,查找与字节码和运行时差异相关的问题,并进行相应的修复。例如,JDK 17 引入了 instanceof 指令的新变体 instanceof<type>,用于改进 instanceof 运算符的性能。如果你的代码在 JDK 8 中使用了自定义的字节码操作,需要检查是否需要相应地调整代码。

3.3.9、依赖项更新:

升级到 Spring Boot 3.x 可能需要更新你的应用程序的依赖项,如 Spring Framework、Hibernate 等。解决方法:查看 Spring Boot 的文档和依赖项管理,了解每个版本所需的依赖项版本,并更新你的项目配置文件 Maven 以使用相应的版本。确保所有依赖项与 Spring Boot 3.x 兼容。

3.3.10、配置文件变更:

Spring Boot 3.x 可能引入了新的配置属性或更改了现有属性的名称或行为。解决方法:仔细检查你的应用程序的配置文件,特别是 application.propertiesapplication.yml,根据 Spring Boot 的文档和迁移指南,更新和调整属性的名称和用法。

3.3.11、自动配置变动:

Spring Boot 3.x 可能修改了某些自动配置类或默认行为,可能会影响你的应用程序的行为。 查看 Spring Boot 的升级文档和发布说明,了解哪些自动配置类发生了变化,并在必要时进行相应的修改和调整。

3.3.12、测试更新:

Spring Boot 3.x 可能引入了新的测试框架或更改了现有的测试注解和行为。 查看 Spring Boot 的测试文档,了解测试框架的更新和变化,并相应地修改和调整你的测试代码

3.3.13、Spring Boot Starter 的命名变化:

在 Spring Boot 2.x 版本中,许多 Spring Boot Starter 的命名方式发生了变化。例如,原来的 spring-boot-starter-web 变为 spring-boot-starter-webfluxspring-boot-starter-data-jpa 变为 spring-boot-starter-data-jdbc 等。Spring Boot 2.x 中,默认的缓存自动配置使用 JCache(JSR-107)作为缓存提供者在 Spring Boot 3.x 中,缓存自动配置发生了变化。Spring Boot 3.x 引入了对 Caffeine 缓存提供者的默认支持

3.4、初探graalvm

3.4.1、GraalVM 社区版(Community Edition):

在社区版和企业版本中,如果不指定GC ,默认都使用的是 Serial GC,而在企业版中可以指定使用 G1 垃圾回收器。G1 垃圾回收器是一种现代化的低延迟垃圾回收器,适用于大部分应用场景。而在在企业版中,引入了名为 GraalVM Native Image 的功能,它使用了不同的垃圾回收器。GraalVM Native Image 是一个 AOT(Ahead of Time)编译器,可以将 Java 程序编译成本地机器码,从而提供更快的启动时间和更低的内存占用。对于 Native Image,GraalVM 企业版使用了垃圾回收器 Substrate VM,它是专门为 AOT 编译的应用程序设计的。

3.4.2、性能优化:

GraalVM 企业版通常会提供更多的性能优化功能和选项。这包括对即时编译(Just-in-Time Compilation)的改进、代码优化和程序分析等方面的增强。企业版的目标是提供更高效、更高性能的运行环境。

3.4.3、工具和扩展:

企业版可能提供一些额外的工具、库和扩展,以满足企业级应用程序的需求。这些工具可能包括性能分析器、调试器、内存分析工具和性能监控等。

3.4.4、安全增强:

GraalVM 企业版通常会提供一些安全增强功能,以提供更好的应用程序安全性和保护。这可能包括对代码审计、漏洞扫描和安全加固方面的支持。

3.4.5、跨语言集成:

企业版可能提供更好的跨语言集成支持。GraalVM 企业版具有更广泛的语言支持,包括 Java、JavaScript、Python、Ruby 等,使得在混合语言环境中开发和运行应用程序更加便捷。

3.4.6、商业支持和服务:

企业版提供商业支持和服务,包括错误修复、安全更新和技术支持。这可以确保您在使用 GraalVM 时获得及时的支持和帮助。

4、价值:

4.1、直观价值:

4.1.1、性能提升:

新版本的JDK和Spring Boot通常会引入性能改进和优化,包括内存管理、垃圾回收、线程处理等方面的优化。这可能会减少应用程序的内存占用和CPU负载,从而提高系统的响应速度和吞吐量。再集成native-image 编译生成的原生镜像的启动速度往往比JVM的启动速度快得多,这对于有很多短暂任务的应用场景(例如serverless或者函数计算)非常有利

4.1.2、内存管理和垃圾回收提升:

JDK的每个版本都在内存管理和垃圾回收方面进行了改进。新的版本通常会引入更高效的垃圾回收算法和内存管理策略,使应用程序能够更有效地利用内存资源,并减少垃圾回收的停顿时间。这将有助于降低内存占用和减少GC相关的CPU开销,而采用原生镜像后,通常具有比基于JVM的应用更低的内存占用,这有利于降低运行时的资源消耗。

4.1.3、资源优化比提升:

新版本的Spring Boot可能会引入更好的资源管理和优化机制。这包括对数据库连接、线程池、缓存等资源的更有效的管理和利用,以减少不必要的资源消耗,提高系统的资源利用率,而使用 native-image 编译后的本地机器代码 更加显著减小应用程序的内存占用。因为 native-image 只包含应用程序所需的运行时组件和库,而不需要整个 JVM 的额外开销 镜像大小能减少80%,且编译后的本地机器代码不再依赖于 JVM, 减少应用程序对系统资源的消耗,使得应用程序可以在资源受限的环境中更高效地运行。

4.1.4、并发提升:

新版本的JDK和Spring Boot可能会提供更高效的并发处理机制和多线程编程模型。这将使应用程序能够更好地利用多核CPU,并提高并发性能。通过更好的线程池管理、异步编程模型等,可以减少不必要的线程开销,提高系统的并发能力。

4.1.5、节省成本:

通过优化资源消耗,尤其是内存和CPU,可以降低硬件需求和成本。较低的内存占用和CPU负载意味着可以在相同的硬件配置下运行更多的应用实例,从而节省硬件成本。此外,较低的资源消耗还可以减少运维成本和能源消耗。

4.2、长远价值:

4.2.1、长期支持和维护:

JDK 17是一个长期支持版本(LTS),它将获得长期的官方支持和维护,包括安全更新、错误修复和性能优化。这意味着我们的应用程序可以在未来几年内持续受到支持,保持安全、稳定和可靠。

4.2.2、技术演进和发展:

通过升级到最新的JDK和Spring Boot版本,可以跟上技术的演进和发展。利用新的语言特性、框架改进和工具,提高开发效率和代码质量。同时,升级也为我们团队提供了学习和发展的机会,使他们能够跟上行业的最新趋势和技术标准,提高他们的技术能力和知识广度。

4.2.3、生态系统支持:

随着时间的推移,与JDK和Spring Boot相关的生态系统将持续发展和壮大。升级到最新版本可以使您能够获得更广泛、更成熟的生态系统支持。这包括更多的第三方库、工具、插件和社区资源,可以加速开发过程、解决问题和提供更丰富的功能集。

4.2.4、提高开发效率:

新版本通常会引入更多的开发工具和改进,旨在提高开发效率和开发人员的体验。例如,新的语言特性、API改进、自动化工具和开发工作流程的优化等,都有助于简化开发任务、减少样板代码,并提高团队的整体生产力。

4.2.5、公司团队动力和职业发展:

通过升级到最新版本,公司成员可以参与到技术升级的过程中,提出建议、贡献经验和共享知识。这有助于增强对公司的积极性和归属感,激发他们的职业发展动力,同时也为他们提供学习和成长的机会。

4.2.6、提高公司在互联网的竞争力:

升级到最新的技术版本可以使部门甚至公司保持在技术的前沿,并具备更强的竞争力。公司将能够应对新的技术挑战和项目需求,提供更高质量、更高性能的解决方案,从而在市场上保持竞争优势。

4.2.7、面向未来的准备:

升级到较新的版本可以帮助您为未来做好准备。您的应用程序可以充分利用新的技术和功能,以满足不断变化的业务需求和用户期望。同时,较新的版本通常会更好地适应新的硬件和部署环境,为您的应用程序提供更好的性能、可扩展性和可靠性。

总结:

总之,升级JDK和Spring Boot版本,以及使用native-image打出来的原生镜像可以帮助Java应用更好地适应云原生环境,提高应用的性能和可扩展性。这些措施可以帮助Java在云原生环境中更好地发展

作者:京东科技 徐拥

来源:京东云开发者社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux之特殊权限

目录 Linux之特殊权限 SUID 定义 案例 原因 查找真个系统的SUID/SGID文件 SGID 定义&#xff1a; Sticky Bit 案例 设置文件和目录的特殊权限 方法一 使用 chmod命令 方法二 使用数字形式的权限模式 设置新建文件或目录的默认权限 设置修改文件的扩展性 设置文件…

MySQL连接查询——外连接

内连接查询顺序 首先看student和exam表的内容&#xff1a; 然后执行如下内连接查询&#xff1a; explain select a.*,b.* from student a inner join exam b on a.uidb.uid;查询计划如下 由于a表记录数量少为小表做全表扫描&#xff08;rows为6&#xff09;&#xff0c;然后到…

微信小程序标签知识点总结

View 标签 <scroll-view class"scroll_list" scroll-x"true"> 标签 设置 scroll-x/y是可以设置 滚动模式到底是x方向还是Y方向 &#xff08; 需要调整样式&#xff0c;请参考如下 .scroll_list{ border: 1px solid red; width: 240px; white-sp…

算法学习day21

文章目录 530.二叉搜索树的最小绝对差递归 501.二叉搜索树中的众数递归 236.二叉树的最近公共祖先递归 总结 530.二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值…

管理类联考——逻辑——知识篇——题型说明

管理类联考基础逻辑—逻辑规划 一、联考中逻辑部分的重要性 管理类综合能力测试的数学、逻辑、写作三个部分中&#xff0c;逻辑是毫无疑问最重要的一部分&#xff0c;体现在以下三个方面&#xff1a; 1、时间分配&#xff1a;逻辑部分的阅读量相当大&#xff0c;30道题的阅读…

2023史上最全java面试题题库大全800题含答案

如果你不停地加班。却很少冒险&#xff0c;也很少学习&#xff0c;那你极大可能会陷入到内卷中。 为什么这么说呢&#xff1f;我们先来捋清楚「内卷」的概念&#xff1a; 「内卷化」简而言之就是&#xff1a;日复一日&#xff0c;越混越掉坑里。 所谓内卷化&#xff0c;指一种社…

HTTP 网络通讯过程

1.知识点&#xff1a; 在计算机网络中&#xff0c;通信协议用于规范数据传输的格式和传送方式。下面是常见的网络通信协议&#xff1a; HTTP协议&#xff1a;超文本传输协议&#xff0c;用于在Web浏览器和Web服务器之间传输HTML文件和其他资源。 HTTPS协议&#xff1a;HTTP安…

《水经注地图服务》如何快速发布经纬度DAT缓存

概述 《水经注地图服务》的快速发布功能是一个能够帮助用户实现快速发布地图服务的功能&#xff0c;并且提供常规情况下大多数用户所需的默认配置&#xff0c;让用户在发布地图时更加便捷。 这里为大家演示如何快速发布经纬度DAT缓存以及如何在水经微图中加载。 准备工作 离…

2023-6-14-第五式原型模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

IDEA中类模板注释和方法注释模板

类注释 /* *ClassName ${NAME} *Author --你的别名 *Description //TODO *Date ${DATE} ${TIME} *Version 1.0 **/ 把上面的代码粘贴到settings-editor-file and code templates下的class的“public class”和#parese的中间 2.方法注释 /* *Author --你的别名 *Description …

ZK+麦克风:反AI音频认证

1. 引言 当前&#xff0c;已越来越难以区分AI生成的音频与人类的声音。可能带来欺诈、身份盗用以及其它滥用问题。 在AI生成的音频可以完美模仿人声的当前环境中&#xff0c;需要一个可靠的信任链——从最初的音频捕获到最终的播放。这种信任链可以使用加密技术建立&#xff…

Java实训日志04

文章目录 八、项目开发实现步骤&#xff08;六&#xff09;创建数据访问接口1、创建学校数据访问接口2、创建状态数据访问接口3、创建学生数据访问接口4、创建用户数据访问接口 八、项目开发实现步骤 &#xff08;六&#xff09;创建数据访问接口 DAO: Data Acess Object - 数…

antd-vue - - - - - upload组件的使用

upload组件的使用 参数说明&#xff1a; file:list : 上传列表数据 name: 上传时的key data: 上传时额外的参数 header: 上传列表数据 actions: 上传接口地址 before-upload: 上传之前的回掉 change: 传文件改变时 // 变量定义updateData: { billId: "", fileType: &…

Flutter 自定义Grade组件

/*** images 图片数组* titles title数组* length_w 一行的数量* length_h 行数*/static Widget getMenuGrade(List<String> images, List<String> titles, int length_w, int length_h) {int startIndex 0;List<Widget> rowList [];List<List<Widge…

docker-compose服务名称和容器名称区别

需求及结论 在docker-compose文件一般书写如下&#xff1a; version: 3.8 x-logging: &default-loggingoptions:max-size: "200m"max-file: "5"driver: json-file x-environment: &default-environmentTZ: Asia/ShanghaiLANG: C.UTF-8 services:…

前端什么最难学?

前言 个人认为是JS&#xff0c;无论是在平时的项目或者找工作时候JS都是大头&#xff0c;相比起其他的部分&#xff0c;它相对而言是难一点&#xff0c;同时也是十分重要的一部分&#xff0c;学好原生JS&#xff0c;后续的学习才能基于此循序渐进&#xff0c;下面是我总结的关…

(2023 最新版)大厂面试必问的1000道Java面试题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#x…

报表生成器FastReport .Net用户指南:“SVG”对象

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

数据库|TiDB灾备切换实践-部署

刘昊 | 数据库工程师 最近手头有个系统&#xff0c;有需要搭建灾备库的需求&#xff08;RTO要求4小时内&#xff0c;根据实际情况计算&#xff09;。考虑到生产系统是5版本&#xff0c;TiCDC存在一些兼容性问题&#xff0c;且TiDB Binlog已经有实践案例及经验可供参考&#xf…

SpringCloud Eureka注册服务提供者(七)

这里我们在原来的服务提供者项目 microservice-student-provider-1001 上面直接修改&#xff1a; 首先pom.xml修改&#xff0c;加上eureka客户端依赖&#xff1a; <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>…