k8s---pod基础下
k8s的pod与docker重启策略的区别
k8s的重启策略
- always deployment的yaml文件只能是always,pod的yaml三种模式都可以。不论正常退出还是非正常退出都重启。
- OnFailure:正常退出不重启,非正常退出会重启
- Never:正常退出和非正常退出都不重启。容器退出了,pod才会重启
pod可以有多个容器,只要有一个容器退出,整个pod都会重启,所有pod内的容器都会重启。
docker的重启策略:
- docker的默认策略是nerver。
- on-failure:非正常退出时才会重启容器
- always:只要容器退出都重启。
- unless-stopped:只要容器退出就会重启,docker的守护进程启动时已经停止的容器,不再重启。
注意:yaml方式创建Deployment和StatefulSet类型时,restartPolicy只能是Always,kubectl run -个pod可以选择Always,OnFailure,Never三种策略
如何快捷的生成yaml文件
生成模板
[root@master01 ~]# kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3 --dry-run=client
deployment.apps/nginx1 created (dry run)将模板输出到指定的位置
[root@master01 opt]# kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3 --dry-run=client -o yaml > /opt/test1.yaml
模板:
pod的生命周期状态
1.pending 挂起。
pod已被创建,但是尚未被分配到运行的node节点。
原因:节点的资源不够,需要等待其他pod的调度。
2.running
运行中pod已经被分配到了node节点,pod内部的所有容器都已经启动,运行状态正常,稳定。
3.complete / successded
表示容器内部的进程运行完毕,正常退出,没有发生错误。
4.failed:
pod中的容器非正常退出。发生了错误,需要通过查看详情和日志来定位问题。
5.UNknow:
因为某些原因,k8s集群无法获取pod的状态。APIserver出了问题。
6.terminating :
终止中,pod正在被删除,里面的容器正在终止。种植过程中,资源回收,垃圾清理,以及终止过程中需要执行的命令。
7.crashloopbackoff:
pod当中的容器退出,kubelect正在重启
8.imagepullbackoff:正在重试拉取镜像
原因:指定仓库错误
9.errimagepull:
拉取镜像出错
原因:1.网速太慢,超时了 2.镜像名写错 3.镜像仓库挂了
10.Evicte:pod被驱赶了
原因:node节点的资源不够部署pod。资源不足,kubelect自动选择一个pod驱逐
CrashLoopBackOff: 容器退出,kubelet正在将它重启
InvalidImageName: 无法解析镜像名称
ImageInspectError: 无法校验镜像
ErrImageNeverPull: 策略禁止拉取镜像
ImagePullBackOff: 正在重试拉取
RegistryUnavailable: 连接不到镜像中心
ErrImagePull: 通用的拉取镜像出错
CreateContainerConfigError: 不能创建kubelet使用的容器配置
CreateContainerError: 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError: 启动容器失败
PostStartHookError: 执行hook报错
ContainersNotInitialized: 容器没有初始化完毕
ContainersNotReady: 容器没有准备完毕
ContainerCreating: 容器创建中
PodInitializing:pod 初始化中
DockerDaemonNotReady: docker还没有完全启动
NetworkPluginNotReady: 网络插件还没有完全启动
Evicte: pod被驱赶
pod容器使用节点资源限制
在我前面Docker的Cgroup文章中,就提到过,为什么我们对容器进行资源限制。同理:首先K8s中pod使用宿主机的资源默认情况下是无节制的,但是当一个集群搭建成功后并投入生产环境中。如果其中的某一个pod因为不明原因出现了bug,疯狂占用宿主机资源,抢占其他pod的资源。势必会导致整个集群的瘫痪,所以pod资源的限制是非常有必要的
在资源控制器中我们也可以准确的找到相应的资源控制字段:
kubectl explain deployment.spec.template.spec.containers.resources
kubectl explain statefulset.spec.template.spec.containers.resources
pod容器资源的限制
1.request:pod内容器需要的资源2.limit:最高能占用系统多少资源limit需要多少,最多也只能占用这么多
pod容器的对cpu的限制:
pod容器对cpu有两种方法限制
pod对于cpu限制的参数有两种表达形式:
第一种是指定个数的表达形式,例如:1 ,2, 0.5 ,0.2 ,0.3 指定cpu的个数(该个数可以为整数,也可以为小数点后一位的小数)
第二种是以毫核为单位的表达形式:100m 500m 1000m 2000m (这里1000m等价于一个cpu,该方式来自于cpu时间分片原理得来)
memory的表达形式
pod对内存参数的要求十分严谨。对硬件有过研究的朋友,应该会了解到,我们常常提到的GB,MB,TB其实是于实际字节总数是有误差的(原因是GB是以10为底数计量,而真正的换算是以2为底数计量。导致了总量的误差。)而真正没有此误差的单位是Ki Mi Gi Ti
所以k8s中pod资源限制为了对pod的内存限制更为精准,采用的单位是 Ki Mi Gi Ti
实例运用
需求:创建一个deployment资源,镜像使用centos:7。副本数一个。容器资源预留256MB,cpu0.5个。最多1GB,1个cpu
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: centosname: centos
spec:replicas: 1selector:matchLabels:app: centostemplate:metadata:labels:app: centosspec:containers:- image: centos:7name: centoscommand: ["/bin/bash","-c","sleep 3600"]
#容器的持久化命令resources:requests:memory: "256Mi"cpu: "0.5"limits:memory: "1Gi"cpu: "1"wqkubectl describe pod centos
下面进行压力测试
yum -y install epel-release
yum -y install stressstress --vm 1 --vm-bytes 512M
压力测试[root@centos-847ddb86c-dhn44 /]# stress --vm 1 --vm-bytes 1G
stress: info: [89] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [89] (415) <-- worker 90 got signal 9
stress: WARN: [89] (417) now reaping child worker processes
stress: FAIL: [89] (451) failed run completed in 1s
超过限制直接杀死
由此可见:
在创建pod时,一定要给容器做资源限制!!!
k8s当中怎么设置拉取镜像的策略
首先在资源式声明中存在着imagePullPolicy的字段,它的value决定着k8s创建容器时拉取镜像的方式策略。【此字段所在位置也说明了在声明式yaml中,imagePullPolicy是包含containers中】
kubectl explain pod.spec.containers.imagePullPolicy
如图所示,这三种便是k8s拉取镜像的三种策略:
IfNotPresent
只有当镜像在本地不存在时才会拉取。(先对本地进行排查,本地有该镜像直接使用,本地没有该镜像则选择在仓库中拉取)
如果本地镜像有,就不再拉取,本地没有才会去镜像仓库拉取
Always
总是从仓库拉取镜像,无论本地是否存在镜像(即使本地中存在我们所指定的相关镜像,该策略也会先从仓库中拉取进行应用)
不论镜像是否存在,创建时(重启)都会重新拉取镜像
Never
Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。(如果本地不存在,并不会在仓库中拉取,直接报错)
仅仅使用本地镜像,本地没有也不会主动拉取
k8s设置镜像拉取策略命令:
imagePullPolicy: Always / Nerver / IfNotPresent
实验演示:
总结:
都是本地部署:never
如果涉及到外部部署:默认策略(事前要把docker镜像导入目标主机,否则会去官网去拉)
Always:一般不用
pod的容器健康检查
1. 探针的概念及其作用
探针是由 kubelet 对容器执行的定期诊断(pod中探针又分为三类):
存活探针(livenessProbe)探测容器是否运行正常。如果探测失败则kubelet杀掉容器(不是Pod),容器会根据重启策略决定是否重启
就绪探针(readinessProbe)探测Pod是否能够进入READY状态,并做好接收请求的准备。如果探测失败Pod则会进入NOTREADY状态(READY为0/1)并且从所关联的service资源的端点(endpoints)中踢出,service将不会再把访问请求转发给这个Pod
启动探针(startupProbe)探测容器内的应用是否启动成功,在启动探针探测成功之前,其它类型的探针都会暂时处于禁用状态
注意:启动探针只是在容器启动后按照配置满足一次后就不再进行后续的探测了。存活探针和就绪探针会一直探测到Pod生命周期结束为止
kubectl explain pod.spec.containers
probe的检测方法
1.exec探针:在容器内部执行命令,如果命令的返回码是0,表示成功。
适用于需要在容器内自定义命令来检查容器的健康情况
2.httpGet:
对指定IP+port的容器发送一个httpGet的请求。响应状态码大于等于200,小于400都是成功。
x=[200,400) (这里用数学集合的方式表示,更容易理解)
适用于检查容器能否响应http的请求,web容器(nginx,tomcat)
3.tcpSocket
端口:对指定端口上的容器的IP地址进行tcp检查(三次握手),端口打开,认为探测成功。
检查特点容器的端口监听状态。
exec:查看容器指定的配置文件有没有生成
httpGet,tcpSocket:主要是对外部容器的检测
探针字段
initialDelaySeconds: 3
表示容器启动之后多少秒来进行探测,时间不要设置的太短,可能会导致无效探测。
periodSeconds: 2
表示探针探测的间隔时间。每隔多少秒进行一次检查。应用的延迟敏感度,这个应用非常重要,>核心组件
failureThreshold: 2
表示如果探测失败,失败几次之后把容器标记为不健康
successThreshold: 1
只要成功一次就标记为就绪,健康,ready
timeoutSecond:
表示每次探测的超时时间,在多少秒内必须完成探测
用exec方式探测
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: centosname: centos
spec:replicas: 1selector:matchLabels:app: centostemplate:metadata:labels:app: centosspec:containers:- image: centos:7name: centoscommand: ["/bin/bash","-c","touch /opt/123.txt ; sleep 3600"]livenessProbe:exec:command: ["/usr/bin/test","-e","/opt/123.txt"]initialDelaySeconds: 3
#表示容器启动之后多少秒来进行探测,时间不要设置的太短,可能会导致无效探测。 periodSeconds: 2
#表示探针探测的间隔时间。每隔多少秒进行一次检查。应用的延迟敏感度,这个应用非常重要,>核心组件failureThreshold: 2
#表示如果探测失败,失败几次之后把容器标记为不健康successThreshold: 1
#只要成功一次就标记为就绪,健康,readytimeoutSecond:
#表示每次探测的超时时间,在多少秒内必须完成探测kubectl apply -f test1.yamlkubectl exec -it centos-797bc57596-jkdfw -- rm -rf /opt/123.txt
脚本所示,通过exec将返回值写入/opt/123.txt中。若进容器将/opt/123.txt删除,则容器会重启,最多重启三次。(如上图所示)
此时若再将文件创建,容器就可以正常运行
kubectl exec -it centos-797bc57596-jkdfw -- touch /opt/123.txt
HTTP方法测试
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:httpGet:port: 8080path: /index.htmlinitialDelaySeconds: 4periodSeconds: 2
我们修改回来
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:httpGet:port: 8080path: /index.jspinitialDelaySeconds: 4periodSeconds: 2
成功运行。
下面来对tomcat的页面进行访问:
kubectl get pod -o wide
查看IPcurl 10.244.2.21:8080/index.jsp
tcpSocket检测
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:tcpSocket:port: 8081initialDelaySeconds: 4periodSeconds: 2
如图所示,我给tomcat一个错误的端口8081,容器无法启动
修改为正确端口:8080
apiVersion: v1
kind: Pod
metadata:labels:run: nginx1name: nginx1
spec:containers:- image: tomcat:8.0.52name: nginx1livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 4periodSeconds: 2
成功启动运行
强制删除会导致资源残留,不建议经常适用
总结:
总结:
探针的三个方法:
存活探针:检测失败后,会杀死容器然后重启
探针将伴随整个容器的生命周期
exec:相当于执行了一个shell命令,容器里面执行
shell命令执行成功:
返回码是0,表示成功。
只要成功一次就是探测成功
httpGet:对外部容器发起了一次get请求,可以添加path指定访问的资源。返回码在[200,400)范围之内都算成功。
tcpSocket:相当于telnet,指定的容器监听端口是否能打开。是否能和指定的容器监听端口进行通信
相关文章:
k8s---pod基础下
k8s的pod与docker重启策略的区别 k8s的重启策略 always deployment的yaml文件只能是always,pod的yaml三种模式都可以。不论正常退出还是非正常退出都重启。OnFailure:正常退出不重启,非正常退出会重启Never:正常退出和非正常退出…...
玩转朋友圈!这样运营朋友圈吸睛又吸金!
朋友圈已成为现代社交媒体中不可或缺的平台,并且有很大的潜力用于营销和推广。那么如何才能让朋友圈在众多用户中脱颖而出,吸引眼球并提升商业效益呢?主要从以下几点出发: 首先,要想吸引关注,您需要在朋友…...
react学习
目录 一、react基础 5.loadsh使用排序8.ref获取DOM对象10.props使用*13.UseEffect 二、 react使用redux三、美团外卖项目完成页面制作使用redux渲染页面使用react-router-dom评价 一、react基础 jsx 大括号的作用 {count} {userLlist.map((item)>{return <li key{item…...
vue-cli项目中vue.config.js的配置
vue-cli项目中vue.config.js的配置 一、直接上代码 一、直接上代码 let path require(path) let glob require(glob)function resolve(dir) {return path.join(__dirname, src/${dir}) }module.exports {pages: {index: {// page 的入口entry: src/main.js,// 模板来源temp…...
Github 2024-01-04 开源项目日报 Top10
根据Github Trendings的统计,今日(2024-01-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3C项目2TypeScript项目2Java项目2Jupyter Notebook项目1Go项目1 系统设计指南 创建周期ÿ…...
使用GPTs+Actions自动获取第三方数据
目录 安装插件与GPT对话联网插件首先,创建GPTs。 Voxscript 官网:https://voxscript.awt.icu/index.htmlOpenAI Schema:https://voxscript.awt.icu/swagger/v1/swagger.yamlServer URL: servers: url: https://voxscript.awt.icu安装插件 要使用这个插件&...
git提交操作(不包含初始化仓库)
1.进入到本地的git仓库 查看状态 git status 如果你之前有没有成功的提交,直接看第5步。 2.追踪文件 git add . 不要提交大于100M的文件,如果有,看第5步 3.提交评论 git commit -m "你想添加的评论" 4.push (push之前可以再…...
使用YOLOv8和Grad-CAM技术生成图像热图
目录 yolov8导航 YOLOv8(附带各种任务详细说明链接) 概述 环境准备 代码解读 导入库 定义letterbox函数 调整尺寸和比例 计算填充 应用填充 yolov8_heatmap类定义和初始化 后处理函数 绘制检测结果 类的调用函数 热图生成细节 参数解释 we…...
Vue: 多个el-select不能重复选择相同属性
一、场景 1.需求: 用户可自由选择需要修改的对象并同时修改多个属性,需要校验修改对象不能重复选择,但是可供修改属性是固定的 2.目标效果: 二、实现 1.主要代码: <template><el-selectv-model"se…...
金色麦芒的2023
2023年即将过去,回首这一年,我深感自己在技术和职业生涯中取得了巨大的进步。这一年里,我不仅在技术层面有了更深入的掌握,也在个人成长和职业规划上有了更明确的方向。 首先,在技术层面,我今年最大的收获是…...
java设计模式学习之【策略模式】
文章目录 引言策略模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用计算示例代码地址 引言 设想你正在玩一个策略游戏,每一个决策都会导致不同的游戏结局。同样地,在软件开发中,我们常常需要根据不同的场景或条件选择不同…...
Mybatis SQL构建器类 - SqlBuilder and SelectBuilder (已经废弃)
在3.2版本之前,我们采用了一种略有不同的方法,通过利用ThreadLocal变量来掩盖一些使Java DSL有点繁琐的语言限制。然而,这种方法现在已被弃用,因为现代框架已经普及了使用构建器模式和匿名内部类的概念。因此,SelectBu…...
【Linux】不常用命令记录
查看开启的网络端口 1、使用netstat命令“netstat -tuln”,该命令将显示所有当前监听的TCP和UDP端口; 2、使用ss命令“ss -tuln”,用于显示当前监听的TCP和UDP端口; 3、使用lsof命令“lsof -i”,将显示当前打开的网络…...
【docker】安装docker环境并启动容器
一、安装docker 这里以centos系统为例安装docker环境 # 删除已有安装包 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils # 设置源 y…...
AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)案例分享
原作者:擎创科技产品专家 布博士 案例分享 所需要的软件列表 本次案例的实现,全部采用开源或SAAS的产品来提供,并不涉及到私有化部署的软件产品。软件列表如下所示,如何申请apikey请自行研究,在这里不再详细说明&…...
【ESP32接入国产大模型之文心一言】
1. 怎样接入文心一言 随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。在这个领域中,文心一言作为一款强大的自然语言处理工具,具有许多重要的应用价值。本文将重点介绍如何通过ESP32接入国产大模型之文心一言api&am…...
保湿剂,预计2026年市场规模将达到约230亿美元
全球市场分析 从全球市场来看,保湿剂市场规模正在快速增长。主要集中在欧美和亚太地区的市场,据市场调研机构的数据显示,预计2026年,全球保湿剂市场规模将达到约230亿美元。保湿剂的应用领域不断拓展,包括从化妆品到个…...
CodeWhisperer:编码世界中的声音启迪者
人烟 导语: 在数字化时代,编码已经成为了一种不可或缺的技能。而 CodeWhisperer(编码世界中的声音启迪者)则以其卓越的技术和深厚的知识为人们带来了独特的启发和指导。本文将介绍 CodeWhisperer 的背景和成就,探讨他是…...
golang学习专栏
GOLANG专栏 Golang基础教程 Golang基础教程 Golang练手算法 Golang练手算法 Golang设计模式 Golang设计模式 Golang数据结构和算法 Golang数据结构和算法 Golang并发编程 Golang并发编程 ORM框架Gorm Golang ORM框架gorm Golang源码分析 Golang源码分析 MySQL教程 MySQ…...
el-table表格动态添加列。多组数据拼接和多层级数据的处理
提示:el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中,为避免闪屏,可以表格数据统一渲染总结 前言 需求:富文本编辑器 一、多组数据拼接 <template><div class"test">…...
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建安装thinkphp6漏洞信息配置 漏洞利用 修复建议 漏洞名称 漏洞描述 2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文…...
短说社区运营的使用工具分享(一)
本文是一篇针对短说社区运营的使用工具分享帖,是小编结合日常使用,总结的一些可以帮助网站管理员和运营人员进行日常操作和管理的工具。 1. 想天工作台之运营面板 想天工作台可以将桌面划分不同的类型来辅助办公,我分享下我当前的桌面情况&…...
关于.gitignore文件
.gitignore文件用于忽略git同步文件。 git上创建项目时,默认的.gitignore文件配置比较少,不太适合于windows下vs的开发设置。 下面是vs中.gitignore条目样例: # Prerequisites *.d# Compiled Object files *.slo *.lo *.o *.obj*.iobj *.V…...
Cell 文章图复现
多组差异火山图复现 参考文章: A Spatiotemporal Organ-Wide Gene Expression and Cell Atlas of the Developing Human Heart Figure 2. H 图里主要是单细胞数据不同cluster之间的差异火山图, 所以说白了就是散点图和柱状图的结合, 散点图用差异基因绘制, 柱状图利用logFC最…...
只需一招彻底解决SOLIDWORKS不显示缩略图预览
SOLIDWORKS缩略图能够让工程师便于识别想要打开的模型,但经常会有用户遇到在资源管理器中查看SOLIDWORKS文件时,仅显示SOLIDWORKS的图标,而没有相关文件的预览缩略图。 Windows文件夹选项设置 首先确保Windows文件夹选项设置,显…...
nccl 源码分析 从 ncclAllReduce 的执行开始认识nccl源代码
文字没有提及的代码内容,不需要太在意,当然也可以瞟两眼; 首先,总体而言函数 ncclAllReduce 的功能在于将携带了一个操作的info结构体,放入了队列中,待后面执行; 排队的函数调用是 ncclEnqueue…...
仿照AirDrop(隔空投送)优雅地在局域网中传输文件
基于WebRTC的局域网文件传输 在前一段时间,我想在手机上向电脑发送文件,因为要发送的文件比较多,所以我想直接通过USB连到电脑上传输,等我将手机连到电脑上之后,我发现手机竟然无法被电脑识别,能够充电但是…...
【PHP】TP5.0及Fastadmin中将查询数据返回对象转为数组
目录 方法一:使用collection助手函数 方法二:设置返回数据集的对象名 在 ThinkPHP 5.0 中,对模型查询返回的对象进行了优化,默认情况下,使用 all 或 select 方法查询数据库将返回一个对象数组集合。这个集合是模型的…...
大公司里怎样开发和部署前端代码?
前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 昨天的时候有同学问到前端部署相关的内容,正好在知乎中看到…...
API接口:原理、设计与实践
一、引言 随着互联网的发展,应用程序之间的交互变得越来越频繁,API接口成为了不同应用程序之间进行数据交换的重要手段。本文将详细介绍API接口的原理、设计与实践,以期帮助读者更好地理解和应用这一技术。 二、API接口概述 API࿰…...
网站建设丿找vx cp5173/宁波seo网络推广渠道介绍
本文有的内容是期刊风格,所以会随着期刊变化而变化。有的内容不属于风格,比如易错的东西,摘要的功能等,所有期刊都一样。 文章目录一篇想被捞的论文的基本要求标题摘要公式 equations单位 units图 graphics交叉引用 cross referen…...
12380网站建设情况/青岛网站seo服务
目录一 系统架构图1 FELeaderFollowerObserver2 BE3 数据存储3 建表语句4 导入数据Broker LoadSpark LoadStream LoadInsert Into一 系统架构图 StarRocks是一个分布式离线/实时分析平台,可用于处理PB级别的数据量。它使用了分层存储技术,并提供了SQL接口…...
怎么开个人工作室/百度关键词优化工具
1.类的基本结构:由于这里用到了界面,所以要进行窗口界面的编程,按钮事件的处理,和计算处理界面;package MyCaculator;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MyCaculator exte…...
做网站到底能不能赚钱/销售的技巧与口才
用EditPlus打造你自己的IDE 因为对微软的notepad有点审美疲劳,所以常用EditPlus或UltraEdit32代替之.这两个文本编辑器功能比notepad强太多了.对程序员而言,本文只讲一下他的两个特点,用它来打造我们自己的IDE.希望对大家有用.1.程序高亮显示写程序的人长期处于某种临界状态,用…...
山西城乡建设网站/电子商务与网络营销题库
二叉树的中序遍历 题目描述: 给定一个二叉树的根节点 root ,返回它的 中序 遍历。提示:树中节点数目在范围 [0, 100] 内-100 < Node.val < 100题目链接 首先需要理解什么是中序遍历,中序遍历就是按照"左-根-右"的…...
搭设企业网站教程/东莞哪种网站推广好
让我们来尝试一次深度匹配,在我们的模式匹配中检查对象的内容。//code-examples/Rounding/match-deep-script.scalacase class Person(name: String, age:Int) val alice new Person("Alice",25) val bob new Person("Bob",32) val charli…...