Docker容器:Docker-Consul 的容器服务更新与发现

目录

前言

一、什么是服务注册与发现

二、 Docker-Consul 概述

1、Consul 概念

2、Consul 提供的一些关键特性

3、Consul 的优缺点

4、传统模式与自动发现注册模式的区别

4.1 传统模式

4.2 自动发现注册模式

5、Consul 核心组件

5.1 Consul-Template组件

5.2 Consul Server组件

5.3 Consul Agent组件

5.4 Registrator组件

6、启动 Consul 默认监听的5个端口

7、zookeeper 和 consul 的区别

三、Docker-Consul 部署

1、部署 Consul 服务器

1.1 安装 Consul 服务

1.2 设置代理,在后台启动 consul 服务端

1.3 查看 Consul 集群信息

1.4 通过 http api 获取集群信息

2、部署 Registrator 服务器

2.1 安装 Gliderlabs/Registrator

2.2 测试服务发现功能是否正常

2.3 验证 nginx 和 apache 服务是否注册到 consul

四、添加 Consul-template 组件

1、准备 template nginx 模板文件

2、编译安装nginx

3、配置 nginx

4、配置并启动 template

5、访问 template-nginx

6、增加一个 nginx 容器节点

7、关闭一个 nginx 容器节点 

五、consul 多节点服务

1、添加一台已有docker环境的服务器到集群中

2、查看集群信息


前言

在当今的微服务架构中,容器化和服务发现已经成为了不可或缺的一部分。Docker作为目前最流行的容器化解决方案之一,而Consul则是一个强大的服务发现工具,它们的结合为构建可靠的、可扩展的应用程序提供了便利

本文旨在探讨如何有效地使用Docker和Consul来实现容器服务的更新与发现。我们将深入研究如何利用这些工具来简化微服务架构中的部署和管理,以及如何确保服务的高可用性和可靠性。通过本文的学习,读者将能够更好地理解如何利用Docker-Consul组合来构建灵活且稳健的容器化应用程序

一、什么是服务注册与发现

服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。

直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。

这里就会有几个问题:

  • 如果需要调用后端服务A-N,就需要配置N个服务的网络位置,配置很麻烦
  • 后端服务的网络位置变化,都需要改变每个调用者的配置

既然有这些问题,那么服务注册与发现就是解决这些问题的:

  • 后端服务A-N可以把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下来,K一般是服务名,V就是IP:PORT
  • 服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了
  • 前端在调用后端服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务
  • 这样的方式就可以解决上面的问题了,前端完全不需要记录这些后端服务的网络位置,前端和后端完全解耦! 

二、 Docker-Consul 概述

1、Consul 概念

  • Consul是google开源的一个使用go语言开发的服务管理软件
  • 支持多数据中心、分布式高可用的、服务发现和配置共享
  • 采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)
  • 服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server 和 client。 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行

两种运行模式 server 和 client:

  • 在client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息
  • 在server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的
  • server-leader是所有server节点的老大,它和其它server节点不同的是,它需要负责同步注册的信息给其它的server节点,同时也要负责各个节点的健康监测

2、Consul 提供的一些关键特性

  • 服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册
  • 健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面
  • Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作
  • 多数据中心:无需复杂的配置,即可支持任意数量的区域
  • 安装consul是用于服务注册,也就是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的相关服务信息,这就是服务注册与发现

3、Consul 的优缺点

优点

  • 灵活性与可移植性: Docker提供了轻量级的容器化解决方案,使得应用程序可以在不同环境中以相同的方式运行,而Consul则为这些容器提供了动态服务发现和配置能力
  • 自动化部署与扩展: 结合Docker和Consul可以实现快速部署和水平扩展,使得新的服务实例可以自动注册并加入到服务发现中
  • 高可用性: Consul具有分布式架构和健康检查机制,能够确保服务的高可用性,并及时发现和替换失效的实例
  • 集成生态系统: Docker和Consul都有丰富的生态系统和社区支持,能够与其他工具和平台(如Kubernetes、Prometheus等)无缝集成

缺点

  • 学习曲线: 对于初学者来说,Docker和Consul的学习曲线可能较为陡峭,特别是对于复杂的部署和管理场景
  • 复杂性: 在大规模部署和管理时,需要考虑到Docker容器和Consul集群的复杂性,需要一定的专业知识和经验来进行有效的管理
  • 性能开销: 使用Consul进行服务发现和配置管理可能会带来一定的性能开销,特别是在大规模部署时需要谨慎评估和优化

