在CSDN学Golang云原生(Kubernetes基础)

一,k8s集群安装和升级

安装 Golang K8s 集群可以参照以下步骤:

  1. 准备环境:需要一组 Linux 服务器,并在每台服务器上安装 Docker 和 Kubernetes 工具。
  2. 初始化集群:使用 kubeadm 工具初始化一个 Kubernetes 集群。例如,以下命令会初始化一个名为 mycluster 的集群:
$ kubeadm init --apiserver-advertise-address <master-node-ip> --pod-network-cidr=10.244.0.0/16

其中,<master-node-ip> 是 Kubernetes 主节点的 IP 地址。

  1. 部署网络插件:选择合适的网络插件并将其部署到集群中。例如,使用 Calico 网络插件可通过以下命令进行部署:
$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
  1. 加入工作节点:使用 kubeadm join 命令将工作节点加入集群。例如,以下命令会将某个节点加入到名为 mycluster 的集群中:
$ kubeadm join <master-node-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

其中,<token> 和 <hash> 分别是由主节点生成的 Token 和证书哈希值。

升级 Golang K8s 集群可以参照以下步骤:

  1. 升级控制平面组件:先升级控制平面组件,包括 kube-apiserver、kube-controller-manager 和 kube-scheduler 等。
  2. 升级工作节点组件:再逐一升级工作节点上的组件,包括 kubelet、kube-proxy 和容器运行时等。
  3. 检查升级结果:在升级完成后,需要检查集群中所有节点的状态,并确保它们已经成功升级到指定版本。

注意事项:

  1. 在进行 Golang K8s 集群安装和升级前,需要充分了解 Kubernetes 架构和相关概念,并选择合适的网络插件和存储方案等。
  2. 在使用 kubeadm 初始化集群时需要指定参数并保存相应信息,以便后续加入工作节点或更新控制平面组件时使用。
  3. 在进行 Golang K8s 集群升级时,需要仔细阅读官方文档并按照指导进行操作。建议先在测试环境中进行充分测试并备份数据,以防出现意外情况。

二,flannel网络插件的安装

Flannel 是一个简单和轻量的网络插件,可为 Kubernetes 集群提供基础网络功能。以下是在 Golang 环境中安装 Flannel 网络插件的步骤:

  1. 创建 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
  1. 使用 kubectl 命令将 flannel.yaml 文件中的内容应用到 Kubernetes 集群中:
$ kubectl apply -f flannel.yaml
  1. 等待 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 已经在集群中成功部署并且正在运行。

注意事项:

  1. 在安装 Flannel 之前需要先准备好 Golang 环境,并确保 Kubernetes 集群已经正确初始化。
  2. 在创建 flannel.yaml 文件时,需要根据实际情况修改网络配置和镜像版本等参数。在选择网络插件时应该综合考虑多个因素,例如性能、可靠性和易用性等。
  3. 在部署 Flannel 之后,应该充分测试集群的网络功能,并且及时更新和修复可能出现的问题。

三,CRI与cri-Dockerd

CRI(Container Runtime Interface)是 Kubernetes 官方提供的一套标准化容器运行时接口,旨在为 Kubernetes 集群提供更加灵活和可扩展的容器管理能力。CRI-Dockerd 是 Docker 公司开发的符合 CRI 规范的容器运行时实现。

下面是 Golang 中使用 CRI-Dockerd 的步骤:

  1. 安装 Docker CE,并确保其版本号在 18.06 或以上。
  2. 安装 CRI-Dockerd 运行时。可以通过以下命令来安装:
$ curl -s https://raw.githubusercontent.com/kubernetes-sigs/cri-tools/master/scripts/install-docker.sh | sh
  1. 启动 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 驱动程序。

  1. 启动 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 的步骤:

  1. 安装 CRI 运行时。可以通过以下命令来安装:
$ go get -u k8s.io/kubernetes/cmd/kubelet/cri/remote
  1. 启动 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 指定了容器运行时请求的超时时间。

注意事项:

  1. 在安装和配置 CRI-Dockerd 或 CRI 运行时之前,需要先准备好 Docker CE 和 Kubernetes 集群,并且确保它们都已经正确初始化。
  2. 在选择容器运行时类型和版本号等参数时,应该综合考虑多个因素,例如性能、可靠性和易用性等。
  3. 在部署完成后应该充分测试集群的容器管理功能,并及时更新和修复可能出现的问题。

四,api server 组件

在 Kubernetes 中,API Server 是整个系统的核心组件之一,它为集群内的所有对象提供 RESTful API 接口,并负责管理集群状态、协调各个组件之间的交互和通信等任务。在 Golang 中编写一个自己的 API Server 组件,可以参考以下步骤:

  1. 定义 API 对象

