基于DPU与SmartNIC的K8s Service解决方案
1. 方案背景
1.1. Kubernetes Service介绍
Kubernetes Service是Kubernetes中的一个核心概念,它定义了一种抽象,用于表示一组提供相同功能的Pods(容器组)的逻辑集合,并提供了一种方式让这些Pods能够被系统内的其他组件发现并访问。简单来说,Service提供了一种让客户端能够稳定地连接到后端Pods的机制,即使这些Pods会动态地创建、销毁或迁移。
Kubernetes Service主要特性和用途
服务发现:Service允许客户端(如Pods中的应用程序)通过稳定的IP地址和端口号访问后端Pods集合,而无需关心实际Pod的IP地址或端口号,因为这些信息可能会因为Pod的重启或迁移而改变。
负载均衡:Kubernetes会自动在Service后面创建的Pods之间分配进入的流量,实现了简单的负载均衡。这意味着当多个Pods提供了相同的服务时,客户端的请求可以被均衡地分发到这些Pods上。
支持DNS:Kubernetes支持基于DNS的服务发现,允许Pods通过服务名(而不是IP地址)来相互通信。这大大简化了服务之间的调用和依赖关系的管理。
定义服务类型:Service可以有多种类型,最常见的是ClusterIP(默认,仅集群内部可访问)、NodePort(通过集群中每个节点的静态端口暴露服务)、LoadBalancer(在Cloud环境中,使用云提供商的负载均衡器暴露服务)和ExternalName(将服务映射到DNS名称,而不是选择Pods)。
在Kubernetes集群中,kube-proxy作为Service的代理组件,负责实现集群内部及外部对Service的访问。kube-proxy通过监听Kubernetes API Server中的Service和Endpoint资源变化,动态地在每个节点上配置网络规则,确保对Service的请求能够被正确地路由到后端的Pod实例上。
在iptables 模式下,kube-proxy会在每个节点上通过iptables规则来实现请求的转发。它会创建一系列的iptables规则,这些规则根据Service的IP和端口,将访问Service的流量重定向到后端的Pod IP和端口上。这种方式简单直接,但随着Service和Pod数量的增加,iptables规则会急剧膨胀,影响性能。
作为iptables的改进,ipvs(IP Virtual Server)模式提供了更高的性能和更好的扩展性。ipvs使用更高效的哈希表来管理网络规则,可以更快地查找和转发流量。这使得在大规模集群中,Service的访问性能得到显著提升。
1.2. 问题与挑战
尽管kube-proxy在大多数基础场景中表现良好,但它也存在一些明显的局限性:
1、场景简单:kube-proxy主要适用于简单的网络拓扑结构,对于复杂的IaaS(Infrastructure as a Service)场景,如需要支持VPC(Virtual Private Cloud)网络隔离、灵活的EIP(Elastic IP)使用等高级网络功能时,显得力不从心。
2、性能瓶颈:由于kube-proxy的报文转发完全依赖于软件实现(无论是iptables还是ipvs),这意味着它无法利用现代硬件(如DPU、SmartNIC)进行网络加速,在高负载跨节点转发的情况下,这种软件实现的性能瓶颈尤为明显。
3、资源消耗:基于软件实现的Kubernetes Service,在高负载跨节点转发的情况下会导致CPU资源消耗过高,从而影响整体系统的稳定性和性能。
与kube-proxy相似,许多开源的容器网络接口(CNI)插件,如使用Open vSwitch(OVS)的kube-ovn、Antrea等,通常依赖于自己的数据面处理机制来转发Service网络流量,在没有硬件加速的情况下,也面临类似的性能瓶颈和资源消耗问题。
2. 方案介绍
2.1. 整体架构
本方案基于DPU&SmartNIC实现了Kubernetes Service的解决方案,简称“驭云Service”。
驭云Service在驭云SDN的架构中实现,其中驭云SDN通过ovn/ovs机制将DPU&SmartNIC加入到同一个ovn集群,对网络进行统一的虚拟化,整体物理架构图如所示:

在Pod/裸机/VM接入DPU卡或SmartNIC卡后,用户的请求由Service处理后送往对应的Pod/裸机/VM。
软件整体架构如下:

