当前位置: 首页 > news >正文

满帮集团 Eureka 和 ZooKeeper 的上云实践

作者:胡安祥

满帮集团,作为“互联网+物流”的平台型企业,一端承接托运人运货需求,另一端对接货车司机,提升货运物流效率。2021 年美股上市,成为数字货运平台上市第一股。根据公司年报,2021 年,超过 350 万货车司机在平台上完成超 1.283 亿个订单,实现总交易价值 GTV 2623 亿元,占中国数字货运平台份额超 60%。2022 年 10 月,运满满司机版 MAU 达到 949.21 万人,货车帮司机版 MAU 为 399.91 万人;运满满货主版 MAU 为 218.68 万人,货车帮货主版 MAU 为 63.78 万人。 (以下内容基于满帮实践,由聪言、子葵整理)

业务增长对服务稳定性的挑战

满帮集团在业务生产环境中自建微服务网关,负责南北方向流量调度、安全防护以及微服务治理,同时考虑到多活容灾能力还提供了诸如同机房优先调用、容灾跨机房调用等机制。微服务网关作为微服务架构前端的组件,充当了所有微服务的流量入口。客户端的请求进来会先打到 ALB(负载均衡),然后到内部的网关,再通过网关路由到具体的业务服务模块。

所以网关需要通过一个服务注册中心来动态发现当前生产环境部署的所有微服务实例,当部分服务实例因故障而无法提供服务时,网关还可以跟服务注册中心搭配工作,自动将请求转发到健康的服务实例上,实现故障转移和弹性,使用自研框架配合服务注册中心实现服务间调用,同时使用自建配置中心实现配置管理和变更推送,满帮集团最早采用了开源 Eureka,ZooKeeper 来搭建集群实现服务注册中心和配置中心,这套架构也很好的承接了满帮集团前期的业务快速增长。

但是随着业务体量的逐渐增大,业务模块越来越多,服务注册实例数爆发式增长,自建 Eureka 服务注册中心集群和 ZooKeeper 集群在这套架构的稳定性问题也日益明显。

满帮集团的同学在运维的时候发现自建的 Eureka 集群在服务注册实例到达 2000+ 规模的时候,由于 Eureka 集群节点之间在做实例注册信息同步的时候,部分节点处理不过来,很容易出现节点挂掉无法提供服务最终引发故障的问题;ZooKeeper 集群频繁 GC 导致服务间调用和配置发布出现抖动,影响整体稳定性,并且由于 ZooKeeper 默认没有任何开启鉴权和身份认证能力,配置存储面临安全挑战,这些问题也给业务的稳定持久发展带来了很大的挑战。

业务架构平滑迁移

在上述业务背景下,满帮同学选择了紧急上云,采用阿里云 MSE Nacos,MSE ZooKeeper 产品来替换原先的 Eureka 和 Zookeeper 集群,但是如何才能做到低成本快速的架构升级,以及上云期间业务流量的无损平滑迁移呢?

在这个问题上,MSE Nacos实现了对开源 Eureka 原生协议的完全兼容,内核仍然由 Nacos 驱动,业务适配层把 Eureka InstanceInfo 数据模型和 Nacos 的数据模型(Service 和 Instance)做了一一映射。而这一切对于满帮集团已经对接过自建 Eureka 集群的业务方而言,做到了完全透明。

这就意味着,原先的业务方在代码层面上完全不用改动,只需要把 Eureka Client 连接的服务端实例 Endpoint 配置修改成 MSE Nacos 的 Endpoint即可。使用上同样也很灵活,既可以继续使用原生的 Eureka 协议把 MSE Nacos 实例当成一个 Eureka 集群来用,也可以 Nacos、Eureka 客户端双协议并存,不同协议的服务注册信息之间支持互相转换,从而保证业务微服务调用的连通性。