综合来看,Docker和Consul的结合为微服务架构提供了强大的基础设施,但在使用过程中需要权衡好其优势和劣势,以便更好地应用于实际场景中

4、传统模式与自动发现注册模式的区别

4.1 传统模式

在传统模式下,应用程序通常需要硬编码或手动配置其依赖的服务的位置和连接信息。这意味着每当服务的位置或连接信息发生变化时,就需要手动更新相关配置。传统模式下,通常会使用静态配置文件或环境变量来指定服务的位置和连接信息

优点:

  • 直观:配置直接可见,易于理解和管理
  • 控制:可以精确控制服务之间的连接和通信

缺点:

  • 维护困难:当服务数量增多或者服务位置频繁变化时,手动维护配置将变得复杂和困难
  • 不灵活:对于动态环境(如云端部署)和快速变化的架构,静态配置显得不够灵活

4.2 自动发现注册模式

自动发现注册模式利用服务发现工具(比如Consul、etcd等)来动态地注册和发现服务实例。应用程序不需要显式地知道服务的位置,而是通过服务发现工具来获取所需服务的实际位置和连接信息。当新的服务实例加入或退出时,服务发现工具会自动更新可用服务的列表

优点:

  • 动态性:适应动态环境和快速变化的架构,能够自动适应服务实例的变化
  • 简化配置:减少了手动配置的工作,提高了系统的灵活性和可维护性

缺点:

  • 学习成本:需要学习和理解服务发现工具的工作原理和使用方法
  • 引入新技术:对于一些传统架构的应用来说,引入服务发现工具可能需要进行较大的改动和调整 

总的来说,自动发现注册模式相对于传统模式更加智能化和高效,能够适应大规模、动态变化的系统环境

5、Consul 核心组件

5.1 Consul-Template组件

Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx

Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等

以下是 Consul-Template 的一些关键概念:

  • 模板文件:模板文件是包含占位符或变量的文件,用于生成最终的配置文件。这些占位符会在运行时由 Consul-Template 替换为实际的数值、

  • Consul 数据源:Consul-Template 从 Consul 服务中获取数据。Consul 是一个用于服务发现、健康检查和动态配置的工具,Consul-Template 可以从 Consul 中读取键值对等数据

  • 模板语法:Consul-Template 使用类似于 Go 语言模板包的语法来定义模板文件中的变量和控制结构。这使得用户能够在模板文件中使用条件语句、循环等控制结构

  • 生成配置文件:Consul-Template 根据模板文件和从 Consul 中获取的数据生成最终的配置文件。这些配置文件可以用于配置各种应用程序或服务

  • 自动更新:Consul-Template 具有自动更新功能,可以监视 Consul 中的数据变化,并在数据发生变化时重新生成配置文件。这样可以确保配置文件始终保持最新状态

总的来说,Consul-Template 可以帮助简化配置管理过程,使得将动态数据注入到配置文件中变得更加灵活和高效

5.2 Consul Server组件

  • 作为注册中心,Consul Server 负责维护服务目录,记录当前可用的服务实例及其位置信息
  • 负责执行健康检查来确保服务的可用性,定期检查服务实例的健康状态,如果某个服务实例出现故障或不可用,Consul会将其标记为不健康,并从服务目录中移除;同时服务实例新增或者恢复,Consul会将其加入到服务目录中
  • 提供了KV存储,用于存储配置信息、应用程序状态等。这个分布式键值存储可以用于共享配置、动态更新应用程序参数等场景
  • 支持事件处理机制,可以发布和订阅各种事件,例如服务状态变更、健康检查结果等

5.3 Consul Agent组件

是一个轻量级的代理程序,用于运行在每个部署了服务的节点上。它负责与Consul集群通信,并执行各种任务,包括服务注册、健康检查、服务发现和处理来自其他节点的RPC请求等

5.4 Registrator组件

是一个服务注册器,它是一个独立的进程,运行在容器编排环境中;它的主要作用是监视运行中的服务实例,并将它们注册到服务发现系统中,例如Consul或etcd。通过这种注册,其他服务可以发现并与这些服务进行通信,而无需事先知道它们的位置或IP地址

6、启动 Consul 默认监听的5个端口

