在CSDN学Golang云原生(Kubernetes基础)
一,k8s集群安装和升级
安装 Golang K8s 集群可以参照以下步骤:
- 准备环境:需要一组 Linux 服务器,并在每台服务器上安装 Docker 和 Kubernetes 工具。
- 初始化集群:使用 kubeadm 工具初始化一个 Kubernetes 集群。例如,以下命令会初始化一个名为
mycluster
的集群:
$ kubeadm init --apiserver-advertise-address <master-node-ip> --pod-network-cidr=10.244.0.0/16
其中,<master-node-ip>
是 Kubernetes 主节点的 IP 地址。
- 部署网络插件:选择合适的网络插件并将其部署到集群中。例如,使用 Calico 网络插件可通过以下命令进行部署:
$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
- 加入工作节点:使用
kubeadm join
命令将工作节点加入集群。例如,以下命令会将某个节点加入到名为mycluster
的集群中:
$ kubeadm join <master-node-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
其中,<token>
和 <hash>
分别是由主节点生成的 Token 和证书哈希值。
升级 Golang K8s 集群可以参照以下步骤:
- 升级控制平面组件:先升级控制平面组件,包括 kube-apiserver、kube-controller-manager 和 kube-scheduler 等。
- 升级工作节点组件:再逐一升级工作节点上的组件,包括 kubelet、kube-proxy 和容器运行时等。
- 检查升级结果:在升级完成后,需要检查集群中所有节点的状态,并确保它们已经成功升级到指定版本。
注意事项:
- 在进行 Golang K8s 集群安装和升级前,需要充分了解 Kubernetes 架构和相关概念,并选择合适的网络插件和存储方案等。
- 在使用 kubeadm 初始化集群时需要指定参数并保存相应信息,以便后续加入工作节点或更新控制平面组件时使用。
- 在进行 Golang K8s 集群升级时,需要仔细阅读官方文档并按照指导进行操作。建议先在测试环境中进行充分测试并备份数据,以防出现意外情况。
二,flannel网络插件的安装
Flannel 是一个简单和轻量的网络插件,可为 Kubernetes 集群提供基础网络功能。以下是在 Golang 环境中安装 Flannel 网络插件的步骤:
- 创建 flannel.yaml 文件,并将以下内容复制到文件中:
apiVersion: v1
kind: ConfigMap
metadata:name: kube-flannel-cfgnamespace: kube-system
data:net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:name: kube-flannel-ds-amd64namespace: kube-systemlabels:k8s-app: flannel
spec:template:metadata:labels:k8s-app: flannelspec:hostNetwork: truecontainers:- name: kube-flannel-amd64image: quay.io/coreos/flannel:v0.14.0-amd64 # 根据实际情况选择版本号或者用latest代替。command:- /opt/bin/flanneld # 默认启动命令,不要修改。args:- --ip-masq # 启用 NAT 转发。- --kube-subnet-mgr # 如果启用了自动分配 Pod 子网,则必须开启该选项。resources:requests:cpu: 100m # 单节点 CPU 最小配置为100m。memory: 50Mi # 单节点内存最小配置为50MB。limits:cpu: 200mmemory: 100MisecurityContext:privileged: true # 设置为特权容器,允许容器使用 iptables 进行 NAT 转发。volumeMounts:- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: flannel-cfgconfigMap:name: kube-flannel-cfg
- 使用 kubectl 命令将 flannel.yaml 文件中的内容应用到 Kubernetes 集群中:
$ kubectl apply -f flannel.yaml
- 等待 Flannel DaemonSet 在集群中部署完成后,使用以下命令检查 Flannel 是否正常工作:
$ kubectl get pods -n kube-system | grep kube-flannel-ds-amd64
kube-flannel-ds-amd64-xxxxx 1/1 Running 0 xxh xxh <none> <none>
如果看到类似上面的输出信息,则说明 Flannel 已经在集群中成功部署并且正在运行。
注意事项:
- 在安装 Flannel 之前需要先准备好 Golang 环境,并确保 Kubernetes 集群已经正确初始化。
- 在创建 flannel.yaml 文件时,需要根据实际情况修改网络配置和镜像版本等参数。在选择网络插件时应该综合考虑多个因素,例如性能、可靠性和易用性等。
- 在部署 Flannel 之后,应该充分测试集群的网络功能,并且及时更新和修复可能出现的问题。
三,CRI与cri-Dockerd
CRI(Container Runtime Interface)是 Kubernetes 官方提供的一套标准化容器运行时接口,旨在为 Kubernetes 集群提供更加灵活和可扩展的容器管理能力。CRI-Dockerd 是 Docker 公司开发的符合 CRI 规范的容器运行时实现。
下面是 Golang 中使用 CRI-Dockerd 的步骤:
- 安装 Docker CE,并确保其版本号在 18.06 或以上。
- 安装 CRI-Dockerd 运行时。可以通过以下命令来安装:
$ curl -s https://raw.githubusercontent.com/kubernetes-sigs/cri-tools/master/scripts/install-docker.sh | sh
- 启动 CRI-Dockerd 运行时。可以使用以下命令来启动:
$ sudo dockerd \--add-runtime docker-cri=/usr/local/bin/docker-containerd \--host=unix:///var/run/dockershim.sock \--default-runtime=docker-cri \--exec-opt native.cgroupdriver=cgroupfs
其中,--add-runtime 参数指定了 CRI-Dockerd 使用的容器运行时名称和路径,--host 参数指定了连接到 dockershim 的 sock 文件路径,--default-runtime 指定默认的运行时名称,--exec-opt 参数用于配置 cgroup 驱动程序。
- 启动 kubelet,并将 runtime-endpoint 参数设置为 CRI-Dockerd 运行时的 sock 文件路径:
$ sudo kubelet ... --container-runtime remote --runtime-request-timeout 15m \--container-runtime-endpoint unix:///var/run/dockershim.sock ...
其中,--container-runtime 参数指定了容器运行时类型为 remote,--runtime-request-timeout 指定了容器运行时请求的超时时间。
下面是 Golang 中使用 CRI 的步骤:
- 安装 CRI 运行时。可以通过以下命令来安装:
$ go get -u k8s.io/kubernetes/cmd/kubelet/cri/remote
- 启动 kubelet,并将 runtime-endpoint 参数设置为 CRI 运行时的 sock 文件路径:
$ sudo kubelet ... --container-runtime remote --runtime-request-timeout 15m \--container-runtime-endpoint unix:///var/run/crio/crio.sock ...
其中,--container-runtime 参数指定了容器运行时类型为 remote,--runtime-request-timeout 指定了容器运行时请求的超时时间。
注意事项:
- 在安装和配置 CRI-Dockerd 或 CRI 运行时之前,需要先准备好 Docker CE 和 Kubernetes 集群,并且确保它们都已经正确初始化。
- 在选择容器运行时类型和版本号等参数时,应该综合考虑多个因素,例如性能、可靠性和易用性等。
- 在部署完成后应该充分测试集群的容器管理功能,并及时更新和修复可能出现的问题。
四,api server 组件
在 Kubernetes 中,API Server 是整个系统的核心组件之一,它为集群内的所有对象提供 RESTful API 接口,并负责管理集群状态、协调各个组件之间的交互和通信等任务。在 Golang 中编写一个自己的 API Server 组件,可以参考以下步骤:
- 定义 API 对象
定义需要暴露给用户的 API 对象模型,在 Golang 中使用 struct 来表示。
- 实现 RESTful API 接口
使用 net/http 包来实现 RESTful API 接口。可以使用 Gorilla Mux 这样的路由器库来简化路由逻辑。
- 实现访问控制
根据具体需求实现访问控制策略,例如基于 RBAC 的权限控制、Token 认证等。
- 实现数据存储
根据具体需求选择适当的数据库或存储引擎,并使用相应的 Golang 库来实现数据存储功能。
- 编写测试代码
编写单元测试和端到端测试代码,并使用工具对代码进行覆盖率分析和性能测试等。
- 集成到 Kubernetes 系统中
将自己编写的 API Server 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。
- 监测和维护
通过 Kubernetes 提供的监控和日志系统对 API Server 组件进行实时监测和维护,及时发现和解决问题。
需要注意的是,在编写自己的 API Server 组件之前,需要对 Kubernetes 的架构、API Server 的工作原理以及相应的开发规范有一定了解。同时,还需要熟悉 Golang 的基本语法、网络编程知识和 RESTful API 设计原则等。
五,controller manager组件
在 Kubernetes 中,Controller Manager 是负责运行各种控制器的核心组件之一。控制器是 Kubernetes 中实现自动化管理的核心机制,它们可以监视集群中某些资源对象的状态变化,并根据预设的规则对其进行处理。
下面是实现 Golang Controller Manager 组件的主要步骤:
- 定义需要管理的资源对象
通过定义 API 对象模型来描述需要管理的资源对象,在 Golang 中使用 struct 来表示。
- 编写控制器逻辑
根据具体需求编写相应的控制器逻辑代码,例如 Pod 控制器、Service 控制器等。控制器通常会包含以下基本操作:
- 监视指定资源对象或事件流
- 处理资源对象状态变化或事件
- 执行相关操作(如创建、更新、删除资源)
- 实现与 API Server 的交互
使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取或更新相关信息。可以使用 Informer 机制来简化访问和监视 Kubernetes API 资源对象。
- 实现错误处理和重试机制
针对网络故障或异常情况进行错误处理和重试机制设计,确保系统稳定性和可靠性。
- 编写测试代码
编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。
- 集成到 Kubernetes 系统中
将自己编写的 Controller Manager 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。
- 监测和维护
通过 Kubernetes 提供的监控和日志系统对 Controller Manager 组件进行实时监测和维护,及时发现和解决问题。
需要注意的是,在编写自己的 Controller Manager 组件之前,需要对 Kubernetes 的架构、API Server 和控制器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。
六,Scheduler 组件
在 Kubernetes 中,Scheduler 是负责将 Pod 调度到可用的 Node 上运行的组件。Scheduler 通过监视未调度的 Pod,并选择合适的 Node 并将其绑定到该节点上。
下面是实现 Golang Scheduler 组件的主要步骤:
- 定义调度器算法
根据具体需求设计和实现调度器算法,例如默认的、权重优先级、抢占式等。
- 实现与 API Server 的交互
使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取需要进行调度的 Pod 和可用的 Node 等信息。
- 执行策略判断和决策
根据定义好的调度器算法对 Pod 进行策略判断和决策,确定最佳的 Node 并将其绑定到该节点上。同时需要考虑诸如资源约束、Pod 亲和性和反亲和性等因素。
- 实现错误处理和重试机制
针对网络故障或异常情况进行错误处理和重试机制设计,确保系统稳定性和可靠性。
- 编写测试代码
编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。
- 集成到 Kubernetes 系统中
将自己编写的 Scheduler 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。
- 监测和维护
通过 Kubernetes 提供的监控和日志系统对 Scheduler 组件进行实时监测和维护,及时发现和解决问题。
需要注意的是,在编写自己的 Scheduler 组件之前,需要对 Kubernetes 的架构、API Server 和调度器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。
七,Kubelet组件
在 Kubernetes 中,Kubelet 是运行在每个 Node 上的主要组件之一,负责管理该 Node 上的容器和 Pod。Kubelet 会定期从 API Server 获取需要在该 Node 上运行的 Pod,并通过容器化技术(如 Docker)启动和停止这些容器。
下面是实现 Golang Kubelet 组件的主要步骤:
- 实现与 API Server 的交互
使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取需要在该 Node 上运行的 Pod 和相关信息等。
- 管理本地容器
使用 Docker 或其他容器化技术,启动和停止 Pod 中定义的各个容器。同时需要考虑诸如网络连接、存储卷、资源限制等问题。
- 实现健康检查机制
针对每个 Pod 和其内部的每个容器,实现健康检查机制以确保它们正常运行。如果发现某个容器或整个 Pod 失效,则应及时采取相应措施进行修复或重建。
- 实现资源监测和调节机制
通过监测节点上各个进程和资源利用情况,自动调节 CPU、内存、网络带宽等资源分配策略,并定期汇报给集群中心。
- 编写测试代码
编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。
- 集成到 Kubernetes 系统中
将自己编写的 Kubelet 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。
- 监测和维护
通过 Kubernetes 提供的监控和日志系统对 Kubelet 组件进行实时监测和维护,及时发现和解决问题。
需要注意的是,在编写自己的 Kubelet 组件之前,需要对 Kubernetes 的架构、API Server 和调度器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。
八,proxy组件
在计算机网络中,代理(Proxy)是一种网络服务,它充当客户端和服务器之间的中介。Golang 语言可以轻松实现一个基于 HTTP 协议的代理组件。下面是实现 Golang Proxy 组件的主要步骤:
- 创建监听 Socket
使用 Go 标准库 net 监听指定端口上的 TCP 连接。
- 处理连接请求
接收客户端发来的连接请求,并将其封装成 HttpRequest 对象,读取其中的 URL 和 Headers 等信息。
- 判断是否需要代理
根据 HttpRequest 中请求头部(如 User-Agent、Host)等信息判断该请求是否需要通过代理进行转发。
- 向目标服务器发送请求
如果需要代理,则将 HttpRequest 中的数据转发给目标服务器,并将返回结果封装成 HttpResponse 对象。
- 返回结果给客户端
将目标服务器返回的 HttpResponse 对象传输回到原始客户端。
- 处理异常情况
处理诸如连接超时、HTTP 错误码、非法 URL、内存泄漏等异常情况,保证代理组件稳定运行。
- 集成到应用中
将自己编写的 Proxy 组件集成到 Web 应用程序中,以实现更为复杂的功能需求。
需要注意的是,在编写自己的 Proxy 组件之前,需要了解 HTTP 协议和 TCP/IP 基本知识。同时还需要熟悉 Golang 的基本语法、并发编程和网络编程等知识。在实际应用中,还需要考虑代理的负载均衡、安全性、缓存策略等问题。
九,Kubectl命令行操作
使用 Golang 可以编写命令行工具来操作 Kubernetes 集群,其中可以使用 kubectl 命令行工具的 Go 库来实现。
以下是 Golang 实现 Kubectl 命令行操作的主要步骤:
- 安装 kubernetes/client-go 包
在 Golang 环境中安装 kubernetes/client-go 包,该包提供了访问 Kubernetes API Server 的客户端库。
go get k8s.io/client-go/...
- 使用 kubectl Go 库实现命令行操作
使用 kubectl Go 库来实现命令行操作。例如,下面的代码片段演示如何使用 kubectl Go 库列出所有 Pod,并输出它们的名称和状态:
package mainimport ("context""fmt""k8s.io/apimachinery/pkg/api/errors"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/clientcmd"
)func main() {config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")if err != nil {panic(err.Error())}clientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err.Error())}pods, err := clientset.CoreV1().Pods("").List(context.Background(), metav1.ListOptions{})if errors.IsNotFound(err) {fmt.Printf("No pods found in the cluster\n")} else if statusError, isStatus := err.(*errors.StatusError); isStatus {fmt.Printf("Error getting pods: %v\n", statusError.ErrStatus.Message)} else if err != nil {panic(err.Error())} else {fmt.Printf("Listing all pods in the cluster:\n")for _, pod := range pods.Items {fmt.Printf(" %s (%s)\n", pod.GetName(), pod.Status.Phase)}}
}
以上代码演示了如何使用 Golang 代码操作 Kubernetes 集群,其中使用 kubectl Go 库来列出所有 Pod 的名称和状态。
十,metrics server 监控node和pod
Metrics Server 是 Kubernetes 集群的一个组件,用于收集和暴露各种资源的监控指标。使用 Golang 可以编写 Metrics Server 的客户端程序,来实现对 Node 和 Pod 的监控。
以下是 Golang 实现 Metrics Server 客户端程序的主要步骤:
- 安装 k8s.io/client-go 包
在 Golang 环境中安装 k8s.io/client-go 包,该包提供了访问 Kubernetes API Server 的客户端库。
go get k8s.io/client-go/...
- 使用 Heapster Metrics API 获取监控数据
通过访问 Heapster Metrics API 来获取 Node 和 Pod 的监控数据。例如,下面的代码片段演示如何获取 Node 列表和 Pod 列表,并输出其 CPU 和内存使用情况:
package mainimport ("flag""fmt""time""k8s.io/apimachinery/pkg/api/resource"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/client-go/kubernetes""k8s.io/client-go/rest"
)func main() {var kubeconfig stringflag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig file")flag.Parse()// 初始化 Kubernetes REST Clientconfig, err := clientcmd.BuildConfigFromFlags("", kubeconfig)if err != nil {panic(err.Error())}clientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err.Error())}// 获取所有节点列表并输出 CPU 和内存使用情况nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{})if err != nil {panic(err.Error())}for _, node := range nodes.Items {nodeName := node.GetName()metricsClient := clientset.MetricsV1beta1().NodeMetricses()metrics, err := metricsClient.Get(nodeName, metav1.GetOptions{})if err != nil {panic(err.Error())}cpuUsage := metrics.Usage.Cpu()memoryUsage := metrics.Usage.Memory()fmt.Printf("Node %s: CPU usage=%s, memory usage=%s\n", nodeName, cpuUsage.String(), memoryUsage.String())}// 获取所有 Pod 列表并输出 CPU 和内存使用情况pods, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{})if err != nil {panic(err.Error())}for _, pod := range pods.Items {podName := pod.GetName()namespaceName:=pod.GetNamespace()metricsClient:=clientset.MetricsV1beta1().PodMetricses(namespaceName)metrics,err:=metricsClient.Get(podName,metav1.GetOptions{})if err!=nil{panic(err.Error())}containers:=metrics.Containersfor _,container:=range containers{cpuUsage:=container.Usage.Cpu()memoryUsage:=container.Usage.Memory()fmt.Printf("Pod %s in Namespace %s: Container %s - CPU usage=%s, memory usage=%s\n",podName,namespaceName,container.Name ,cpuUsage.String(),memoryUsage.String())}time.Sleep(10 * time.Second)
}
以上代码演示了如何使用 Golang 代码获取 Node 和 Pod 的监控指标,其中 Heapster Metrics API 在 Kubernetes 1.11 版本后已经被废弃,因此在新版本的 Kubernetes 中需要使用 Metric Server 来获取监控数据。
相关文章:
在CSDN学Golang云原生(Kubernetes基础)
一,k8s集群安装和升级 安装 Golang K8s 集群可以参照以下步骤: 准备环境:需要一组 Linux 服务器,并在每台服务器上安装 Docker 和 Kubernetes 工具。初始化集群:使用 kubeadm 工具初始化一个 Kubernetes 集群。例如&…...