定义需要暴露给用户的 API 对象模型,在 Golang 中使用 struct 来表示。

  1. 实现 RESTful API 接口

使用 net/http 包来实现 RESTful API 接口。可以使用 Gorilla Mux 这样的路由器库来简化路由逻辑。

  1. 实现访问控制

根据具体需求实现访问控制策略,例如基于 RBAC 的权限控制、Token 认证等。

  1. 实现数据存储

根据具体需求选择适当的数据库或存储引擎,并使用相应的 Golang 库来实现数据存储功能。

  1. 编写测试代码

编写单元测试和端到端测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 API Server 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 API Server 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 API Server 组件之前,需要对 Kubernetes 的架构、API Server 的工作原理以及相应的开发规范有一定了解。同时,还需要熟悉 Golang 的基本语法、网络编程知识和 RESTful API 设计原则等。

五,controller manager组件

在 Kubernetes 中,Controller Manager 是负责运行各种控制器的核心组件之一。控制器是 Kubernetes 中实现自动化管理的核心机制,它们可以监视集群中某些资源对象的状态变化,并根据预设的规则对其进行处理。

下面是实现 Golang Controller Manager 组件的主要步骤:

  1. 定义需要管理的资源对象

通过定义 API 对象模型来描述需要管理的资源对象,在 Golang 中使用 struct 来表示。

  1. 编写控制器逻辑

根据具体需求编写相应的控制器逻辑代码,例如 Pod 控制器、Service 控制器等。控制器通常会包含以下基本操作:

  • 监视指定资源对象或事件流
  • 处理资源对象状态变化或事件
  • 执行相关操作(如创建、更新、删除资源)
  1. 实现与 API Server 的交互

使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取或更新相关信息。可以使用 Informer 机制来简化访问和监视 Kubernetes API 资源对象。

  1. 实现错误处理和重试机制

针对网络故障或异常情况进行错误处理和重试机制设计,确保系统稳定性和可靠性。

  1. 编写测试代码

编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 Controller Manager 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 Controller Manager 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 Controller Manager 组件之前,需要对 Kubernetes 的架构、API Server 和控制器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。

六,Scheduler 组件

在 Kubernetes 中,Scheduler 是负责将 Pod 调度到可用的 Node 上运行的组件。Scheduler 通过监视未调度的 Pod,并选择合适的 Node 并将其绑定到该节点上。

下面是实现 Golang Scheduler 组件的主要步骤:

  1. 定义调度器算法

根据具体需求设计和实现调度器算法,例如默认的、权重优先级、抢占式等。

  1. 实现与 API Server 的交互

使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取需要进行调度的 Pod 和可用的 Node 等信息。

  1. 执行策略判断和决策

根据定义好的调度器算法对 Pod 进行策略判断和决策,确定最佳的 Node 并将其绑定到该节点上。同时需要考虑诸如资源约束、Pod 亲和性和反亲和性等因素。

  1. 实现错误处理和重试机制

针对网络故障或异常情况进行错误处理和重试机制设计,确保系统稳定性和可靠性。

  1. 编写测试代码

编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 Scheduler 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 Scheduler 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 Scheduler 组件之前,需要对 Kubernetes 的架构、API Server 和调度器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。

七,Kubelet组件

在 Kubernetes 中,Kubelet 是运行在每个 Node 上的主要组件之一,负责管理该 Node 上的容器和 Pod。Kubelet 会定期从 API Server 获取需要在该 Node 上运行的 Pod,并通过容器化技术(如 Docker)启动和停止这些容器。

下面是实现 Golang Kubelet 组件的主要步骤:

  1. 实现与 API Server 的交互

使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取需要在该 Node 上运行的 Pod 和相关信息等。

  1. 管理本地容器

使用 Docker 或其他容器化技术,启动和停止 Pod 中定义的各个容器。同时需要考虑诸如网络连接、存储卷、资源限制等问题。

  1. 实现健康检查机制

针对每个 Pod 和其内部的每个容器,实现健康检查机制以确保它们正常运行。如果发现某个容器或整个 Pod 失效,则应及时采取相应措施进行修复或重建。

  1. 实现资源监测和调节机制

通过监测节点上各个进程和资源利用情况,自动调节 CPU、内存、网络带宽等资源分配策略,并定期汇报给集群中心。

  1. 编写测试代码

编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 Kubelet 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 Kubelet 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 Kubelet 组件之前,需要对 Kubernetes 的架构、API Server 和调度器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。

八,proxy组件

在计算机网络中,代理(Proxy)是一种网络服务,它充当客户端和服务器之间的中介。Golang 语言可以轻松实现一个基于 HTTP 协议的代理组件。下面是实现 Golang Proxy 组件的主要步骤:

  1. 创建监听 Socket