Consul 是一种用于服务发现、配置和管理的工具,它使用了一些默认的端口来实现不同的功能。在启动 Consul 时,默认监听的五个端口如下:

  • 8300:用于内部集群通信的RPC服务端口。这是Consul代理之间进行Raft协议通信所使用的端口。Raft协议用于保证Consul集群中数据的一致性和可靠性

  • 8301:用于成员节点之间的LAN gossip通信的UDP端口。此端口用于Consul代理之间进行局域网(LAN)级别的成员信息交换,例如心跳检测、健康状态更新等

  • 8302:这是用于Serf WAN(广域网)通信的UDP端口。如果您的Consul集群跨越多个数据中心,则节点之间的Serf通信将使用8302端口

  • 8500:这是用于Web UI的端口。Consul提供了一个Web界面,供用户可视化地查看集群中的节点、服务、健康检查等信息。通过访问8500端口,用户可以在浏览器中访问Consul的Web UI

  • 8600:用于DNS查询的DNS接口。Consul提供了一个DNS服务器,使得应用程序可以通过DNS方式来发现服务。这个端口用于处理DNS查询请求。

这些默认端口的详细说明可以帮助您更好地理解Consul在集群中的通信和管理方式。在启动Consul时,确保这些端口没有被其他应用程序占用,以确保Consul能够正常运行并实现所需的功能

7、zookeeper 和 consul 的区别

zookeeper 使用临时节点特性来用于服务发现(当服务断开时,临时节点删除)这种服务发现机制比心跳检测更精致,复杂,但是同样也有一些固有的扩展性问题和增加客户端复杂性,所有的服务端都必须维持同 zookeeper 的活动连接

consul 的服务发现机制:Consul 在集群的每一个节点都运行一个客户端,这些客户端就是 gossip pool(分布式健康检查 分布式健康检查)的一部分,gossip 协议实现在服务宕机发现上很高效,无论服务集群中服务数多少,Consul 可以通过简单的检查服务返回200状态来进行健康检查

区别consulzookeeper
一致性协议cp模型cp模型
健康检查TCP/HTTP/gRPC/CmdKeepAlive
负载均衡策略Fabio-
雪崩保护
自动注销实例不支持支持
访问协议HTTP/DNSTCP
监听支持支持支持
多数据中心支持不支持
跨注册中心同步支持不支持
SpringCloud集成支持不支持
Dubbo集成不支持支持
K8s集成支持不支持

三、Docker-Consul 部署

主机主机名IP 地址需要安装的软件
Consul 服务器consul172.16.12.10docker-ce、consul、consul-template、nginx
Registrator 服务器registrator172.16.12.15doker-ce、registrator、运行nginx和apache容器

(1)关闭所有设备的防火墙和核心防护 

systemctl disable --now  firewalld
setenforce 0

(2)修改两台服务器的主机名,方便区分

[root@localhost ~]#hostnamectl set-hostname consul
[root@localhost ~]#bash      #修改consul服务器主机名[root@localhost ~]#hostnamectl set-hostname registrator
[root@localhost ~]#bash      #修改registrator服务器主机名

1、部署 Consul 服务器

1.1 安装 Consul 服务

[root@consul ~]#mkdir /opt/consul
[root@consul consul]#cd /opt/consul     #需在此路径上传 consul_0.9.2_linux_amd64.zip
[root@consul consul]#unzip consul_0.9.2_linux_amd64.zip
[root@consul consul]#mv consul /usr/local/bin/

1.2 设置代理,在后台启动 consul 服务端

[root@consul consul]#consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=172.16.12.10 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &# -server: 以server身份启动。默认是client
# -bootstrap :用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为 server-leader
# -bootstrap-expect=2 :集群要求的最少server数量,当低于这个数量,集群即失效
# -ui :指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面
# -data-dir :指定数据存储目录
# -bind :指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0
# -client :指定 consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1
# -node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
# -datacenter :指定数据中心名称,默认是dc1
[root@consul consul]#ss -natp | grep consul
#过滤consul的进程,判断consul服务是否启动

1.3 查看 Consul 集群信息

#查看members状态
consul members

#查看集群状态
consul operator raft list-peers

#返回有关当前Consul集群中领导者节点的信息
consul info | grep leader

1.4 通过 http api 获取集群信息

curl 127.0.0.1:8500/v1/status/peers 			#查看集群server成员
curl 127.0.0.1:8500/v1/status/leader			#查看集群 server-leader
curl 127.0.0.1:8500/v1/catalog/services			#注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx			#查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes			#集群节点详细信息