如图所示,驭云Service基于驭云SDN,上图各个组件中均会参与处理Service的逻辑,下面分别进行介绍:
ycloud-controller,是SDN系统的控制平面,处理Service的主要逻辑,将用户创建的Service数据通过ovn转换成实际的网络拓扑。
yusurService-controller,处理用户创建的YusurService资源,翻译成内置Service资源给ycloud-controller使用。
ycloud-cni,该组件作为一个DaemonSet运行在每个节点上,是SDN的CNI接口,同时也会负责各个节点上Service的一些处理逻辑。
注:驭云SDN参见《基于DPU与SmartNIC的云原生SDN解决方案》
2.2. 方案描述
在驭云SDN的概念中,所有后端资源,无论是Pod、VM还是裸金属服务器,都属于某一个VPC(虚拟私有云)。VPC实现了逻辑隔离的网络空间,这意味着不同VPC内的网络流量不会相互干扰,这提供了重要的安全边界,同时也便于多租户环境中的资源管理和隔离。然而,这种隔离也带来了一个挑战:如何允许不同VPC之间或者外部网络访问这些VPC内的资源。
Service需要解决的就是从不同地方经过Service访问到这些VPC内的资源,并且根据策略进行请求的负载均衡。在驭云Service中,具体包含以下场景:
集群内部互通(ClusterIP类型Service)
场景①:客户端在集群VPC内,访问同VPC下的后端服务:
在这种情况下,客户端可以直接通过Service的ClusterIP访问后端服务。ClusterIP是一种虚拟IP地址,由Kubernetes为Service分配,只在集群内部可见。流量在VPC内直接转发,无需经过额外的网关或负载均衡器。
场景②:客户端在集群节点上,访问默认VPC下的一组后端服务:
当客户端运行在集群节点上时,它同样可以通过ClusterIP访问服务。Kubernetes的网络策略确保流量在节点和后端服务之间正确路由。这种访问方式同样限于集群内部,不需要EIP。
集群外部访问集群内(LoadBalancer类型Service)
场景③:客户端在集群外部,通过EIP访问一个VPC下的一组后端服务:
在此场景下,客户端通过云外访问集群内的服务。LoadBalancer类型Service会分配一个EIP,此时外部流量通过EIP被路由到集群内部的Service。
场景④:客户端在集群外部,通过EIP访问多个VPC下的一组后端服务:
当客户端需要访问跨多个VPC的服务时,情况变得复杂。在这种情况下,当外部流量通过EIP进入集群内Service时,Servcie会同时充当网关,将流量正确地路由到目标VPC。
本方案主要从控制面和数据面2各方面进行介绍。
2.2.1. 控制面
在控制层,我们对原生Service进行了封装,在Kubernetes基础上扩展了对Service的管理能力,整体控制面结构如下图所示:

Service和Endpoint是Kubernetes内置资源。资源Service定义了构造一个Service的基本信息。
由于内置资源无法满足我们需要功能,包括网络访问场景,和多种后端,于是驭云Service增加了YusurService与NetworkProbe两种自定义资源定义(CRDs):
YusurService: 一种扩展的Service概念,允许定义更广泛的后端资源,包括Pod、VM、BM(裸金属服务器)、VNicIP(虚拟网络接口IP)。通过使用选择器(selectors),可以灵活地匹配不同类型的后端资源,而不仅仅是Pod。支持定义多种网络场景,灵活的指定eip和clusterIP等。
NetworkProbe: 用于健康检查的新CRD,为每个后端资源生成相应的探针,实时监控其健康状态。这可以确保负载均衡器只将请求转发给健康的实例。
用户只需要和YusurService进行交互,yusurService-controller会根据YusurService的信息创建Networkprobe,Endpoint和Service这3种资源。
Service包含网络配置的大多基本信息,Endpoint资源包含本次配置的所有后端;Networkprobe返回后端健康检查结果,yusurService-controller会根据Networkprobe的返回结果调整Endpoint所包含的健康后端。
yscloud-controller则会根据Endpoint和Service的信息通过ovn绘制出整个网络拓扑,打通网络通路。
通过这样的架构,系统不仅提供了高级别的抽象来简化Service管理和后端资源的健康监控,还实现了跨VPC的负载均衡,增强了Kubernetes集群的网络功能。
2.2.2. 数据面
Service的数据面依赖OVN和OpenVswitch,根据不同的访问场景,在不同的地方配置Load_Balancer,Load_Balancer是OVN的逻辑概念,可以应用在OVN的逻辑交换机或者逻辑路由器上面,它将在对应的地方上配置DNAT的规则,将访问VIP的报文转到合适的后端上去。
下文分别针对控制面中所描述的4种Service使用场景进行说明。
2.2.2.1 同vpc下访问资源

