在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 解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
