当前位置: 首页 > news >正文

【K8S系列】深入解析k8s网络插件—Canal

序言

做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记论点
  • 蓝色:用来标记论点

在现代容器化应用程序的世界中,容器编排平台Kubernetes已经成为标准。Kubernetes是一个分布式系统,为了支持复杂的应用和微服务架构,网络是Kubernetes集群中不可或缺的一部分。

能够管理和编排容器化应用程序,其中,监控是一个非常重要的方面,可以帮助用户了解集群的健康状态、性能和可用性。

在本文中,将详细介绍Kubernetes网络插件中的【Canal】插件。

希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流

 专栏介绍

这是这篇文章所在的专栏,欢迎订阅:【深入解析k8s】专栏

简单介绍一下这个专栏要做的事:

  • 主要是深入解析每个知识点,帮助大家完全掌握k8s,以下是已更新的章节
  • 这是专栏介绍文章地址:【深入解析K8S专栏介绍】

1 基础介绍 

在Kubernetes中,网络插件也称为容器网络接口(Container Network Interface,CNI)插件,用于实现容器之间的通信和网络连接。以下是一些常见的Kubernetes网络插件:

  1. Flannel:Flannel是一个流行的CNI插件,它使用虚拟网络覆盖技术(overlay network)来连接不同节点上的容器。Flannel支持多种后端驱动,如VXLAN、UDP、Host-GW等。

  2. Calico:Calico是一个开源的网络和安全解决方案,它使用BGP协议来实现容器之间的路由。Calico支持灵活的网络策略和安全规则,可用于大规模部署。

  3. Weave Net:Weave Net是一个轻量级的CNI插件,通过创建虚拟网络设备和网络代理来连接不同节点上的容器。Weave Net支持overlay模式和直连模式,具有灵活性。

  4. Cilium:Cilium是面向Kubernetes的高性能网络和安全解决方案,利用eBPF(Extended Berkeley Packet Filter)技术来提供快速的容器间通信和网络策略实施。

  5. Canal:Canal是一个综合性的CNI插件,结合了Calico和Flannel的功能。它可以使用Flannel提供overlay网络,同时使用Calico的网络策略和安全性功能。

  6. Antrea:Antrea是一个基于Open vSwitch的CNI插件,专为Kubernetes网络和安全性而设计。它提供了高性能的网络连接和网络策略功能。

  7. kube-router:kube-router是一个开源的CNI插件,它结合了网络和服务代理功能。它支持BGP和IPIP协议,并具有负载均衡的特性。

这些是Kubernetes网络插件中的一些常见选项,每个插件都有其特定的优势和适用场景。选择合适的网络插件取决于你的需求、网络拓扑和性能要求等因素。

同时,Kubernetes社区也在不断发展和推出新的网络插件,以满足不断变化的需求。

2 Canal 介绍

2.1 概念介绍

Canal是一个基于MySQL协议的网络插件,它可以将MySQL数据库的binlog事件同步到Kubernetes集群中的其他资源,如Pod、Service等。

这意味着,通过Canal,我们可以实现MySQL数据库与Kubernetes集群的无缝集成。

Canal的核心概念主要包括以下几个方面:

  1. 数据流:Canal的核心是数据的流动。它通过监听MySQL数据库的binlog事件,将这些事件转换为Kubernetes可以理解的数据格式,然后将这些数据发送到指定的Kubernetes资源。

  2. 事件转换:Canal提供了一套完整的事件转换规则,可以将MySQL的binlog事件转换为Kubernetes的资源对象。这样,我们就可以通过Kubernetes API来管理和操作这些资源。

  3. 数据持久化:为了确保数据的完整性和一致性,Canal提供了数据持久化功能。它会将接收到的数据存储在本地,当需要时,可以从本地读取数据,或者将数据写入到MySQL数据库。