另外在上云过程中,MSE 官方提供了 MSE-Sync 解决方案,是一款基于开源 Nacos-Sync 优化后的迁移配套数据同步工具,支持双向同步、自动拉取服务和一键同步的功能。满帮同学通过 MSE-Sync 很轻松的完成原先自建 Eureka 集群上已有的线上服务注册存量数据一键迁移到新的 MSE Nacos 集群,同时后续在老的集群上新注册的增量数据也会源源不断的自动获取同步到新集群,这样就保证了在业务实际切流迁移之前,两边的集群服务注册实例信息始终是完全一致的。待数据同步 check 通过之后,将原先的 Eureka Client 的 Endpoint 配置进行替换,重新发布升级后就成功的迁移到新的 MSE Nacos 集群了。

图片

突破原生 Eureka 集群架构性能瓶颈

满帮集团在找到 MSE 团队合作技术架构升级的时候,提出的最重要的一条诉求,就是要解决原先 Eureka 集群间服务注册信息同步压力大的问题,这其是因为 Eureka Server 是传统的对等星型同步 AP 模型导致的,各个 Server 节点角色相等完全对等,对于每次变更(注册/反注册/心跳续约/服务状态变更等)都会生成相应的同步任务来用于所有实例数据的同步,这样一来同步作业量随着集群规模、实例数正相关同步上涨。

满帮集团同学实践下来,当集群服务注册规模达到 2000+ 的时候,发现部分节点 CPU 占用率、负载都很高,时不时还会假死导致业务抖动。这一点在 Eureka 官方文档也有提及,开源 Eureka 的这种广播复制模型,不仅会导致它自身的架构脆弱性,也影响了集群整体的横向扩展性。

Replication algorithm limits scalability: Eureka follows a broadcast replication model i.e. all the servers replicate data and heartbeats to all the peers. This is simple and effective for the data set that eureka contains however replication is implemented by relaying all the HTTP calls that a server receives as is to all the peers. This limits scalability as every node has to withstand the entire write load on eureka.

图片

而 MSE Nacos 在架构选型上就考虑到这个问题并给出了更好的解决方案,那就是自研的 AP 模型 Distro 协议,保留了星型同步模型的基础上,Nacos 对所有服务注册实例数据进行了 Hash 散列、逻辑数据分片,为每一条服务实例数据分配一个集群责任节点,每一个 Server 节点仅负责自己 own 的那一部分数据的同步和续约逻辑,同时集群间数据同步的粒度相对于 Eureka 也更小。这样带来的好处是即使在大规模部署、服务实例数据很多的情况下,集群间同步的任务量也能保证相对可控,并且集群规模越大,这样的模式带来的性能提升也愈发明显。

图片

持续迭代优化追求极致性能

MSE Nacos 和 MSE ZooKeeper 在完成了满帮集团的全量微服务注册中心业务的承接后,在后续的升级版本中持续迭代优化,通过大量的性能压测对比测试,从各个细节上继续优化服务端性能来优化业务体验,接下来会针对升级版本的优化点逐一分析介绍。

服务注册高可用容灾保护

原生 Nacos 提供了高阶功能:推空保护,服务消费者(Consumer)通过注册中心订阅服务提供者(Provider)的实例列表,当注册中心进行变更或遇到突发情况, 或服务提供者与注册中心间的链接因网络、CPU 等其他因素发生抖动时,可能会导致订阅异常,从而使服务消费者获取到空的服务提供者实例列表。

为了解决这个问题,可以在 Nacos 客户端或 MSE Nacos 服务端开启推空保护功能,以提高整个系统的可用性。我们同样把这个稳定性功能引入到了对 Eureka 的协议支持中,当 MSE Nacos 服务端数据出现异常的时候,Eureka 客户端从服务端拉取数据的时候,会默认得到容灾保护支持,保障业务使用的时候不会拿到不符合预期的服务提供者实例列表,而导致业务故障。