给APK签名—两种方式(flutter android 安装包)
前提:给未签名的apk签名,可以先检查下apk有没有签名 通过命令行查看:打开终端或命令行界面,导入包含APK文件的目录,并执行以下命令: keytool -printcert -jarfile your_app.apk 将 your_app.apk替换为要检查…...

观察者模式、中介者模式和发布订阅模式
观察者模式 定义 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新 观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式…...

PHP-Mysql图书管理系统--【白嫖项目】
强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页phpStudy 设置导数据库后台的管理界面数据库表结构项目目录如图:代码部分:主页的head 配套资源作业: 本系列校训 用免费公开视频&am…...

网络传输层协议:UDP和TCP
背景知识 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -…...

ElementUI Select选择器如何根据value值显示对应的label
修改前效果如图所示,数据值状态应显示为可用,但实际上仅显示了状态码1,并没有显示其对应的状态信息。在排查了数据类型对应关系问题后,并没有产生实质性影响,只好对代码进行了如下修改。 修改前代码: <…...

Kotlin 内联函数语法之let、apply、also、run、with的用法与详解
一、介绍 kotlin的语法千奇百怪,今天我们将介绍项目中频率使用比较高的几个内联函数。 二、什么叫内联函数? 内联函数 的语义很简单:把函数体复制粘贴到函数调用处 。使用起来也毫无困难,用 inline关键字修饰函数即可。 语法&a…...
Swift 中如何判断是push 过来的页面 还是present过来的 页面
在 Swift 中,可以通过检查当前视图控制器的 presentingViewController 属性来判断是通过 push 过来的页面还是 present 过来的页面。 下面是一个示例代码,展示如何判断是通过 push 还是 present 过来的页面: if let presentingViewControll…...