下面是 Canal 的其他介绍:

  1. 网络功能:Canal 可以为 Kubernetes 集群提供网络功能,包括网络互联、网络隔离和路由等。它实现了一个软件定义网络(SDN)解决方案,通过创建虚拟网络和网络策略,使得容器和 Pod 可以相互通信,并能与集群外的网络进行连接。

  2. 网络隔离:Canal 具备强大的网络隔离能力,可以将 Kubernetes 集群中的不同命名空间或不同 Pod 组进行隔离,防止它们之间的通信。这种隔离能力可以帮助用户实现多租户环境下的安全和性能隔离。

  3. 网络路由:Canal 可以为 Kubernetes 集群提供灵活的网络路由功能。它支持基于 IP 地址和端口的负载均衡,可以根据用户定义的规则将流量引导到不同的 Pod 或服务上,从而实现高可用和负载均衡。

  4. 环境适应性:Canal 可以适应不同的网络环境,包括云环境和本地环境。它支持多种网络模型,如虚拟局域网(VLAN)、VXLAN、Overlay 等,并且可以与各种网络设备和云服务提供商进行集成。

  5. 容器网络接入:Canal 可以为容器提供网络接入能力,使得容器可以通过网络与其他容器或外部服务进行通信。它支持不同的网络协议和技术,如 IP、IPv6、VLAN、VXLAN 和 UDP/TCP 等。

  6. 插件生态系统:Canal 是一个开放的插件化架构,它提供了丰富的插件生态系统。用户可以根据自己的需求选择适合的插件,如网络策略插件、负载均衡插件和日志插件等,以满足不同的使用场景。

2.2 实现原理

Canal的实现原理是基于MySQL主从复制原理的。Canal模拟MySQL slave的交互协议,伪装自己为MySQL slave,向MySQL master发送dump协议;

MySQL master收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。

Canal的工作流程如下:

  1. 客户端(Canal Server)向Canal Server集群发送请求,建立与Canal Server集群的连接。
  2. Canal Server集群中的其中一个节点接收到请求后,返回一个响应,表示已经成功连接到Canal Server集群。
  3. 客户端向Canal Server集群中的每个节点发送请求,建立与每个节点的连接。
  4. 当客户端发送start命令时,Canal Server集群中的每个节点都会向MySQL数据库发送dump命令,并将接收到的二进制日志事件发送给客户端。
  5. 客户端解析接收到的二进制日志事件,并将其转换为JSON格式的数据。
  6. 客户端将转换后的数据发送到指定的存储目的地,如MySQL、Kafka、Elastic Search等。

2.3 架构介绍

Canal 是一个基于 Calico 和 Flannel 项目的网络插件,用于实现容器网络功能和隔离。下面是对 Canal 架构的详细介绍

  1. 控制平面
  2. 数据平面
  3. 组件交互

控制平面(Control Plane):

  • etcd 存储:Canal 使用 etcd 作为分布式键值存储,用于存储网络状态和配置信息。etcd 提供了高可用性和一致性,确保集群的网络状态和配置的可靠性。
  • Flannel 控制器Canal 使用 Flannel 控制器作为控制平面的一部分。Flannel 控制器负责监听 Kubernetes API Server 的事件,如 Pod 的创建、删除和更新等,以及网络策略的变更。它会将这些事件转化为网络配置的更新,并将其写入 etcd 存储。
  • 网络策略控制器Canal 控制平面还包括网络策略控制器,用于处理网络策略的配置和更新。它监听 Kubernetes API Server 上的网络策略事件,并将其转化为网络策略的配置信息,并将其写入 etcd 存储。

数据平面(Data Plane)

  • 网络代理:Canal 在每个节点上运行一个或多个网络代理组件,负责处理网络连接和数据转发。这些网络代理组件通过监听 etcd 中的网络状态和配置信息,并根据其进行相应的操作。网络代理组件负责管理节点上的网络接口和路由表,以及处理网络流量的路由和转发。
  • Calico 数据平面:Canal 使用 Calico 的数据平面来提供高性能的网络转发和安全特性。Calico 数据平面包括路由器(Route Reflector)、BGP Peering、路由表和 ACL(访问控制列表)等组件,用于实现 IP 地址管理和网络流量转发。

组件交互

  • 控制平面和数据平面之间通过 etcd 存储进行通信。控制平面将网络配置和状态信息写入 etcd,数据平面监听 etcd 上的变更事件并根据变更进行相应的操作。
  • 控制平面和 Kubernetes API Server 之间通过 API 直接通信,以获取 Pod 和网络策略的信息,并监听相关事件。

通过以上架构,Canal 实现了对 Kubernetes 集群中 Pod 的网络功能和隔离。它使用 Calico 的高性能数据平面,提供了强大的网络转发和安全特性。

同时,通过与 Flannel 控制器和网络策略控制器的集成,Canal 可以实现 IP 地址管理、网络策略配置和动态更新等功能。