另外 MSE Nacos 和 MSE ZooKeeeper 还提供了多重高可用保障机制,如果业务方有更高的高可靠性和数据安全需求,在创建实例的时候可以选择不少于 3 节点的方式进行部署。当其中某个实例故障的时候,节点间秒级完成切换,故障节点自动离群。同时 MSE 每个 Region 都包含多个可用区,同一个 Region 内不同 Zone 之间的网络延迟很小(3ms 以内),多可用区实例可以将服务节点部署在不同可用区,当可用区 A 出现故障的时候,流量会在很短的时间内切换到另外的可用区 B。整个过程业务方无感知,应用代码层面无感知、无需变更。这一个机制只需要配置多节点部署,MSE 会自动帮你部署到多个可用区进行打散容灾。

图片

支持 Eureka 客户端增量拉取数据

满帮同学在迁移到 MSE Nacos 之后,原先服务端实例假死无法提供服务的问题得到了很好的解决,但是发现机房的网络带宽占用过高,偶尔服务高峰期还会出现带宽打满的情况。后来发现是因为每次 Eureka 客户端从 MSE Nacos 拉取服务注册信息的时候,每次都只支持全量拉取,大几千级别的数据量定时拉取,导致网关层面的 FGC 次数也升高了很多。

为了解决这个问题,MSE Nacos 上线了针对 Eureka 服务注册信息的增量拉取机制,配合上客户端使用方式的调整,客户端只需要在首次启动后拉取一次全量数据,后续只需要根据增量数据来保持本地数据和服务端数据的一致性,不再需要周期性的全量拉取,而正常生产环境中变更增量数据的数据量很小,这样一来可以大幅降低出口带宽的压力。满帮同学在升级了这个优化版本之后,发现带宽从升级前的 40MB/s 一下子降到了 200KB/s,带宽打满问题迎刃而解。

图片

充分压测优化服务端性能

MSE 团队后续对 MSE Nacos 集群 For Eureka 的场景进行了更大规模的性能压测,并通过各种性能分析工具排查业务链路上的性能瓶颈点,对原有功能进行了更多的性能优化和底层性能调参。

  • 针对服务端的全量和增量数据注册信息引入了缓存,并基于服务端数据 hash 来判断是否发生变更。在 Eureka 服务端读多写少的场景下,可以大幅减少了 CPU 计算生成返回结果的性能开销。
  • 发现 SpringBoot 原生的 StringHttpMessageConverter 在处理大规模数据返回的时候存在性能瓶颈,提供了 EnhancedStringHttpMessageConverter 来优化字符串数据 IO 传输性能。
  • 服务端数据返回支持 chunked。
  • Tomcat 线程池数根据容器配置自适应调整。

满帮集团在完成了以上版本迭代升级之后,服务端各项参数也取得了很棒的优化结果:

图片

服务端 CPU 利用率从 13% 降到了 2%

图片

注册中心读 RT 从原先 55ms 降至 3ms 以内

图片

图片

服务端 YGC Count 从原先的 10+ 降至 1

*YGC Time 从原先的 125ms 降至 10ms 以内 *

旁路优化,保障集群高压下的稳定性

满帮同学在迁移到 MSE ZooKeeper 一段时间后,集群又出现了 Full GC,导致集群不稳定,经过 MSE 紧急排查,发现是因为 ZooKeeper 中 Metrics 的一个watch相关的统计指标在计算时对当前节点保存的 watch 数据进行了全量拷贝,在满帮的场景下有非常大的 Watch 规模,metrics 计算拷贝 watch 在这样的场景下产生了大量的内存碎片,导致最终集群无法分配出符合条件的内存资源,最终 Full GC。

为了解决这个问题,MSE ZooKeeper 针对非重要 metrics 采取降级的措施,保障这部分 metrics 不会影响集群稳定性,针对 watch 拷贝的 metrics,采取动态获取的策略,避免数据拷贝计算带来的内存碎片问题。在应用此优化之后,集群 Young GC 时间和次数都明显下降。

图片

图片

优化之后集群能够平稳承接 200W QPS,GC 稳定

持续参数优化,寻找延时和吞吐量的最佳平衡点