使用 Go 标准库 net 监听指定端口上的 TCP 连接。

  1. 处理连接请求

接收客户端发来的连接请求,并将其封装成 HttpRequest 对象,读取其中的 URL 和 Headers 等信息。

  1. 判断是否需要代理

根据 HttpRequest 中请求头部(如 User-Agent、Host)等信息判断该请求是否需要通过代理进行转发。

  1. 向目标服务器发送请求

如果需要代理,则将 HttpRequest 中的数据转发给目标服务器,并将返回结果封装成 HttpResponse 对象。

  1. 返回结果给客户端

将目标服务器返回的 HttpResponse 对象传输回到原始客户端。

  1. 处理异常情况

处理诸如连接超时、HTTP 错误码、非法 URL、内存泄漏等异常情况,保证代理组件稳定运行。

  1. 集成到应用中

将自己编写的 Proxy 组件集成到 Web 应用程序中,以实现更为复杂的功能需求。

需要注意的是,在编写自己的 Proxy 组件之前,需要了解 HTTP 协议和 TCP/IP 基本知识。同时还需要熟悉 Golang 的基本语法、并发编程和网络编程等知识。在实际应用中,还需要考虑代理的负载均衡、安全性、缓存策略等问题。

九,Kubectl命令行操作

使用 Golang 可以编写命令行工具来操作 Kubernetes 集群,其中可以使用 kubectl 命令行工具的 Go 库来实现。

以下是 Golang 实现 Kubectl 命令行操作的主要步骤:

  1. 安装 kubernetes/client-go 包

在 Golang 环境中安装 kubernetes/client-go 包,该包提供了访问 Kubernetes API Server 的客户端库。

go get k8s.io/client-go/...
  1. 使用 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 客户端程序的主要步骤:

  1. 安装 k8s.io/client-go 包

在 Golang 环境中安装 k8s.io/client-go 包,该包提供了访问 Kubernetes API Server 的客户端库。

go get k8s.io/client-go/...
  1. 使用 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 来获取监控数据。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万恶的Eclipse的使用

恨啊&#xff01;公司用eclipse&#xff0c;这种千年老古董又被翻出来了&#xff0c;我的idea&#xff0c;我的宝&#xff0c;我想你&#xff01; 下面是总结的各种eclipse的使用技巧&#xff1a; 让eclipse像idea一样使用 .sout

Api接口出现Required request body is missing的解决方法