2、部署 Registrator 服务器

2.1 安装 Gliderlabs/Registrator

Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。运行一个 Registrator 容器,开启自动发现服务

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=172.16.12.15 \
consul://172.16.12.10:8500# --net=host :把运行的docker容器设定为host网络模式
# -v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中
# --restart=always :设置在容器退出时总是重启容器
# --ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip
# consul :指定consul服务器的IP和端口

2.2 测试服务发现功能是否正常

#创建并运行容器,测试服务发现功能是否正常
docker run -itd -p:80:80 --name nginx-01 -h nginx01 nginx
docker run -itd -p:81:80 --name nginx-02 -h nginx02 nginx
docker run -itd -p:82:80 --name apache-03 -h apache03 httpd
docker run -itd -p:83:80 --name apache-04 -h apache04 httpd   
#-h:设置容器主机名docker ps -a  #查看当前所有的容器

2.3 验证 nginx 和 apache 服务是否注册到 consul

步骤:

①浏览器中,输入 http://172.16.12.10:8500

②在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务

#在consul服务器使用curl测试连接服务器
curl 127.0.0.1:8500/v1/catalog/services

四、添加 Consul-template 组件

Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx

Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等

1、准备 template nginx 模板文件

在 consul 服务器上操作

#定义nginx upstream一个简单模板,用于配置反向代理时的后端服务器列表
vim /opt/consul/nginx.ctmpl
upstream http_backend {    
#定义了一个名为http_backend的upstream块,它是一个逻辑组,用于将请求转发到后端服务器{{range service "nginx"}}
#这是Go语言的模板语法,它会在每个Nginx服务实例上迭代执行内部的代码块。在Docker环境中,可能有多个Nginx服务实例运行,这个模板会为每个实例生成一行配置server {{.Address}}:{{.Port}};
#定义了每个后端服务器的地址和端口号。.Address和.Port是从服务发现工具(比如Consul)中获取的后端服务的IP地址和端口号{{end}}
}
#将Nginx的请求转发到一组由服务发现工具管理的后端服务器上,这些后端服务器由nginx服务定义,并且它们的地址和端口号会动态地从服务发现工具中获取#定义一个server,监听8000端口,反向代理到upstream
server {listen 8000;server_name localhost 172.16.12.10;access_log /var/log/nginx/dh.com-access.log;  #修改日志路径index index.html index.php;location / {proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Client-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://http_backend;}
}

2、编译安装nginx

在 consul 服务器上操作:

yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
#上传nginx安装包到当前目录下,再解压到/opt/目录下
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j2 && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3、配置 nginx

在 consul 服务器上操作:

#修改nginx主配置文件
vim /usr/local/nginx/conf/nginx.conf
......
http {include       mime.types;include       /usr/local/nginx/conf/vhost/*.conf;     #添加虚拟主机目录default_type  application/octet-stream;
......

#创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
#创建日志文件目录
mkdir /var/log/nginx
#启动nginx
nginx

4、配置并启动 template

在 consul 服务器上操作:

#安装 template 组件,安装包解压后,能直接使用
#上传consul-template安装包到当前目录下
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/

#在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程
consul-template --consul-addr 172.16.12.10:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

#在另外打开一个consul终端查看生成配置文件
cd /usr/local/nginx/conf/vhost/
#切换至虚拟主机目录
ls
#查看生成的配置文件
cat test.conf

5、访问 template-nginx

docker ps   #查看当前正在运行中的容器#在现实生产环境中两个后端nginx容器提供的静态页面内容是一样的,这里为了方便查看轮询效果,采用不同的界面
docker exec -it nginx-01 bash    #进入nginx-01容器内,更改网页文件
echo "this is test01 web" > /usr/share/nginx/html/index.html 
exitdocker exec -it nginx-02 bash    #进入nginx-02容器内,更改网页文件
echo "this is test02 web" > /usr/share/nginx/html/index.html
exit

浏览器访问:http://172.16.12.10:8000/,并不断刷新

6、增加一个 nginx 容器节点

(1)增加一个 nginx 容器节点,测试服务发现及配置更新功能

docker run -itd -p:84:80 --name nginx-03 -h nginx03 nginx#观察 template 服务,会从模板更新/usr/local/nginx/conf/vhost/test.conf 文件内容,并且重载 nginx 服务

(2)查看/usr/local/nginx/conf/vhost/test.conf 文件内容

cat /usr/local/nginx/conf/vhost/test.conf

(3)通过浏览器测试访问:http://172.16.12.10:8000/,并不断刷新

(4)查看三台 nginx 容器日志,请求正常轮询到各个容器节点上

docker logs -f nginx-01
docker logs -f nginx-02
docker logs -f nginx-03

7、关闭一个 nginx 容器节点 

(1)关闭一个 nginx 容器节点

docker stop nginx-01    #关闭nginx-01容器节点

(2)查看/usr/local/nginx/conf/vhost/test.conf 文件内容

cat /usr/local/nginx/conf/vhost/test.conf

(3)浏览器访问:http://172.16.12.10:8000/,并不断刷新

五、consul 多节点服务

1、添加一台已有docker环境的服务器到集群中

(1)拷贝 consul 相关服务文件到新的consul节点

 scp /usr/local/bin/consul 172.16.12.12:/usr/local/bin/

(2) 启动 consul 服务

#添加一台已有docker环境的服务器172.16.12.12/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=172.16.12.12 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 172.16.12.10 &> /var/log/consul.log &#-enable-script-checks=true :设置检查服务为可用
#-datacenter : 数据中心名称
#-join :加入到已有的集群中

2、查看集群信息

两个 consul 服务器节点都能查看

#查看members状态
consul members#查看集群状态
consul operator raft list-peers

web 页面查看集群状态

步骤:

①浏览器中,输入 http://172.16.12.10:8500  或者 http://172.16.12.12:8500

②在 Web 页面中“单击 SERVICES”,然后单击“consurl”,会出现 consul 集群节点信息

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

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

相关文章

深度学习之基于Vgg16卷积神经网络乳腺癌诊断系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于VGG16卷积神经网络的乳腺癌诊断系统项目是一个结合深度学习技术和医学图像处理的创新项目,旨在提高…

代码随想录Day 40|Leetcode|Python|139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 解题思路: 确定dp数组含义…

路飞吃桃递归问题

在写代码之前,补充两个知识点 1.C语言递归的模版 2.递归是怎么工作的 好!话不多说让我们开始吧: 我们知道路飞吃了n天,每次都是吃一半+1,知道最后一天,只有一个桃子了,所以就可以列出式子&…

列转行(spark 与presto语法)

一、Presto 语法 原始数据: 期望数据: 代码: SELECT info, value FROM ( select 张三 as name,18 as age,男 as gender,清华 as schoolunion allselect 李四 as name,18 as age,男 as gender,清华 as school ) as a CROSS JOIN UNNEST(…

Linux实现Flappy bird项目

目录 1、项目介绍 2、功能总结 3、前期准备 3.1 Ncurses库 3.2 信号机制 3.2.1 设置信号响应方式 3.2.2 设置定时器 4、代码实现 4.1 头文件引用及变量、函数定义 4.2 主函数 4.3 curses初始化 4.4 设置定时器 4.5 定时器响应函数 4.6 小鸟控制相关函数 4…

C语言 自定义类型——联合体

目录: 一、联合体是?声明计算内存大小 二、联合体的特点例如 三、联合体大小的计算规则: 四、应用习1习2 一、联合体是? 联合体和结构体差不多,但是其最大的区别在于联合体所有的成员共用一块内存空间。所以联合体也叫共用体。联…

Java_方法引用

方法引用就是把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体。 条件: 1.引用处需要是函数式接口 2.被引用的方法需要已经存在 3.被引用的方法的形参和返回值需要跟抽象方法的形参和返回值保持一致 4.被引用方法的功能需要满足当前的要求 简…

搭建父模块和工具子模块

第一章 项目父模块搭建 1.1 nancal-idsa 作为所有工程的父工程&#xff0c;用于管理项目的所有依赖版本。 1.2 指定 pom 类型模块&#xff0c;删除 src 目录&#xff0c;点击Reload project 1.3 添加依赖 pom.xml <parent> <groupId>org.springframework.…

Python爬虫教程:入门爬取网页数据

1.遵守法律法规 爬虫在获取网页数据时&#xff0c;需要遵守以下几点&#xff0c;以确保不违反法律法规&#xff1a; 不得侵犯网站的知识产权&#xff1a;爬虫不得未经授权&#xff0c;获取和复制网站的内容&#xff0c;这包括文本、图片、音频、视频等。 不得违反网站的使用条…

如何设置ddns动态域名服务实现外网访问

在本地搭建好服务器&#xff0c;部署好web网站或其他应用后&#xff0c;需要在外网访问内网时&#xff0c;如何设置动态域名服务ddns&#xff0c;将主机的内网IP端口映射到外网访问&#xff0c;是我们需要面对的一个重要步骤。 内网发布外网&#xff0c;常见的有两种方案&…

【智能优化算法】金枪鱼群优化(Tuna Swarm Optimization,TSO)

金枪鱼群优化&#xff08;Tuna Swarm Optimization,TSO&#xff09;是期刊“Computational Intelligence and Neuroscience”&#xff08;IF&#xff1a;1.8&#xff09;的2021年智能优化算法 01.引言 金枪鱼群优化&#xff08;Tuna Swarm Optimization,TSO&#xff09;的主要…

【Diffusion实战】训练一个类别引导diffusion模型(Pytorch代码详解)

又学习了一种方法&#xff0c;类别引导diffusion模型&#xff0c;使用mnist数据集&#xff0c;记录一下它的用法吧。 Diffusion实战篇&#xff1a;   【Diffusion实战】训练一个diffusion模型生成S曲线&#xff08;Pytorch代码详解&#xff09;   【Diffusion实战】训练一个…

Rust Course学习(编写测试)

如果友友你的计算机上没有安装Rust&#xff0c;可以直接安装&#xff1a;Rust 程序设计语言 (rust-lang.org)https://www.rust-lang.org/zh-CN/ Introduce 介绍 Testing in Rust involves writing code specifically designed to verify that other code works as expected. It…

2024.5.7

槽函数声明 private slots:void on_ed_textChanged();void on_pushButton_clicked(); }; 槽函数定义 void Widget::on_ed_textChanged()//文本框 {if(ui->ed1->text().length()>5&&ui->ed2->text().length()>5){ui->pushButton->setStyleSh…

Xinstall广告效果监测,助力广告主优化投放策略

在移动互联网时代&#xff0c;APP推广已成为企业营销的重要手段。然而&#xff0c;如何衡量推广效果&#xff0c;了解用户来源&#xff0c;优化投放策略&#xff0c;一直是广告主和开发者面临的难题。这时&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;以…

Docker 安装部署 postgres

Docker 安装部署 postgres 1、拉取 postgres 镜像文件 [rootiZbp19a67kznq0h0rgosuxZ ~]# docker pull postgres:latest latest: Pulling from library/postgres b0a0cf830b12: Pull complete dda3d8fbd5ed: Pull complete 283a477db7bb: Pull complete 91d2729fa4d5: Pul…

RT-DETR-20240507周更说明|更新Inner-IoU、Focal-IoU、Focaler-IoU等数十种IoU计算方式

RT-DETR改进专栏|包含主干、模块、注意力、损失函数等改进 专栏介绍 本专栏包含模块、卷积、检测头、损失等深度学习前沿改进,目前已有改进点70&#xff01;每周更新。 20240507更新说明&#xff1a; ⭐⭐ 更新CIoU、DIoU、MDPIoU、GIoU、EIoU、SIoU、ShapeIou、PowerfulIoU、…

8.MyBatis 操作数据库(进阶)

文章目录 1.动态SQL插入1.1使用注解方式插入数据1.2使用xml方式插入数据1.3何时用注解何时用xml&#xff1f;1.4使用SQL查询中有多个and时&#xff0c;如何自动去除多余and1.4.1方法一&#xff1a;删除and之后的代码如图所示&#xff0c;再次运行1.4.2方法二&#xff1a;加上tr…

书生·浦语大模型实战营之 OpenCompass大模型评测

书生浦语大模型实战营之 OpenCompass &#xff1a;是骡子是马&#xff0c;拉出来溜溜 为什么要研究大模型的评测&#xff1f; 百家争鸣&#xff0c;百花齐放。 首先&#xff0c;研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多…

Linux cmake 初窥【2】

1.开发背景 基于上一篇的基础上&#xff0c;再次升级 2.开发需求 基于 cmake 指定源文件目录可以是多个文件夹&#xff0c;多层目录 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 工程目录如下 顶层脚本 compile.sh 负责执行 cmake 操作&#xff0…