当创建了Service之后,LoadBalancer的网络策略会确保应用在vpc1内的所有Subnet上。当subnet3上的client访问10.0.0.100时,其请求将首先被subnet3上的LoadBalancer接收。LoadBalancer会基于其算法(例如轮询、最少连接数等)选择一个后端Pod,并将数据包的目标地址转换为所选Pod的实际IP地址。数据包随后会通过vpc1被转发到选定的Pod所在的Subnet,例如subnet1,最后转发至Pod1。
2.2.2.2. 从集群节点上访问vpc内资源

当集群节点上的client访问10.0.0.100时,报文经过node-interface进入subnet0,经过LoadBalancer将数据包的目标地址转换为所选Pod的实际IP地址后,通过ovn-cluster到对应subnet,完成一次转发。
2.2.2.3.从集群外部访问同一个vpc内资源

当创建了Service之后,LoadBalancer的网络策略会应用在vpc1上,当client访问200.0.0.100时,其请求将首先被这个EIP子网所属的eipGateway接收。eipGateway会将报文路由到Servic所属的VPC,vpc1内,此时LoadBalancer规则会基于其算法(例如轮询、最少连接数等)选择一个后端Pod,并将数据包的目标地址转换为所选Pod的实际IP地址。数据包随后会通过vpc1被转发到选定的Pod,完成一次转发。
2.2.2.4.从集群外部访问多个vpc内资源

当创建了Service之后,控制器会创建一个service-gateway的逻辑路由器,LoadBalancer的网络策略会应用在该路由器上,当client访问200.0.0.100时,其请求将首先被这个eip子网所属的eipGateway接收。eipGateway会将报文路由到service-gateway上,此时LoadBalancer规则会基于其算法(例如轮询、最少连接数等)选择一个后端Pod,并将数据包的目标地址转换为所选Pod的实际IP地址,源地址转换为所选service-gateway的系统IP地址。数据包随后会被转发到选定的Pod的vpc上,然后vpc将数据包送到Pod,完成一次转发。
3. 方案测试结果
3.1. 创建Service
创建一个带有特定选择器和端口映射的Service YAML文件ysvc1.yaml,如下:
| apiVersion: iaas.yusur.io/v1 kind: YusurService metadata: name: ysvc1 spec: type: ClusterIP scope: vpc vpc: vpc1 ports: - port: 5001 name: iperf protocol: TCP targetPort: 5001 selector: svc: svc1-ep |
使用kubectl apply -f ysvc1.yaml命令创建Service。
使用kubectl get ysvc ysvc1检查Service,如下:

访问Service clusterIP,访问成功。
![]()
图中的netns为service后端同vpc下的一个pod,10.233.46.185为service的clusterIP,5001是service暴露的端口。
3.2. 性能对比
3.2.1 Pod的带宽
带宽单位Gbits/s。
| 测试用例 | 驭云卸载方案 | 未卸载方案 | |
| 1 | 物理节点之间基准测试 | 163 | 166 |
| 2 | 物理节点访问后端在远端的Service | 152 | 130 |
| 3 | Pod访问后端在远端的Service | 151 | 138 |
从上面测试数据得出以下结论:
1. 卸载模式下,驭云访问远端Service能够达到接近物理机的带宽。
2. 卸载模式比非卸载在带宽上性能提升了20%左右。
3.2.2 Pod的pps
pps单位为Mpps。
| 测试用例 | 驭云卸载方案 | 未卸载方案 | |
| 1 | 物理节点之间基准测试 | 45 | 45 |
| 2 | 物理节点访问后端在远端的Service | 25.5 | 12.1 |
| 3 | Pod访问后端在远端的Service | 24.5 | 12.2 |
从下面数据得出以下结论:
1. 卸载模式下,驭云访问远端Service能够达到接近物理机的60%pps。
2. 卸载模式比非卸载在pps上性能提升了2倍以上。
3.2.3 Pod的延时
延时单位为us。
| 测试用例 | 驭云卸载方案 | 未卸载方案 | |
| 1 | 物理节点之间基准测试 | 32 | 32 |
| 2 | 物理节点访问后端在远端的Service | 33 | 48 |
| 3 | Pod访问后端在远端的Service | 33 | 44 |
从上面测试数据得出以下结论:
1. 卸载模式下,驭云访问远端Service能够达到接近物理机的延迟。
2. 卸载模式比非卸载在延迟上降低了20%以上。
3.2.4 RPS
单位为Requests/s。
| 测试用例 | 驭云卸载方案 | 未卸载方案 | |
| 1 | 物理节点之间基准测试 | 15999 | |
| 2 | Pod跨节点访问Service | 15139 | 11040 |
从上面测试数据得出以下结论:
1. 卸载模式下,驭云访问远端Service能够达到接近物理机的rps。
2. 卸载模式比非卸载在rps上提升了40%左右。
3.2.5 每条request的CPU指令数以及CPI
每条request的CPU指令数,单位为instructions/request。
| 测试用例 | 驭云卸载方案 | 未卸载方案 | |
| Pod跨节点访问Service | 122,613 | 171,405 |
CPI,单位为cycles/instruction。
| 测试用例 | 驭云卸载方案 | 未卸载方案 | |
| Pod跨节点访问Service | 1.94 | 1.69 |
从上面测试数据得出以下结论:
1. 一个请求消耗的CPU指令数量,卸载模式比非卸载模式降低30%左右。
2. 在CPI方面,卸载模式比非卸载模式增大了15%左右。
3. 综合消耗的CPU指令数量来看,对CPU的消耗减少了25%左右。
4. 优势总结
基于DPU和SmartNIC的K8s Service解决方案展现出显著的优势,具体总结如下:
① 支持复杂网络拓扑与高级功能
在复杂的网络拓扑下实现K8s Service,支持VPC网络隔离和EIP等高级网络功能,大大增强了Kubernetes集群在IaaS环境中的网络灵活性和安全性,满足复杂场景下的网络需求。
② 显著提升K8s Service性能
根据测试数据,本方案在带宽上性能提升了20%左右,pps上性能提升了2倍以上,延迟降低了20%以上。DPU和SmartNIC内置了强大的网络处理引擎,能够直接在硬件上完成报文的解析、转发和路由决策等任务,这种硬件加速机制使得在高负载跨节点转发时,仍能保持低延迟和高吞吐量,显著提升了Kubernetes Service的性能。
③ 降低资源消耗与优化系统性能
根据测试数据,本方案对CPU的消耗减少了25%左右。由于DPU和SmartNIC承担了大部分的网络处理工作,CPU从繁重的网络转发任务中解放出来,可以专注于执行其他更关键的计算任务,这不仅降低了CPU的资源消耗,还提升了整体系统的稳定性和性能。
综上所述,基于DPU和SmartNIC的K8s Service解决方案在应对复杂网络拓扑、性能瓶颈和资源消耗等方面具有明显的优势,能够显著提升Kubernetes集群在复杂IaaS环境中的网络性能和整体稳定性。
本方案来自于中科驭数软件研发团队,团队核心由一群在云计算、数据中心架构、高性能计算领域深耕多年的业界资深架构师和技术专家组成,不仅拥有丰富的实战经验,还对行业趋势具备敏锐的洞察力,该团队致力于探索、设计、开发、推广可落地的高性能云计算解决方案,帮助最终客户加速数字化转型,提升业务效能,同时降低运营成本。
相关文章:
基于DPU与SmartNIC的K8s Service解决方案
1. 方案背景 1.1. Kubernetes Service介绍 Kubernetes Service是Kubernetes中的一个核心概念,它定义了一种抽象,用于表示一组提供相同功能的Pods(容器组)的逻辑集合,并提供了一种方式让这些Pods能够被系统内的其他组…...
SLM561A系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力
SLM561A系列选型参考: SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …...
Requests库对session的支持
场景:如何获取登录时响应消息中的sessionid,以及如何在后续请求中把sessionid添到cookie中 Requests库提供了一个Session类,通过requests库中的session对象,requests库会自动帮我们保存服务端返回的cookie数据(set-cookie里的内容…...
利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别
1. Python部分:导出ONNX模型 首先,我们需要在Python中定义并导出一个已经训练好的验证码识别模型。以下是完整的Python代码: import string import torch import torch.nn as nn import torch.nn.functional as FCHAR_SET string.digits# …...
如何通过Spring Cloud Consul增强微服务安全性和可靠性
为了增强微服务的安全性和可靠性,Spring Cloud Consul 是一个非常强大的工具。它不仅提供了服务发现和配置管理功能,还能够有效地管理微服务的安全和健康状态。本文将深入探讨如何通过 Spring Cloud Consul 来增强微服务的安全性和可靠性,主要…...
无代码搭建小程序zion
无代码搭建小程序zion 一、无代码搭建小程序zion的降低技术门槛,提升开发效率 1. 无需编程经验:Zion无代码平台通过提供直观的可视化界面和拖拽式操作,让开发者无需具备复杂的编程技能也能进行小程序的开发。这种方式大大降低了技术门槛&a…...
【南方科技大学】CS315 Computer Security 【Lab1 Packet Sniffing and Wireshark】
目录 IntroductionBackgroundTCP/IP Network StackApplication LayerTransport LayerInternet LayerLink LayerPacket Sniffer Getting WiresharkStarting WiresharkCapturing PacketsTest Run Questions for the Lab Introduction 实验的第一部分介绍数据包嗅探器 Wireshark。…...
【人工智能/机器学习/机器人】数学基础-学习笔记
函数 奇偶性: 偶函数: f ( − x ) f ( x ) f(-x)f(x) f(−x)f(x) y轴对称 f ( x ) x 2 f(x)x^2 f(x)x2 f ( − x ) ( − x ) 2 x 2 f ( x ) f(-x)(-x)^2x^2f(x) f(−x)(−x)2x2f(x) 奇函数: f ( − x ) − f ( x ) f(-…...
视频安防监控LntonAIServer安防管理平台抖动检测和过亮过暗检测
随着视频监控技术的发展,视频质量成为确保监控系统有效性的重要因素。LntonAIServer通过引入抖动检测与过亮过暗检测功能,进一步提升了视频监控系统的可靠性和用户体验。这些功能可以帮助及时发现并解决视频流中的质量问题,确保视频监控系统始…...
网络模型及协议介绍
一.OSI七层模型 OSI Open System Interconnect 开放系统互连模型 以前不同厂家所生产的网络设备的标准是不同的,所以为了统一生产规范就制定了OSI这个生产模型。 作用:降低网络进行数据通信复杂度 这个模型的作用第一降低数据通信的复杂度ÿ…...
手撕HashMap源码
终于通过不屑努力,把源码中的重要部分全都看完了,每一行代码都看明白了,还写了注释 import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; import java.util.function.Consumer; import java.ut…...
OceanBase block_file与log过大 的问题
一、说明 block_file 是存放sstable的数据文件,由datafile_disk_percentage 参数与datafile_size参数决定,两个参数同时配置,以datafile_size为主。 datafile_disk_percentage 默认值是90 datafile_size 默认值是0M到正无穷 因为block_file 的…...
【Focal Loss 本质】
Focal Loss 示例 Focal Loss公式: 在后面的例子中,我们假定 y 1 的样本中,有两个预测值分别为(0.8, 0.4)。显然,0.8 很容易分类,0.4 很难分类。 可以看出,Focal Loss 降低了容易分类(prt 0…...
端口安全老化细节
我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间,但是后面还可以加上类型: [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type absolute Absolute time 绝对老化 inactivity Inactivity time相对老化 …...
【C++】—— string 模拟实现
【C】—— string模拟实现 0 前言1 string的底层结构2 默认成员函数的实现2.1 构造函数2.1.1 无参构造2.1.2 带参构造2.1.2 合并 2.2 析构函数2.3 拷贝构造函数2.3.1 传统写法2.3.2 现代写法 2.3 赋值重载2.3.1 传统写法2.3.2 现代写法2.3.3 传统写法与现代写法的优劣 3 size、…...
详解TensorRT的C++高性能部署以及C++部署Yolo实践
详解TensorRT的C高性能部署 一. ONNX1. ONNX的定位2. ONNX模型格式3. ONNX代码使用实例 二、TensorRT1 引言 三、C部署Yolo模型实例 一. ONNX 1. ONNX的定位 ONNX是一种中间文件格式,用于解决部署的硬件与不同的训练框架特定的模型格式的兼容性问题。 ONNX本身其…...
手机如何切换网络IP地址:方法详解与操作指南
在当今的数字化时代,网络IP地址作为设备在网络中的唯一标识,扮演着至关重要的角色。对于手机用户而言,了解如何切换网络IP地址不仅有助于提升网络体验,还能在一定程度上保护个人隐私。本文将详细介绍手机切换网络IP地…...
南通网站建设手机版网页
随着移动互联网的迅猛发展,越来越多的人通过手机浏览网页,进行在线购物、信息查询和社交互动。因此,建立一个适合移动端访问的网站已成为企业和个人不可忽视的重要任务。在南通,网站建设手机版网页的需求逐渐增加,如何…...
macos系统内置php文件列表 系统自带php卸载方法
在macos系统中, 自带已经安装了php, 根据不同的macos版本php的版本号可能不同, 我们可以通过 which php 命令来查看mac自带的默认php安装路径, 不过注意这个只是php的执行文件路径. 系统自带php文件列表 一下就是macos默认安装的php文件列表. macos 10.15内置PHP文件列表配置…...
微信小程序认证和备案
小程序备案的流程一般包括以下步骤: 准备备案所需材料:通常需要提供营业执照、法人的身份证、两个手机号和一个邮箱等资料。 1 登录微信公众平台:作为第一次开发微信小程序的服务商,需要通过微信公众平台申请…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