目录 1.问题所示2.原理分析3.解决方法1.问题所示 在使用PostMan 测试接口的时候,出现如下问题: {"code": 400,"success": false,"data": {},"msg":

性能优化-webpack配置gzip

3步搞定&#xff0c;实测1.3Mjs压缩到363k&#xff0c;体积减少70% 1.装包 yarn add compression-webpack-plugin --dev 2.配置webpack 打开config/webpack.config.js 1&#xff09;在 module.exports 导出函数前面引入插件 // gzip插件 const CompressionPlugin require(&qu…

网络安全进阶学习第七课——文件包含漏洞

文章目录 一、文件包含概念二、文件包含漏洞原理三、文件包含分类文件包含分为两种&#xff1a; 四、与文件包含相关的配置文件&#xff1a;&#xff08;php.ini文件&#xff09;五、与文件包含有关的函数1、include()2、include_once()3、require()4、require_once() 六、文件…

iTOP-STM32MP157开发板Linux Misc驱动-编译驱动程序

这里我们以 stm32mp157 开发板为例&#xff0c;将杂项设备驱动编译成模块&#xff0c;请参考本手册第三十七章 Linux 内核模块。我们将 misc.c 文件拷贝到 Ubuntu 的/home/nfs/03 目录下。将上次编译 helloworld 的 Makefile 文 件拷贝到 misc.c 同级目录下&#xff0c;修改 …

解决Unable to load authentication plugin ‘caching_sha2_password‘

连接Mysql8时报错&#xff1a; java.sql.SQLException: Unable to load authentication plugin caching_sha2_password.原因 不同版本的认证插件不同造成的 8版本前是&#xff1a;default_authentication_pluginmysql_native_password 8版本后是&#xff1a;default_authenti…

Postman抓包教程

目录 什么是抓包&#xff1f; 如何使用 Postman 进行抓包 查看历史抓包数据 使用抓包数据进行接口测试和开发 抓包技巧和注意事项 什么是抓包&#xff1f; 在计算机网络中&#xff0c;抓包是指捕获网络流量的过程。抓包工具可以截获进出计算机网络的数据流&#xff0c;并将…

Python numpy库的应用、matplotlib绘图、opencv的应用

numpy import numpy as npl1 [1, 2, 3, 4, 5]# array():将列表同构成一个numpy的数组 l2 np.array(l1) print(type(l2)) print(l2) # ndim : 返回数组的轴数&#xff08;维度数&#xff09; # shape&#xff1a;返回数组的形状&#xff0c;用元组表示&#xff1b;元组的元素…

SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化

Sentinel数据持久化 前面介绍Sentinel的流控、熔断降级等功能&#xff0c;同时Sentinel应用也在面临着一个问题&#xff1a;我们在Sentinel后台管理界面中配置了一堆流控、降级规则&#xff0c;但是Sentinel一重启&#xff0c;这些规则全部消失了。那么我们就要考虑Sentinel的持…

1、传统锁回顾(Jvm本地锁,MySQL悲观锁、乐观锁)

目录 1.1 从减库存聊起1.2 环境准备1.3 简单实现减库存1.4 演示超卖现象1.5 jvm锁1.6 三种情况导致Jvm本地锁失效1、多例模式下&#xff0c;Jvm本地锁失效2、Spring的事务导致Jvm本地锁失效3、集群部署导致Jvm本地锁失效 1.7 mysql锁演示1.7.1、一个sql1.7.2、悲观锁1.7.3、乐观…

深度学习:常用优化器Optimizer简介

深度学习&#xff1a;常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降&#xff0c;但往往深度学习的训练集规模很大&#xff0c;计算整个训练集的梯度需要很大…

集睿致远推出CS5466多功能拓展坞方案:支持DP1.4、HDMI2.1视频8K输出

ASL新推出的 CS5466是一款Type-C/DP1.4转HDMI2.1的显示协议转换芯片,&#xff0c;它通过类型C/显示端口链路接收视频和音 频流&#xff0c;并转换为支持TMDS或FRL输出信令。DP接收器支持81.Gbp s链路速率。HDMI输出端口可以作为TMDS或FRL发射机工作。FRL发射机符合HDMI 2.1规范…

AVFoudation - 音频测量

文章目录 关于 metering使用关于 metering AVAudioPlayer 和 AVAudioRecorder 都有 metering 相关方法,用于音频测量 /* metering */@property(getter=isMeteringEnabled) BOOL meteringEnabled; /* turns level metering on or off. default is off. */ - (void)updateMet…

OpenCvSharp (C# OpenCV) 二维码畸变矫正--基于透视变换(附源码)

导读 本文主要介绍如何使用OpenCvSharp中的透视变换来实现二维码的畸变矫正。 由于CSDN文章中贴二维码会导致显示失败,大家可以直接点下面链接查看图片: C# OpenCV实现二维码畸变矫正--基于透视变换 (详细步骤 + 代码) 实现步骤 讲解实现步骤之前先看下效果(左边是原图,右边…

类型转换运算符

当我们想要将自定义类的对象转换为目标类型时&#xff0c;我们可以通过重载类型转换运算符&#xff08;conversion operator&#xff09;来实现。 以下是一个示例代码&#xff0c;展示了如何在 C 中定义一个自定义类&#xff0c;并重载类型转换运算符将对象转换为目标类型&…

菜鸡shader:L13 渐隐渐显的UV动画

文章目录 SD部分Shader代码部分 呃呃&#xff0c;这是目前我学习庄懂AP01课程的最后一节了&#xff0c;我看了一下21集之后的内容是关于LightingMap&#xff0c;目前感觉还用不到&#xff0c;加上之前参与过一个项目里面也有用到LightingMap&#xff0c;也算了解过&#xff0c;…

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后&#xff0c;注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机&#xff0c;使用BeanFactoryPostProcessor进行验证&#xff0c;以及在加载Bean之前进…

NISP含金量?NISP真的有必要考么?NISP好考吗?NISP二级为什么那么贵?

NISP证书简述 NISP证书三个级别&#xff0c;分别是&#xff1a;一级、二级、三级&#xff08;专项&#xff09; 证书。其每一项资格证书都有不同的优点&#xff0c;但是优点各有 相同&#xff0c;而且拥有NISP二级证书可以免考更换CISP资格证书&#xff0c;那么证书含金量如何下…

Java实现二叉树前序遍历

在 Java 中&#xff0c;可以通过递归或使用栈来实现二叉树的前序遍历。下面分别给出这两种方法的实现示例&#xff1a; 递归实现前序遍历&#xff1a; class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val val;this.left null;this.right …

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员&#xff0c;要先学会使用&#xff0c;再探究其内部原理。 链表的数据结构&#xff1a; struct list_head {struct list_head *next, *prev; };还有一种&#xff1a;struct h…