基于K8s环境·使用ArgoCD部署Jenkins和静态Agent节点
今天是「DevOps云学堂」与你共同进步的第 47天 第⑦期DevOps实战训练营 7月15日已开营 实践环境升级基于K8s和ArgoCD 本文节选自第⑦期DevOps训练营 , 对于训练营的同学实践此文档依赖于基础环境配置文档, 运行K8s集群并配置NFS存储。实际上只要有个K8s集…...
874. 模拟行走机器人
874. 模拟行走机器人 机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands : -2 :向左转 90 度-1 :向右转 90 度1 < x < 9 :…...

【Linux】- RPM 与 YUM
RPM 与 YUM 1.1 rpm 包的管理1.2 rpm 包的简单查询指令1.3 rpm 包的其它查询指令:1.4 卸载 rpm 包:2.1 安装 rpm 包3.1 yum3.2 yum 的基本指令3.3 安装指定的 yum 包3.4 yum 应用实例: 1.1 rpm 包的管理 介绍 rpm 用于互联网下载包的打包及安…...
Visual Studio 2015编译器 自动生成 XXX_EXPORTS宏
XXX_EXPORTS宏 XXX_EXPORTS宏是由Visual Studio 2015编译器自动生成的。这个宏用于标识当前项目是一个导出符号的动态链接库(DLL)项目。在使用Visual Studio 2015创建Win32项目时,编译器会自动添加这个宏到项目的预定义宏中。 这个宏的作用…...
HTML5的应用现状与发展前景
HTML5,作为Web技术的核心,已经深深地改变了我们看待和使用Web的方式。它不仅提供了数不尽的新特性和功能,还使得Web设计和开发更加互动、更加直观。这篇文章将探讨HTML5的当前应用现状,以及它的未来发展前景。 HTML5的应用现状 H…...