满帮同学将自建 ZooKeeper 迁移到 MSE ZooKeeper 之后,发现应用发布时,客户端读取 ZooKeeper 中数据的延时过大,应用启动读取配置超时,导致应用启动超时,为了解决这个问题,MSE ZooKeeper 针对性进行压测分析,在满帮的场景下,ZooKeeper 在应用发布时需要承接大量请求,请求产生的对象在现有的配置中导致Young GC 频繁。

针对这种场景,MSE 团队经过多轮压测调整集群配置,寻找请求延时和 TPS 最优的交点,在满足延时需求的前提下,探索集群最优性能,在保证请求延时 20ms 的前提下,集群在日常 10w QPS 的水平下,CPU 从 20% 降低到 5%,集群负载显著降低。

后记

在数字货运行业竞争激烈和技术快速发展的背景下,满帮集团成功地实现了自身技术架构的升级,从自建的 Eureka 注册中心平滑迁移到了更为高效和稳定的 MSE Nacos 平台。这不仅代表了满帮集团在技术创新和业务扩展上的坚定决心,同时也展现了其对未来发展的深远规划。满帮集团将微服务架构的稳定性和高性能作为其数字化转型的核心,全新的注册中心架构带来的显著性能提高和稳定性增强,为满帮提供了强有力的支撑,使得平台能够更加从容地应对日益增长的业务需求,并且有余力以应对未来可能出现的任何挑战。

值得一提的是,满帮集团在整个迁移过程中的敏捷反应和技术团队的专业执行力也加速了架构升级的步伐。业务平台的成功转型不仅增强了用户对满帮服务的信任,也为其他企业提供了宝贵的经验。在未来,满帮将继续与 MSE 紧密合作,致力于进一步提升技术架构的稳定性、可扩展性和性能,持续为业界树立标杆,推动整个物流行业的数字化转型。

在此次迁移过程中,业务能够平稳无损迁移和性能的大幅提升,证明了 MSE 在服务注册中心领域的卓越性能和可靠性。相信随着 MSE 的不断演进,其对易用性和稳定性的持续追求无疑将为更多企业带来巨大的商业价值,并在企业数字化进程中发挥越来越重要的作用。

此外,MSE 还全面支持微服务治理功能,包括流量防护、全链路灰度发布等。通过在入口网关到后端应用配置完备的限流规则,有效地解决了突发流量带来的系统稳定性风险,保障系统持续稳定运行,企业能够更加专注于核心业务的发展。 满帮集团的成功案例为行业树立了新的里程碑,我们怀着期待的目光,期待更多的企业都能在数字化征途上取得更辉煌的成就。

满帮 CTO 王东(东天)寄语: 充分了解和利用云的能力,能够让满帮技术团队从底层的持续投入中解脱出来,聚焦更上层的系统稳定性和工程效率,从架构层面实现更高的 ROI。

相关文章:

满帮集团 Eureka 和 ZooKeeper 的上云实践

作者:胡安祥 满帮集团,作为“互联网物流”的平台型企业,一端承接托运人运货需求,另一端对接货车司机,提升货运物流效率。2021 年美股上市,成为数字货运平台上市第一股。根据公司年报,2021 年&a…...

ubuntu中彻底删除mysql (配置文件删除可选)

ubuntu中彻底删除mysql (配置文件删除可选) 对于此类即搜即用的分享文章,也不过多赘述,直接依次按照下面的操作执行即可: 一、删除 mysql 数据文件 sudo rm /var/lib/mysql/ -R二、删除 mysql 配置文件 sudo rm /etc/mysql/ -R三、查看 m…...

根据模板和git commit自动生成日·周·月·季报