这样,Canal 能够满足容器化应用场景中的网络需求,并提供可靠的容器网络解决方案。

2.4 使用场景

Canal 它提供了网络功能和策略的管理能力。

它适用于各种场景,包括多租户环境下的网络隔离、高可用和负载均衡的网络路由、容器网络接入等。

无论是在云环境还是本地环境,Canal 都可以提供可靠的网络解决方案。 

2.5 优缺点

当谈论 Canal 的优缺点时,需要注意到它是一个特定的网络插件,因此其优缺点相对于其他网络插件来说。

下面是 Canal 的优缺点的详细介绍:

优点:

  1. 网络功能全面:Canal 提供了广泛的网络功能,包括网络互联、网络隔离和路由等。它支持多种网络模型和协议,并且具备灵活的网络路由能力,可以根据用户定义的规则进行流量管理。这使得用户能够根据自己的需求构建复杂的网络拓扑和策略。

  2. 多租户支持:Canal 具备强大的网络隔离能力,可以为多租户环境提供安全和性能隔离。它可以将不同的命名空间或 Pod 组进行隔离,防止它们之间的通信,从而保护租户的数据和应用。

  3. 环境适应性:Canal 可以适应不同的网络环境,包括云环境和本地环境。它支持多种网络模型和技术,并且可以与各种网络设备和云服务提供商进行集成。这使得用户能够在不同的部署环境中使用 Canal,而无需更改网络架构。

  4. 插件生态系统:Canal 提供了丰富的插件生态系统,用户可以根据自己的需求选择适合的插件。这使得用户能够扩展 Canal 的功能,包括网络策略、负载均衡和日志等方面。

缺点:

  1. 学习曲线:由于 Canal 是一个相对复杂的网络插件,使用它可能需要一定的学习和理解成本。用户需要熟悉 Canal 的概念、配置和管理方法,以确保正确地部署和使用它。

  2. 配置复杂性:Canal 的配置可能相对复杂,特别是在需要实现高级网络功能和策略时。用户可能需要深入了解 Canal 的配置选项和参数,以确保正确地配置和管理网络。

  3. 性能开销:与其他网络插件一样,Canal 也会引入一定的性能开销。特别是在处理大量的网络流量和复杂的网络路由时,性能可能会受到一定的影响。用户需要评估和优化网络配置,以满足应用的性能需求。

需要注意的是,Canal 的优缺点并不是绝对的,它们可能会因用户需求、部署环境以及其他因素而有所变化。

在选择和使用 Canal 之前,建议仔细评估其优缺点,并与其他网络插件进行比较,以选择最适合自己的解决方案。

3 安装使用

3.1 安装步骤

 1 准备 Kubernetes 集群:

首先,确保您拥有一个运行中的 Kubernetes 集群。可以是本地集群,也可以是云提供商的托管集群。

2 下载 Canal:

从官方 Canal GitHub 仓库(https://github.com/projectcalico/canal)下载最新版本的 Canal。

3 部署 Canal

使用 kubectl 或其他 Kubernetes 部署工具将 Canal 部署到 Kubernetes 集群中。可以使用以下命令将 Canal 部署为一个 Kubernetes Deployment:

kubectl apply -f canal.yaml

其中,canal.yaml 是包含 Canal 部署配置的 YAML 文件。您可以根据需要调整配置文件中的参数。

4 等待部署完成

等待 Canal 在 Kubernetes 集群中完成部署。您可以使用以下命令来检查 Pod 的状态:

kubectl get pods -n kube-system

 确保 Canal 相关的 Pod 正常运行并处于就绪状态。 

5 验证网络插件:

一旦 Canal 部署完成,您可以验证网络插件是否正常工作。您可以创建一个简单的测试 Pod,并尝试从其他 Pod 或集群外部访问它。如果网络通信正常,说明 Canal 已成功安装和配置。

6 配置网络策略(可选):

根据您的需求,您可以配置 Canal 的网络策略。网络策略可以定义允许或禁止 Pod 之间 的通信规则,以实现更严格的网络隔离和安全性。您可以编写网络策略 YAML 文件,并使用 kubectl apply 命令将其应用到 Kubernetes 集群中。

3.2 验证网络插件安装成功

要验证网络插件(如Canal)是否成功安装并正常工作,可以执行以下操作:

1 检查插件的 运行状态:

使用以下命令检查插件相关的 Pod 是否在运行:

kubectl get pods -n kube-system

确保与 Canal 相关的 Pod 处于运行状态,并且 READY 列中的副本数为所需的数量。如果有任何错误或异常,请检查相关 Pod 的日志以获取更多详细信息。

2 创建测试 Pod :

创建一个简单的测试 Pod,以验证与其他 Pod 或集群外部的网络通信。可以使用以下 YAML 文件创建一个简单的 Nginx Pod:

apiVersion: v1
kind: Pod
metadata:name: nginx-test
spec:containers:- name: nginximage: nginx

具体步骤: 

将上述 YAML 文件保存为 `nginx-test.yaml`,然后使用以下命令创建 Pod:

kubectl apply -f nginx-test.yaml

Pod 创建后,您可以使用以下命令检查其状态:

kubectl get pods

确保测试 Pod 处于运行状态并且 READY 列中的副本数为 1。

测试网络连接性 :使用以下命令在测试 Pod 中执行网络连接测试:

kubectl exec -it nginx-test -- curl <目标IP或域名>

将 `<目标IP或域名>` 替换为您要测试的目标 IP 地址或域名。如果网络通信正常,将看到来自目标的响应。

还可以通过在其他 Pod 中执行相同的命令来测试对测试 Pod 的网络连接性。

通过执行上述步骤,就可以验证网络插件的安装是否成功,并确保 Pod 之间的网络通信正常运行。

如果遇到任何问题,可以检查相关的日志、配置和文档,以进一步排查和解决问题。

4 常见问题

在 Canal 的使用过程中,可能会遇到一些常见问题。以下是一些可能出现的问题以及相应的解决方案:

Canal Pod 处于非运行状态或无法启动: 

  • 检查 Kubernetes 集群的网络是否正常,确保网络插件的依赖组件(如 etcd)正常运行。
  • 检查 Canal Pod 的日志以获取更多详细信息,使用以下命令查看日志:
    kubectl logs <canal-pod-name> -n kube-system
  • 确保 Pod 的资源分配(如 CPU、内存)足够满足运行要求。

网络通信受阻或无法访问外部服务:

  • 检查网络策略是否正确配置,确保允许 Pod 之间或与外部服务之间的通信。
  • 检查网络插件的路由规则,确保流量正确转发到目标 Pod 或服务。
  • 确保网络插件的网络隔离功能未阻止所需的网络通信。

Pod 无法获取IP地址或无法通过网络访问:

  • 检查是否存在 IP 地址分配问题,确保 Canal 正确分配 IP 地址给 Pod。
  • 确保节点的网络接口(如 CNI 接口)正常配置并与网络插件兼容。
  • 检查节点的网络配置,确保网络插件能够正确管理 Pod 的网络连接。

升级 Canal 版本后出现问题:

  • 在升级 Canal 版本之前,仔细阅读版本发布说明和文档,了解可能的兼容性问题和配置变更。
  • 检查新版本的配置要求和要点,确保根据需要进行相应的配置更改。
  • 在升级过程中备份和恢复关键数据,以防止数据丢失或不可恢复的损坏。

性能问题或负载过高:

  • 评估集群的资源配置,确保节点具备足够的 CPU、内存和网络带宽。
  • 根据实际负载情况调整 Canal 的配置参数,如并发连接数、连接超时等。
  • 使用性能监控工具(如 Prometheus + Grafana)监测和分析集群的性能指标,找出瓶颈并进行优化。

5 总结

总体而言,Canal 是一个功能强大的网络插件,为 Kubernetes 集群提供了网络功能和容器网络隔离。

它的设计灵活且可扩展,可以满足不同规模和需求的容器化应用场景。

6 投票

 

相关文章:

【K8S系列】深入解析k8s网络插件—Canal

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 在现代容器化应用程序的世界中…...

从单页面应用角度去解决不跳转页面,也能更改浏览器url地址

正常来说不刷新页面&#xff0c;也能更改浏览器url地址的方法有很多&#xff0c;我们在网上搜的话可以看到有pushState、replaceState、popstate等方法&#xff0c;那还有没有其他方法呢&#xff1f; 答案是有的&#xff01; 最近做一个vue商城项目的时候&#xff0c;用户点击支…...

Linux:keepalived + ipvsadm

介绍 Linux&#xff1a;keepalived 双热备份&#xff08;基础备份web&#xff09;_鲍海超-GNUBHCkalitarro的博客-CSDN博客https://blog.csdn.net/w14768855/article/details/132815057?spm1001.2014.3001.5501 环境 一台 centos7 keepalived ipvsadm &#xff08;主…...

Linux基础命令(示例代码 + 解释)

查看目录下文件 ls [-a -l -h] [路径] -a&#xff08;全部&#xff09; -l&#xff08;细节&#xff09; -h&#xff08;大小&#xff09; ls ls / ls -a ls -l ls -h ls -alh ls -l -h -a ls -lah /切换目录 cd [路径] change di…...

巨人互动|Google企业户Google“自动采纳建议”应该如何使用

在数字化时代&#xff0c;Google已经成为了人们获取信息的主要渠道之一。而在使用Google搜索时&#xff0c;你可能会发现下拉框中自动提供的搜索建议。这些搜索建议是基于用户搜索行为和相关数据进行推测&#xff0c;旨在使用户更快速地找到所需信息。而Google还提供了一项名为…...

元宇宙全球市场规模到2030年将达9805亿美元!

元宇宙是一种新兴的概念&#xff0c;它指的是一个虚拟的世界&#xff0c;由人工智能、虚拟现实、区块链等技术构建而成。元宇宙的起源可以追溯到上世纪90年代的虚拟世界“第二人生”&#xff0c;但直到近年来&#xff0c;随着技术的不断发展&#xff0c;它才逐渐成为了人们关注…...

《向量数据库指南》——向量数据库内核面临的技术挑战及应对措施

最近一年&#xff0c;以 ChatGPT、LLaMA 为代表的大语言模型的兴起&#xff0c;将向量数据库的发展推向了新的高度。 向量数据库是一种在机器学习和人工智能领域日益流行的新型数据库&#xff0c;它能够帮助支持基于神经网络而不是关键字的新型搜索引擎。向量数据库不同于传统的…...

API对接中需要注意的事项

API对接是一个复杂的过程&#xff0c;需要对接双方准确地理解和遵循一系列步骤。以下是一些在API对接中需要注意的事项&#xff0c;以及每个步骤的详细解释和可能遇到的问题。 一、API定义和规划 明确API需求&#xff1a;在开始对接前&#xff0c;必须明确API的具体需求和使用场…...

linux 6中4T磁盘识别并分区格式化

存储端划分4T的LUN后&#xff0c;主机端操作如下 1、主机识别&#xff0c;本例中hba卡的端口是host11和host12 [rootdb1 ~]# echo "- - -" > /sys/class/scsi_host/host11/scan [rootdb1 ~]# echo "- - -" > /sys/class/scsi_host/host12/scan …...

WebServer 解析HTTP 响应报文

一、基础API部分&#xff0c;介绍stat、mmap、iovec、writev、va_list 1.1 stat​ 作用&#xff1a;获取文件信息 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>// 获取文件属性&#xff0c;存储在statbuf中 int stat(const char *…...

开利网络参与“大湾区独角兽创投大赛”进行蚓链数字生态项目路演

9月10日&#xff0c;广州市开利网络科技有限公司受邀参与位于广州国际医药港的“大湾区独角兽创投大赛”&#xff0c;进行“蚓链——企业数字化生态”项目的初赛路演。“大湾区独角兽创投大赛”是由中国企业新闻观察网指导&#xff0c;由中国商协会服务工作委员会、广东蚁米孵化…...

前端的8种跨域解决方案

在前端开发中&#xff0c;常见的跨域解决方案有以下8种&#xff1a; JSONP&#xff08;JSON with Padding&#xff09;&#xff1a;利用<script>标签的跨域特性&#xff0c;通过动态创建<script>标签&#xff0c;请求一个带有回调函数的接口&#xff0c;服务器返回…...

Linux知识点 -- 网络编程套接字

Linux知识点 – 网络编程套接字 文章目录 Linux知识点 -- 网络编程套接字一、预备知识1.认识端口号2.套接字3.TCP协议与UDP协议4.网络字节序 二、socket编程接口1.socket常见API2.sockaddr结构 三、UDP套接字编程1.直接打印客户端信息2.执行客户端发来的指令3.多用户聊天4.在wi…...

逆向大漠插件/用VB6.0实现后台鼠标移动和后台鼠标左键点击

自动化设计软件&#xff0c;在一款做门的设计软件CypCut6.3 上实现了自动化勾选了 复选框。一切都是基于后台的。 Private Const GW_CHILD 5 Private Const GW_HWNDFIRST 0 Private Const GW_HWNDNEXT 2 Public Declare Function FindWindow Lib "user32" Alias &…...

重庆OV证书和EV证书有什么区别

SSL数字证书按照保护的域名数量和类型可以分为单域名SSL证书、多域名SSL证书和通配符SSL证书三种&#xff0c;按照验证方式可以将SSL数字证书分为DV基础型SSL证书、OV企业型SSL证书和EV增强型SSL证书三种。今天就随SSL盾小编了解OV证书和EV证书的区别。 1.OV企业型SSL证书由CA…...

uni-app(微信小程序)图片旋转放缩,文字绘制、海报绘制

总结一下&#xff1a; 要进行海报绘制离不开canvas&#xff0c;我们是先进行图片&#xff0c;文字的拖拽、旋转等操作 最后再对canvas进行绘制&#xff0c;完成海报绘制。 背景区域设置为 position: relative&#xff0c;方便图片在当前区域中拖动等处理。添加图片&#xff0…...

Spring Boot 2.x基础教程

Spring Boot 2.x基础教程 一、简介1. Spring Boot 2.x 简介2. Spring Boot 2.x 特点3. Spring Boot 2.x 与 Spring Framework 的关系 二、Spring Boot 2.x 环境搭建1. JDK环境安装与配置2. Maven环境安装与配置3. Spring Boot 2.x 项目创建 三、核心功能1. 配置文件及其加载顺序…...

汽车红外夜视系统行业发展总体概况

汽车红外夜视系统是一种技术&#xff0c;旨在帮助驾驶员在夜间或低光条件下提供更好的视觉能力。它利用红外光谱的特性来检测和显示在正常光线下难以察觉的热能辐射。这使驾驶员能够在夜间或恶劣天气条件下更好地识别和辨别道路上的物体、行人、动物或其他车辆。 汽车红外夜视…...

Java 和 PHP GC 的差异和差异出现的原因

JAVA 的 GC 处理 判断草死掉的两种方式&#xff1a;引用计数和可达性分析 可达性分析对 JAVA 比较好用的原因是 JAVA遵守这面向对象的严格要求&#xff0c;每个变量都被对象包裹&#xff0c;所以每个变量都能通过对象来进行遍历找到&#xff0c;最终判断他们的是否被引用&…...

loguru logger使用

一、基本使用 ①标准使用 from loguru import logger# 在标准输出里面输出一行debug日志 logger.debug("Thats dubug")②设置输出格式 from loguru import loggerlogger.remove(0) # 先删除格式 logger.add(sink./logger.log, format"{time: %Y-%m-%d %H:%M…...

vue-自适应布局-postcss-pxtorem

原理&#xff1a; 比如一个375px设计稿 其中一个320px宽度的元素 如何实现自适应布局呢&#xff1f; 其实可以这样理解&#xff1a; 我们先计算出375屏幕时候320px的大小&#xff0c;在屏幕变化时候&#xff0c;这些元素都会等比例缩放 比如屏幕从375 变为750px时候&#xff0…...

9.12|day 5|day 44 |完全背包| 518. 零钱兑换 II | 377. 组合总和 Ⅳ

● 完全背包 主要是看清01背包和完全背包的区别 //01背包 for(int i 0;i<weight.size();i){ for(int j bagWeight;j>weight[i];j--){dp[j] Math.max(dp[j],dp[j-weight[i]]value[i]); } } //完全背包 for(int i 0;i<weight.size();i){for(int j weight[i];j<…...

C++ 中的原子变量(std::atomic)使用指南

目录 C 中的原子变量&#xff08;std::atomic&#xff09;使用指南基本概念使用方法创建原子变量读取值修改值原子操作 常见应用场景1. 计数器2. 控制标志3. 链表和数据结构 示例代码结论 C 中的原子变量&#xff08;std::atomic&#xff09;使用指南 原子变量&#xff08;std…...

【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏

前言 2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容&#xff0c;但利用三维技术来实现更加逼真的图像效果。 在2.5D游戏中&#xff0c;角色和环境通常是以平面的形式呈现&#xff0c;但可以在垂直方向上移动。这意味着玩家可以在一个相对较薄…...

如何在群晖中,正确配置 docker 的 ipv6 地址

参考 2023年9月12日 https://synocommunity.com/ https://github.com/wangliangliang2/fix_synology_docker_ipv6 https://post.smzdm.com/p/an3np8m7/ 正文 关于这个话题&#xff0c;国内搜索引擎得到的结果出奇的一致&#xff0c;且过时。 &#xff08;看的我脑壳痛&#…...

XSS入门 XSS Challenges

level1(直接注入) <script>alert(xss)</script>level2(双引号闭合标签) 测试 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT>发现<>"被转换&#xff0c;构造新的语句 "><script>alert(/xss/)</…...

李沐《动手学深度学习》torch.cat() 和 torch.stack()的区别及思考

一、问题引出 好久没更新啦&#xff01;最近在学习沐神《动手学深度学习》6.5节池化层的时候&#xff0c;发现沐神在两处相似的地方使用了两种Python拼接函数torch.cat()和torch.stack()&#xff1a; 百思不得其解&#xff0c;于是查阅相关文档之后终于弄清楚了两者之间的区别…...

【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题和这道题类似【算法与数据结构】236、LeetCode二叉树的最近公共祖先&#xff0c;相同的算法也能解…...

bboss 流批一体化框架 与 数据采集 ETL

数据采集 ETL 与 流批一体化框架 特性&#xff1a; 高效、稳定、快速、安全 bboss 是一个基于开源协议 Apache License 发布的开源项目&#xff0c;主要由以下三部分构成&#xff1a; Elasticsearch Highlevel Java Restclient &#xff0c; 一个高性能高兼容性的Elasticsea…...

JVM详细教程

JVM 前言 还在完善中先发布 JVM虚拟机厂家多钟多样&#xff0c;具体实现细节可能不一样&#xff0c;这里主要讲的是虚拟机的规范&#xff0c;以下内容融合了各个平台发布的内容和周志明老师的《深入理解java虚拟机》 JVM概述 如何理解jvm跨平台&#xff1f; 编译成汇编代码…...

外贸网站建设560/百度seo免费推广教程

题目描写叙述 给你一个有N个数的集合S和一个数X&#xff0c;推断是否存在S的一个子集&#xff0c;子集里的数的最小公倍数正好是X。 输入 第一行是数据组数T。 接下来有多组数据&#xff0c;每组数据包括两行&#xff1a; 第一行有2个数N和X&#xff0c;1<N<100000 &…...

北京市住房和建设委员会网站/东莞营销网站建设

http://pengranxiang.iteye.com/blog/848862 首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接。事实上 Tomcat 本身已经提供了 HTTP 服务&#xff0c;该服务默认的端口是 8080&#xff0c;装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序&…...

南昌制作网站的公司吗/网站推广营销

文章目录 一、题目🔸题目描述🔸输入输出🔸样例1二、代码参考作者:KJ.JK🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🍂个人博客首页: KJ.JK 💖系列专栏:华为OD机试(Java&Python&C语言) 一、题目 🔸题目描述 对输入的字符串进…...

凡科做的网站怎么样/北京seo优化推广

方法1&#xff1a;sudo apt-get -f install -f 尝试修正系统依赖损坏处 方法2&#xff1a;修改/etc/apt/sources.list文件&#xff0c;用下面的地址替换原来的官方默认地址 deb cdrom:[Ubuntu 16.04.3 LTS _Xenial Xerus_ - Release amd64 (20170801)]/ xenial main restrict…...

站长seo/哪些店铺适合交换友情链接

css banner不拉伸现在很多网站的Banner图片都是全屏宽度的&#xff0c;这样的网站看起来显得很大气。这种Banner一般都是做一张很大的图片&#xff0c;然后在不同分辨率下都是显示图片的中间部分。实现方法如下&#xff1a;1、首先设置banner的父元素定位为相对定位&#xff0c…...

吐鲁番seo快速排名/超级seo助手

更新 【2020.02.14】 增加了Android11的适配 增加了好友分享和隐私政策 界面更改为蓝色更清新 下载地址&#xff1a;http://www.soutcc.com/mockgps/ 感谢 &#xff20;何生 更新 【2019.11.14】 增加了Android10的适配 修复了判断权限出错的bug 修改了启动后crash的b…...