day44-Spring_AOP
0目录 1.2.3 1.Spring_AOP 实体类: Mapper接口: Service和实现类: 测试1: 运行后: 测试2:无此型号时 测试3:库存不足时 解决方案1:事务声明管理器 测试:…...
selenium IDE 接入jenkins-转载
Selenium-IDE脚本录制,selenium-side-runner自动化测试教程_51CTO博客_selenium ide录制脚本 备忘录...
云计算结合数据科学突破信息泛滥(下)
大家好,本文将继续讨论云计算结合数据科学突破信息泛滥的相关内容,讲述其余三个关键组成部分。 3.数据清理和预处理 收集数据并将其存储在云端之后,下一步是将数据进行转换。因为原始数据经常包含错误、不一致和缺失的值,这些都…...

蓝桥杯单片机第十二届国赛 真题+代码
iic.c /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。 */ #include <STC1…...

MyBatis学习笔记之缓存
文章目录 一级缓存一级缓存失效 二级缓存二级缓存失效二级缓存相关配置 MyBatis集成EhCache 缓存:cache 缓存的作用:通过减少IO的方式,来提高程序的执行效率 mybatis的缓存:将select语句的查询结果放到缓存(内存&…...
小程序 WxValidate.js 再次封装
util.js // 合并验证规则和提示信息 const filterRules (objectItem) > {let rules {}, messages {};for (let key in objectItem) {rules[key] objectItem[key].rulesmessages[key] objectItem[key].message}return { rules, messages } }module.exports {filterRule…...

redis 第三章
目录 1.主从复制 2.哨兵 3.集群 4.总结 1.主从复制 结果: 2.哨兵 3.集群 4.总结 通过集群,redis 解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...