K8S - 架构、常用K8S命令、yaml资源清单部署、Ingress、故障排查、存储卷
K8S
- K8S官网文档:https://kubernetes.io/zh/docs/home/
- 学习东西还是要从官方文档入手;
- 用于管理、扩展、自动部署容器; 其实就是 对多个跨机器的Docker集群;
K8S特性
- 服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 - 自动部署和回滚
创建新容器, 删除现有容器并将它们的所有资源用于新容器。 - 自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
Docker编排常用命令
K8S 的核心功能:自动化运维管理多个容器化程序;
核心架构角色:
-
kube-apiserver
负责公开了 Kubernetes API,负责处理接受请求的工作; -
etcd
分布式数据库;一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。需要保证高可用、避免单点故障; -
kube-scheduler
- 分布式调度器;用来调度在指定节点上创建pod;
- 调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、工作负载;简单可以理解为选择空闲的机器创建pod;
-
kube-controller-manager
- 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
- 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 还有其他控制器、暂时不涉及;
-
kubelet
- Worker Node 的监视器,以及与 Master Node 的通讯器
- kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。
- 会向Master node汇报自身node服务运行的状态;并接受来自 Master Node 的指示采取调整措施
- kubelet 只管理由 Kubernetes 创建的容器。
-
kube-proxy
- kube-proxy 是集群中每个节点(node)上所运行的网络代理, 负责 Node 在 K8S 的网络通讯
-
Container Runtime
- Worker Node 的运行环境 ,负责运行容器的软件。例如Docker Engine引擎;
简单命令执行流程
当我们执行创建Ngnix的容器时、执行以下K8S命令
kubectl create deployment nginx --image=nginx
命令的执行流程如下:
- API Server收到命令请求;
- API Server将命令交给Controller Manager 、CM生成应用部署记录;
- CM调用 API Server 将 应用部署记录 存入 etcd数据库;
- Scheduler调度器 定时调用 API Server 查询 etcd,获取到应用部署记录 与 worker node运行情况、 根据调度算法 决定 要在哪台node上部署应用;
- Scheduler 调用 API Server将调度结果记录放入etcd数据;
- 每个worker node的Kubelet 定时与 Master Node API Server 保持心跳与通信、获取到etcd中的调度结果记录, 每个节点判断是否要在本机上部署、 是则创建Pod、并随时汇报Pod运行情况;
- 每一个机器上的kube-proxy能知道集群的所有网络,只要node访问别人或者别人访问node,node上的kube-proxy网络代理自动计算进行流量转发
kubectl命令使用
语法:
kubectl [command] [TYPE] [NAME] [flags]
- command :操作类型、例如 create、get、describe、delete
- TYPE: 资源类型、 资源类型不区分大小写;
- NAME: 指定资源的名称。名称区分大小写。 如果省略名称,则显示所有资源的详细信息。例如:kubectl get pod
你需要帮助,在终端窗口中运行 kubectl help
创建一个Tomcat应用程序
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine
查询部署信息
kubectl get deployment
获取pod信息
kubectl get pod -o wide
根据name查询pod信息
kubectl get pod my-tomcat -o wide
查看容器日志
kubectl logs my-tomcat-685b8fd9c9-rw42d(pod名称)
使用 exec 可以在Pod的容器中执行命令,这里使用 env 命令查看环境变量
kubectl exec my-tomcat-685b8fd9c9-rw42d – env
kubectl exec my-tomcat-685b8fd9c9-rw42d – ls / # 查看容器的根目录下面内容
进入Pod容器内部并执行bash命令,如果想退出容器可以使用exit命令
kubectl exec -it my-tomcat-685b8fd9c9-rw42d – sh
访问一下这个tomcat pod
集群内访问(在集群里任一worker节点都可以访问)
curl 10.244.36.69:8080
集群外部访问
K8S中、将服务暴露到外网访问、需要使用service;
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort
查看service
kubectl get svc -o wide
svc 是 service简写
K8S的service服务端口号为8080, 宿主机映射的随机端口为32224, 因此可通过 集群工作节点IP : 随机端口 访问
service服务有个特点,如果端口暴露类型为NodePort,那么可以通过集群内所有worker主机加暴露的端口进行访问
删除Pod:
- 查看 pod运行情况、 -w代表一直等待、可查看变化;类似tail -f 命令
#查看pod信息,-w意思是一直等待观察pod信息的变动
kubectl get pod -w
- 开另外一个命令窗口执行删除命令、 并观察1中的内容变化;
kubectl delete pod my-tomcat-685b8fd9c9-rw42d
3. 重启了一个Pod;
这意味着、每次执行del都会重新创建运行Pod, 相当于是Pod重启命令、 也是 K8S的核心特性、服务自愈;
- 查看下deployment和service的状态
kubectl get pod,svc
- 查看服务运行情况, 还是可以访问成功;
服务扩缩容
- 执行scale扩容
kubectl scale --replicas=5 deployment my-tomcat
- 查看pod
3. 执行scale缩容
kubectl scale --replicas=3 deployment my-tomcat
滚动升级与回滚
对my-tomcat这个deployment进行滚动升级和回滚,将tomcat版本由tomcat:7.0.75-alpine升级到tomcat:8.0.41-jre8-alpine,再回滚到tomcat:7.0.75-alpine
- 滚动升级:
使用set image设置镜像
kubectl set image deployement my-tomcat tomcat= tomcat:8.0.41-jre8-alpine
- 执行 kubectl get pod -w 观察pod的变动情况,可以看到有的pod在销毁,有的pod在创建
- 查看pod信息
- 查看某个pod的详细信息
kubectl describe pod my-tomcat-547db86547-4btmd
镜像已经升级了;
5. 访问下tomcat
- 版本回滚
- 查看历史版本
kubectl rollout history deploy my-tomcat
- 回滚到上一个版本
kubectl rollout undo deployment my-tomcat #–to-revision 参数可以指定回退的版本
- 再次访问tomcat,发现版本已经回退
标签的使用
通过给资源添加Label,可以方便地管理资源(如Deployment、Pod、Service等)。
- 查看Deployment中所包含的Label
kubectl subscribe deployment my-tomcat
- 通过Label查询Pod
kubectl get pod -l app=my-tomcat
4. 通过Label查询Service
kubectl get service -l app=my-tomcat
5. 给Pod添加Label
kubectl label pod my-tomcat-685b8fd9c9-lrwst version = v1
- 查看Pod的详细信息,可以查看Label信息:
kubectl describe pods my-tomcat-685b8fd9c9-lrwst
7. 通过Label查询Pod
kubectl get pod -l version=v1
- 通过Label删除服务
kubectl delete service -l version=v1
命令总结:
kubectl create deployment #创建一个deployment来管理创建的容器
kubectl get #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
kubectl expose #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)
kubectl describe #显示特定资源或资源组的详细信息
kubectl scale #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
kubectl set #更改现有的应用程序资源
kubectl rollout #资源回滚管理
kubectl delete #删除资源
K8S 核心概念
Deployment
负责创建和更新应用程序的实力、 应用程序可以理解为Pod;
创建Deployment后,Master Node将应用程序实例调度到各个工作节点上运行;
如果工作节点上的应用程序关闭停止、则Master Node会将应用程序实例调度到其他的工作节点上、也是服务自愈;
Pod
相当于逻辑主机、 托管应用程序实例; 内部包含一个或者多个程序容器(Docker层);
可以理解为 在Docker容器层之上、再封装了一层的容器;
Service
为Pod提供外部访问暴露、负载均衡、服务发现;即Pod的网络代理;
若Pod没有设置Service、则只能在集群内部访问、集群外部无法访问;
在ServiceSpec标记type的方式暴露,type类型如下:
- ClusterIP(默认):在集群的内部IP上公开Service。这种类型使得Service只能从集群内访问。
- NodePort:使用NAT在集群中每个选定Node的相同端口上公开Service。使用 : 从集群外部访问Service。是ClusterIP的超集。
- LoadBalancer:在当前云中创建一个外部负载均衡器(如果支持的话),并为Service分配一个固定的外部IP。是NodePort的超集。
- ExternalName:通过返回带有该名称的CNAME记录,使用任意名称(由spec中的externalName指定)公开Service。不使用代理
k8s中的资源
-
工作负载型资源(workload): Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet等等
-
服务发现及负载均衡型资源(ServiceDiscovery LoadBalance): Service,Ingress等等
-
配置与存储型资源: Volume(存储卷),CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
-
特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型),Secret(保存敏感数据),DownwardAPI(把外部环境中的信息输出给容器)
-
集群级资源:Namespace,Node,Role,ClusterRole,RoleBinding(角色绑定),ClusterRoleBinding(集群角色绑定)
-
元数据型资源:HPA(Pod水平扩展),PodTemplate(Pod模板,用于让控制器创建Pod时使用的模板),LimitRange(用来定义硬件资源限制的)
就业务开发来看、涉及频率高的是Pod、Deployment、 Ingress、Service, Volume、其他比较少涉及实用;
资源清单
在k8s中,我们一般都会使用yaml格式的文件来创建符合我们预期期望的资源,这样的yaml文件我们一般称为资源清单
资源清单yaml的格式
apiVersion: group/apiversion # 如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind: #资源类别
metadata: #资源元数据namenamespace #k8s自身的namespacelablesannotations #主要目的是方便用户阅读查找
spec:期望的状态(disired state)
status:当前状态,本字段由kubernetes自身维护,用户不能去定义
#配置清单主要有五个一级字段,其中status字段用户不能定义,由k8s自身维护
使用资源清单yaml来创建k8s的资源对象
用创建deployment的命令加上参数 --dry-run -o yaml 输出部署的资源清单yaml
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine --dry-run -o yaml
使用yaml部署tomcat
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: my-tomcat-yamlname: my-tomcat-yaml #修改deployment的名称
spec:replicas: 2 #修改pod副本为两个selector:matchLabels:app: my-tomcat-yamlstrategy: {}template:metadata:creationTimestamp: nulllabels:app: my-tomcat-yamlspec:containers:- image: tomcat:7.0.75-alpine #容器的镜像(核心)name: tomcatresources: {}
status: {}
使用apply命令
kubectl apply -f deployment-demo.yaml
用yaml创建service资源的对象
同样使用dry-run yaml获取yaml
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort --dry-run -o yaml
创建service的yaml文件
apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: my-tomcat-yamlname: tomcat-service-yaml #修改service名称
spec:ports:- port: 80 # service的虚拟ip对应的端口,在集群内网机器可以访问用service的虚拟ip加该端口号访问服务nodePort: 30001 # service在宿主机上映射的外网访问端口,端口范围必须在30000-32767之间protocol: TCPtargetPort: 8080 # pod暴露的端口,一般与pod内部容器暴露的端口一致selector:app: my-tomcat-yaml #应用名称type: NodePort
status:loadBalancer: {}
执行apply命令创建service资源
kubectl apply -f service-demo.yaml
查看已存在资源的yaml
业务开发中、服务已经在运行了,我们需要查看yaml、就无需使用创建方式来查看了;
可以根据已运行的资源查看其yaml内容;
- 查看资源
- 将资源的配置以yaml的格式输出出来
使用 -o yaml输入;
kubectl get pod nginx-deploy-7db697dfbd-2qh7v -o yaml
Ingress
Ingress类型Nginx, 可以基于域名访问、实现访问的负载均衡;
- 使用K8S安装Ingress
- 创建Ingress访问配置yaml文件
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: web-ingress
spec:rules:- host: tomcat.com #转发域名http:paths:- path: /backend:serviceName: tomcat-service-yamlservicePort: 80 #service的端口
- 执行apply应用;
kubectl apply -f ingress-tomcat.yaml
- 查看生效的ingress规则
kubectl get ing #ingress 缩写 ing
- C:\Windows\System32\drivers\etc,在host里增加如下host
192.168.65.203 (服务器IP) tomcat.com
或者
192.168.65.210 (服务器IP) tomcat.com
- 访问
客户机浏览器访问http://tomcat.com/ ,能正常访问tomcat。
存储卷使用
通过存储卷,我们可以把外部数据挂载到容器中去,供容器中的应用访问,这样就算容器崩溃了,数据也不会丢失;
docker的挂载:
docker run -p 80:80 --name nginx
-v /mydata/nginx/html:/usr/share/nginx/html
-v /mydata/nginx/logs:/var/log/nginx
-v /mydata/nginx/conf:/etc/nginx
-d nginx:1.10
K8S也可以挂载文件,添加配置文件nginx-volume-deployment.yaml用于创建Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-volume-deploymentlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.10ports:- containerPort: 80volumeMounts:- mountPath: /usr/share/nginx/htmlname: html-volume- mountPath: /var/log/nginxname: logs-volume- mountPath: /etc/nginxname: conf-volumevolumes:- name: html-volumehostPath:path: /home/docker/mydata/nginx/htmltype: Directory- name: logs-volumehostPath:path: /home/docker/mydata/nginx/logstype: Directory- name: conf-volumehostPath:path: /home/docker/mydata/nginx/conftype: Directory
kubectl 进行故障排除
若是服务部署失败、则可通过subscribe查看问题
kubectl describe ${RESOURCE} ${NAME}
拉到最后看到Events部分,会显示出 K8S 在部署这个服务过程的关键日志。
若是服务部署成功、业务运行出现异常、则通过logs查看问题;
kubectl logs ${POD_NAME}
进入容器内部;
kubectl exec -it [options] ${POD_NAME} -c ${CONTAINER_NAME} [args]
kubectl exec -ti $POD_NAME – bash
总结
- Service 是 K8S 服务的核心,屏蔽了服务细节,统一对外暴露服务接口,真正做到了“微服务”。
- 一方面外部用户不需要感知因为 Pod 上服务的意外崩溃、K8S 重新拉起 Pod 而造成的 IP 变更,外部用户也不需要感知因升级、变更服务带来的 Pod 替换而造成的 IP 变化,另一方面,Service 还可以做流量负载均衡。
相关文章:

K8S - 架构、常用K8S命令、yaml资源清单部署、Ingress、故障排查、存储卷
K8S K8S官网文档:https://kubernetes.io/zh/docs/home/学习东西还是要从官方文档入手;用于管理、扩展、自动部署容器; 其实就是 对多个跨机器的Docker集群; K8S特性 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 …...

micro benchmark 使用经验
文章目录 User Guide User Guide User Guide: https://github.com/google/benchmark/blob/main/docs/user_guide.md #include <benchmark/benchmark.h> #include <chrono> #include <thread>void BM_DemoSleep(benchmark::State& state) {for (auto _ …...

nodejs发布静态https服务器
1、先用 npm init 创建一个package.json,然后添加依赖 node-static ,package.json 如下: {"name": "freeswitch","version": "1.0.0","description": "test freeswitch for webrtc&…...

国产系统下开发QT程序总结
国产系统下开发QT程序总结 1. 国产系统简介 开发国产系统客户端的过程中,会出现兼容性问题。以下介绍Kylin和UOS环境下开发QT程序, 首先麒麟和统信这两个系统基于Ubuntu开发的。所以在Ubuntu开发理论上在国产系统上也能运行。芯片架构又分为amd,arm,mi…...

【Redis】redis入门+java操作redis
目录 一、Redis入门 1.1 Redis简介 1.2 Redis下载与安装 1.2.1 下载 1.2.2 linux安装 1.2.3 windows安装 1.3 Redis服务启动与停止 1.3.1 linux启动、停止Redis服务 1.3.2 windows启动、停止Redis服务 1.4 修改Redis启动密码 1.4.1 Linux修改设置 1.4.2 windows设…...

无涯教程-Android - Spinner函数
Spinner允许您从下拉菜单中选择一个项目 例如。使用Gmail应用程序时,将显示如下所示的下拉菜单,您需要从下拉菜单中选择一个项目。 Spinner Example 示例 本示例演示计算机的类别,您需要从类别中选择一个类别。 以下是修改后的主要Activity文件src/com.example.spinner/Andr…...

国标GB28181视频平台EasyGBS国标平台智能边缘计算网关关于小区电动车进电梯的应用方案设计
一、行业背景 随着人工智能技术的不断成熟与落地,各行各业也逐渐融入AI智能检测技术,尤其是在视频监控领域,通过AI视频智能检测与分析,可以大大提高视频的自动化、智能化监控能力。比如在小区的管理中,由电动车上楼入…...

supervisorctl(-jar)启动配置设置NACOS不同命名空间
背景 由于需要在上海服务器上面配置B测试环境,原本上面已有A测试环境,固需要将两套权限系统分开 可以使用不同的命名空间来隔离启动服务 注:本文章均不涉及公司机密 1、新建命名空间 命名空间默认会有一个public,并且不能删除&a…...

如何解决 Out Of Memory 的问题
背景 在用 Excel Importer 导入数据,当数据量超过 1w 行,经常会出现 OutOfMemory 的错误。(用 Excel Exporter 导出数据时,也会有类似问题)。 通常的表现症状如下,即在导入成功若干行之后,爆出…...

代码随想录训练营二刷第九天 | 字符串结束
总结 总体来说字符串的题目除了KMP之外难度不大,但是细节不少,有翻转的有双指针操作的。 此外一般使用双指针都是为了降低时间复杂度,从On2到On,链表除外。...

javaee spring jdbcTemplate的使用
依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…...

qt day
#include "widget.h" #include "ui_widget.h" void Widget::my_slot() {} Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));//設置窗口的…...

Configurable Weather Parameters
1. Weather Parameters 2. Classification ClearNoon, CloudyNoon, WetNoon, WetCloudyNoon, SoftRainNoon, MidRainyNoon, HardRainNoon, ClearSunset, CloudySunset, WetSunset, WetCloudySunset, SoftRainSunset, MidRainSunset, HardRainSunset to do list: 可以关注一下…...

MySQL 8 数据清洗总结
MySQL 8 数据清洗三要素: 库表拷贝和数据备份数据清洗SQL数据清洗必杀技-存储过程 前提:数据库关联库表初始化和基础数据初始化: -- usc.t_project definitionCREATE TABLE t_project (id varchar(64) NOT NULL COMMENT 主键,tid varchar(…...

设计模式第九讲:常见重构技巧 - 去除不必要的!=
设计模式第九讲:常见重构技巧 - 去除不必要的! 项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?本文是设计模式第九讲,讲解常见重构技巧:去除不必要的! 文章目录…...

自动化安装系统问题记录
Cobbler 版本更新 https://github.com/cobbler/cobbler/releases Centos7/8 Cobbler 问题: 部署cobbler时,使用cobbler get-loaders从网络下载引导加载程序时提示命令未找到 解决: yum -y install syslinux Rockylinux9.2 Cobbler3.…...

centos7 docker安装记录
以下所有命令都在root用户下进行,若为普通用户,需要在所有命令前加上 sudo。 1、更新yum包 将yum包更新到最新 yum update2、安装需要的软件包 yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的; yum …...

全网实时热点热榜事件API
全网热榜API 一、全网热榜二、使用步骤1、接口2、请求参数 三、 案例和demo 一、全网热榜 1个免费的帮助你获取全网热点事件的接口API 二、使用步骤 1、接口 重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议 请求方式: GET https://luckycola.com.cn…...

淘宝API接口:提高电商运营效率与用户体验的利器(淘宝API接口使用指南)
淘宝API接口:提高电商运营效率与用户体验的利器 随着电商行业的快速发展,淘宝作为国内最大的电商平台之一,不断探索和创新,以满足不断变化的用户需求和商家需求。其中,淘宝API接口便是其创新的一个重要方面。本文将深…...

智己 LS6 用实力和你卷,最强 800v ?
2023 成都车展期间,智己 LS6 正式公布预售价格,新车预售价为 23-30 万元。新车会在 10 月份进行上市,11 月正式交付。 此前我们对智己 LS6 做过非常详细的静态体验,感兴趣的可点击此链接了解。 造型方面,新车前脸相比…...

深入探索C语言自定义类型:打造你的编程世界
一、什么是自定义类型 C语言提供了丰富的内置类型,常见的有int, char, float, double, 以及各种指针。 除此之外,我们还能自己创建一些类型,这些类型称为自定义类型,如数组,结构体,枚举类型和联合体类型。 …...

Opencv基于文字检测去图片水印
做了一个简单的去水印功能,基于文字检测去图片水印。效果如下: 插件功能代码参考如下: using namespace cv::dnn; TextDetectionModel_DB *textDetector0; void getTextDetector() {if(textDetector)return;String modelPath "text_de…...

jdbc235
概念:java database connectivity java数据库连接 java语言操作数据库 定义了一套操作所有关系型数据库的规则(接口) 本质:其实是官方公司定义了一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接…...

库仑定律和场强
1、库伦定律 两个电荷相互作用的力。 力是矢量,有大小和方向。 1.1、力的大小 1.2、力的方向 在两个电荷的连线上,同种电荷相互排斥,异种电荷相互吸引。 真空,不是必要条件,修改公式中介电常数的值仍然满足库伦定律。…...

Android安卓实战项目(13)---记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用!!!(源码在文末)
Android安卓实战项目(13)—记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用!!!(源码在文末🐕🐕🐕) 一.项目运行介绍 B站…...

嵌入式开发之syslog和rsyslog构建日志记录
1.syslogd作客户端 BusyBox v1.20.2 (2022-04-06 16:19:14 CST) multi-call binary.Usage: syslogd [OPTIONS]System logging utility-n Run in foreground-O FILE Log to FILE (default:/var/log/messages)-l N Log only messages more urge…...

Jaeger的经典BUG原创
前端,笔者在使用Jaeger进行Trace监控的时候,当数据量增大到一定数量级时,出现了一次CPU暴增导致节点服务器挂了的经典案例,这里对案例进行一个简单的抽象,供大家参考: 首先通过pprof对耗时的函数进行定位&…...

四款简洁好看 自适应的APP下载单页源码
分享四款简洁好看 自适应的APP下载单页源码,采用了底部自动获取ICP备案号,还有蓝奏云文件直链解析。不光可以做APP下载引导页,也可以随便改下按钮做网站引导页,自由发挥即可! 蓝奏云直链解析的好处:APP放在…...

【服务器】交换机带外管理和带内管理
一、交换机的带外管理是什么? 在带外管理模式中,网络的管理控制信息与用户网络的承载业务信息在不同的逻辑信道传送。 带外管理最大的优势在于,当网络出现故障中断时数据传输和管理都可以正常进行——不同的物理通道传送管理控制信息和数据…...

Kotlin的内置函数 apply、let、run、with、also
let 1.let函数返回类型,是根据匿名函数的最后一行变化而变化 2.let函数中的匿名函数里面持有的是it 集合自身 fun main() {var num1 1var num2 1var result:Intresult num1 num2var str result?.let {//传入本身,it指代本身即result,result不为空…...