GitHub - qiaotaizi/dailyreport: 日报生成器 GitHub - yurencloud/daily: 程序员专用的日报、周报、月报、季报自动生成器! config.json: { "Author": "gitname", "Exclude": ["update:", "add:", "…...

matlab GUI界面设计

【实验内容】 用MATLAB的GUI程序设计一个具备图像边缘检测功能的用户界面,该设计程序有以下基本功能: (1)图像的读取和保存。 (2)设计图形用户界面,让用户对图像进行彩色图像到灰度图像的转换…...

MyBatis 面试题

一、什么是 Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性 能,灵活度高。 …...

C#根据数据量自动排版标签的样例

这是一个C#根据数据量自动排版标签的样例 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HslCommuni…...

【网络安全】Web安全基础 - 第一节:使用软件及环境介绍

VMware VMware,是全球云基础架构和移动商务解决方案的佼佼者。 VMware可是一个总部位于美国加州帕洛阿尔托的计算机虚拟化软件研发与销售企业呢。简单来说,它就是通过提供虚拟化解决方案,让企业在数据中心改造和公有云整合业务上更加得心应…...

Mac下载docker

先安装homebrew Mac下载Homebrew-CSDN博客 然后输入以下命令安装docker brew install --cask --appdir/Applications docker 期间需要输入密码。输入完等待即可...

k8s_设置dns

配置k8s dns 在 Kubernetes 集群中,CoreDNS 是默认的 DNS 服务器,它负责处理集群内所有的 DNS 请求。 kubectl edit cm coredns -n kube-system (此命令修改coredns 配置) kubectl describe cm coredns -n kube-system(此命令查看coredns 配…...

翻译《The Old New Thing》- What a drag: Dragging a virtual file (HGLOBAL edition)

What a drag: Dragging a virtual file (HGLOBAL edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080318-00/?p23083 Raymond Chen 2008年03月18日 拖拽虚拟文件(HGLOBAL 版本) 现在我们已经对简单的数据…...

SA316系列音频传输模块-传输距离升级音质不打折

SA316是思为无线研发的一款远距离音频传输模块,音频采样率为48K,传输距离可达200M。为了满足更多用户需求,思为无线在SA316基础上进一步增加传输距离推出SA316F30。相比SA316性能,同样其采用48K采样,-96dBm灵敏度&…...

【机器学习】智能选择的艺术:决策树在机器学习中的深度剖析

在机器学习的分类和回归问题中,决策树是一种广泛使用的算法。决策树模型因其直观性、易于理解和实现,以及处理分类和数值特征的能力而备受欢迎。本文将解释决策树算法的概念、原理、应用、优化方法以及未来的发展方向。 🚀时空传送门 &#x…...

电脑缺少运行库,无法启动程序

在我们使用一些软件的时候,由于电脑缺少一些运行库,导致无法启动应用软件,此时需要我们安装缺少的运行库。 比如当电脑提示: Cannot load library Qt5Xlsx.dll 我们就需要下载C得运行库,以满足软件运行需要。 下载链…...

【计算机软考_初级篇】每日十题2

各位老师大家好,软考对于日常的知识储备和企业中的考试,或者说在校大学生来说,那用处是非常大的!!那么下面我们进入正题,软考呢是分两种语言,java和C,对于其他语言目前还没&#xff…...

HR人才测评,如何做营销人员岗位素质测评?

营销人员是企业中的重要角色,他们直接负责企业产品或服务的销售和推广,是企业中最直接影响销售业绩的人才之一。因此,营销人员的基本素质测评非常重要,能够有效评估营销人员的能力和潜力,为企业招聘和培养优秀的营销人…...

LabVIEW调用第三方硬件DLL常见问题及开发流程

在LabVIEW中调用第三方硬件DLL时,除了技术问题,还涉及开发流程、资料获取及与厂家的沟通协调。常见问题包括函数接口不兼容、数据类型转换错误、内存管理问题、线程安全性等。解决这些问题需确保函数声明准确、数据类型匹配、正确的内存管理及线程保护。…...

datax实现MySQL数据库迁移shell自动化脚本

datax实现MySQL数据库迁移 (1)生成python脚本 # codingutf-8 import json import getopt import os import sys import MySQLdb#MySQL相关配置,需根据实际情况作出修改 mysql_host "xxxx" mysql_port "3306" mysql_u…...

PostgreSQL的学习心得和知识总结(一百四十四)|深入理解PostgreSQL数据库之sendTuples的实现原理及功能修改

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...

C++数据结构之:链List

摘要: it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合&am…...

10.Redis之set类型

谈到一个术语,这个术语很可能有多种含义~~ 1.Set 1) 集合. 2)设置 (和 get 相对应) 集合就是把一些有关联的数据放到一起~~ 1.集合中的元素是无序的! 【此处说的无序和 前面list这里的有序 是对应的, 有序: 顺序很重要. 变换一下顺序, 就是不同的 list 了 无序: 顺序不…...

SpringBoot + mongodb 删除集合中的数据

MongoTemplate是Spring Data MongoDB提供的一个工具类,用于与MongoDB进行交互。它提供了许多方法来执行数据库操作,包括删除数据。 本文将介绍如何使用Java MongoTemplate删除集合内的数据,并提供相应的代码示例。 1. 引入MongoTemplate 首…...

【日常记录】【JS】前端预览图片的两种方式,Base64预览和blob预览

文章目录 1、前言1、FileReader3、window.URL.createObjectURL4、参考链接 1、前言 一般来说,都是 后端返回给前端图片的url,前端直接把这个值插入到 img 的src 里面即可还有一种情况是前端需要预览一下图片,比如:上传头像按钮&a…...

每日刷题——杭电2156.分数矩阵和杭电2024.C语言合法标识符

杭电2156.分数矩阵 原题链接:Problem - 2156 题目描述 Problem Description:我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。请求出这个矩阵的总和。 Input&#xf…...

爬虫学习--18.反爬斗争 selenium(3)

操作多窗口与页面切换 有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to.window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到。 from selenium import webdriver from selenium.webdri…...

如何评价GPT-4o?

GPT-4o是OpenAI为聊天机器人ChatGPT发布的一款新语言模型,其名称中的“o”代表Omni,即全能的意思,凸显了其多功能的特性。这款模型在多个方面都有着显著的优势和进步。 首先,GPT-4o具有极强的多模态能力,它能够接受文本…...

算能BM1684+FPGA+AI+Camera推理边缘计算盒

搭载算丰智算芯片BM1684,是面向AI推理的边缘计算盒。高效适配市场上所有AI算法,实现视频结构化、人脸识别、行为分析、状态监测等应用,为智慧城市、智慧交通、智慧能源、智慧金融、智慧电信、智慧工业等领域进行AI赋能。 产品规格 处理器芯片…...

不同厂商SOC芯片在视频记录仪领域的应用

不同SoC公司芯片在不同产品上的应用信息: 大唐半导体 芯片型号: LC1860C (主控) LC1160 (PMU)产品应用: 红米2A (399元)大疆晓Spark技术规格: 28nm工艺,4个ARM Cortex-A7处理器,1.5GHz主频,2核MaliT628 GPU,1300万像…...

【Python入门学习笔记】Python3超详细的入门学习笔记,非常详细(适合小白入门学习)

Python3基础 想要获取pdf或markdown格式的笔记文件点击以下链接获取 Python入门学习笔记点击我获取 1,Python3 基础语法 1-1 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指…...

通用代码生成器应用场景三,遗留项目反向工程

通用代码生成器应用场景三,遗留项目反向工程 如果您有一个遗留项目,要重新开发,或者源代码遗失,或者需要重新开发,但是希望复用原来的数据,并加快开发。 如果您的项目是通用代码生成器生成的,…...

轻量级动态可监控线程池 - DynamicTp

一、背景介绍 使用线程池ThreadPoolExecutor的过程中你是否有以下痛点呢? 代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适凭经验设置参数值,上线后发现需要调整,改代码重新发布服务&#xff0c…...

对于vsc中的vue命令 vue.json

打开vsc 然后在左下角有一个设置 2.点击用户代码片段 3.输入 vue.json回车 将此代码粘贴 &#xff08;我的不一定都适合&#xff09; { "vue2 template": { "prefix": "v2", "body": [ "<template>", " <…...

Spring Boot 官方不再支持 Spring Boot 的 2.x 版本!新idea如何创建java8项目

idea现在只能创建最少jdk17 使用 IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时&#xff0c;没有 Java 8 的选项了&#xff0c;只剩下了 > 17 的版本 是因为 Spring Boot 官方不再支持 Spring Boot 的 2.x 版本了&#xff0c;之后全力维护 3.x&#xff1b;而 …...

分享一个 ASP.NET Web Api 上传和读取 Excel的方案

前言 许多业务场景下需要处理和分析大量的数据&#xff0c;而 Excel 是业务人员常用的数据表格工具&#xff0c;因此&#xff0c;将 Excel 表格中内容上传并读取到网站&#xff0c;是一个很常见的功能&#xff0c;目前有许多成熟的开源或者商业的第三方库&#xff0c;比如 NPO…...

【算法实战】每日一题:将某个序列中内的每个元素都设为相同的值的最短次数(差分数组解法,附概念理解以及实战操作)

题目 将某个序列中内的每个元素都设为相同的值的最短次数 1.差分数组&#xff08;后面的减去前面的值存储的位置可以理解为中间&#xff09; 差分数组用于处理序列中的区间更新和查询问题。它存储序列中相邻元素之间的差值&#xff0c;而不是直接存储每个元素的值 怎么对某…...

EXCEL数据透视图中的日期字段,怎样自动分出年、季度、月的功能?

在excel里&#xff0c;这个果然是有个设置的地方&#xff0c;修改后就好了。 点击文件选项卡&#xff0c;选项&#xff0c;在高级里&#xff0c;将图示选项的勾选给取消&#xff0c;然后再创建数据透视表或透视图&#xff0c;日期就不会自动组合了&#xff1a; 这个选项只对新…...

【设计模式深度剖析】【1】【行为型】【模板方法模式】| 以烹饪过程为例加深理解

&#x1f448;️上一篇:结构型设计模式对比 文章目录 模板方法模式定义英文原话直译如何理解呢&#xff1f; 2个角色类图代码示例 应用优点缺点使用场景 示例解析&#xff1a;以烹饪过程为例类图代码示例 模板方法模式 模板方法模式&#xff08;Template Method Pattern&…...

JAVA:异步任务处理类CompletableFuture让性能提升一倍

一、前言 CompletableFuture 是 Java 8 引入的一个功能强大的类&#xff0c;用于异步编程。它表示一个可能尚未完成的计算的结果&#xff0c;你可以对其添加回调函数来在计算完成时执行某些操作。在 Spring Boot 应用中&#xff0c;CompletableFuture 可以用于提高应用的响应性…...

10Linux 进程管理学习笔记

Linux 进程管理 目录 文章目录 Linux 进程管理一.进程1.显示当前进程状态(ps)进程树(pstree)1.1实时显示进程信息(top)顶部概览信息&#xff1a;CPU 状态&#xff1a;内存状态&#xff1a;进程信息表头&#xff1a;进程列表&#xff1a;1.2(htop) 2.终止进程(kill)2.1通过名称…...

一些关于深度聚类以及部分对比学习的论文阅读笔记

目录 资料SwAV问题方法方法的创新点为什么有效有什么可以借鉴的地方聚类Multi-crop 代码 PCL代码 Feature Alignment and Uniformity for Test Time Adaptation代码 SimSiam 资料 深度聚类算法研究综述(很赞&#xff0c;从聚类方法和深度学习方法两个方面进行了总结&#xff0…...

【ARM-Linux篇】u-boot编译

一、u-boot简介 uboot是一种通用的引导加载程序&#xff0c;它可以用于多种嵌入式系统&#xff0c;支持多种操作系统&#xff0c;如Linux, Android,NetBSD等。uboot的主要作用是将操作系统内核从存储设备&#xff08;如Flash, SD卡等&#xff09;加载到内存中&#xff0c;并执…...

Lombok一文通

1、Lombok简介 作为java的忠实粉丝&#xff0c;但也不得不承认&#xff0c;java是一门比较啰嗦的语言&#xff0c;很多代码的编写远不如其他静态语言方便&#xff0c;更别说跟脚本语言比较了。 因此&#xff0c;lombok应运而生。 Lombok是一种工具库&#xff0c;它提供了一组…...

Seq2Seq模型:详述其发展历程、深远影响与结构深度剖析

Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种深度学习架构&#xff0c;专为处理从一个输入序列到一个输出序列的映射任务设计。这种模型最初应用于机器翻译任务&#xff0c;但因其灵活性和有效性&#xff0c;现已被广泛应用于自然语言处理&#xff08;NLP&a…...

公网如何访问内网?

公网和内网已经成为我们生活中不可或缺的存在。由于内网的安全性考虑&#xff0c;公网无法直接访问内网资源。如何实现公网访问内网呢&#xff1f;本文将介绍一种名为【天联】的私有通道技术&#xff0c;通过安全加密&#xff0c;保障数据传输的安全性。 【天联】私有通道技术 …...

手机定制开发_基于天玑900的5G安卓手机定制方案

手机定制方案基于联发科天玑900强劲旗舰八核2.4GHz处理器。这款处理器采用了6nm先进制程工艺&#xff0c;为用户带来了痛快淋漓的性能体验。不论是进行游戏还是日常娱乐&#xff0c;用户都能轻松驾驭。手机搭载了最新的Android 13操作系统&#xff0c;提高了数据读取的准确性&a…...

免费,C++蓝桥杯等级考试真题--第2级

C蓝桥杯等级考试真题–第2级...

panic 、asset、crash 的含义和区别

在编程中&#xff0c;“panic” 和 “assert” 都是用于处理错误和异常情况的机制&#xff0c;但在不同的编程语言和框架中有一些区别。 panic&#xff1a; 含义&#xff1a;通常表示程序发生了无法恢复的错误或异常情况&#xff0c;需要立即终止程序的执行。 用法&#xff1…...

解决Windows 10通过SSH连接Ubuntu 20.04时的“Permission Denied”错误

在使用SSH连接远程服务器时&#xff0c;我们经常可能遇到各种连接错误&#xff0c;其中“Permission denied, please try again”是较为常见的一种。本文将分享一次实际案例的解决过程&#xff0c;帮助你理解如何排查并解决这类问题。 问题描述 在尝试从Windows 10系统通过SS…...

Windows 下 PostgreSQL 图形化界面安装、配置详解

相信大家对PostgreSQL都不陌生吧&#xff0c;自从MySQL被Oracle所控制后&#xff0c;PostgreSQL就成为了国内去O的首选数据库了&#xff0c;并且PostgreSQL目前不受任何商业公司控制&#xff0c;所以国内很多厂商都是基于PostgreSQL做二次开发来实现数据库自主可控的目标(国内很…...

曾巩,散文的艺术与哲思

曾巩&#xff0c;字子固&#xff0c;世称南丰先生&#xff0c;南丰&#xff08;今江西&#xff09;人&#xff0c;生于北宋真宗天禧三年&#xff08;公元1019年&#xff09;&#xff0c;卒于北宋元丰六年&#xff08;公元1083年&#xff09;&#xff0c;享年64岁。他是中国北宋…...

【SpringBoot】怎么在一个大的SpringBoot项目中创建多个小的SpringBoot项目,从而形成子父依赖

父子项目工程创建 步骤 先创建父项目 具体操作步骤请看本文章&#xff1a;使用maven工程创建spring boot项目 创建子项目 file- project structure module–new module 剩下步骤请看创建父工程时的操作使用maven工程创建spring boot项目 应用 确认即可 之后创建启动类…...