Docker-Consul容器服务更新与发现
前言
Docker Compose 则进一步简化了多个容器应用的编排与管理。另一方面,Consul 作为一款先进的服务发现工具,为分布式和微服务架构提供了可靠的服务注册与发现机制。本文将探讨 Docker Compose 和 Consul 在容器化环境中的协同作用,以及它们如何共同帮助开发人员更高效地构建、部署和管理其应用程序。
Docker Compose相关介绍请参考:
Docker-Compose单机多容器应用编排与管理-CSDN博客
目录
一、概述
1. 服务注册与发现
2. 什么是 consul
3. 服务架构
3.1 传统架构
3.2 consul 架构
4. 关键特性
二、Consul 部署
1. 容器服务更新与发现拓扑图
2. 部署信息
3. consul 服务器
3.1 建立 consul 服务
3.2 查看集群信息
3.3 通过 http api 获取集群信息
4. registrator 服务器
4.1 安装 Gliderlabs/Registrato
4.2 测试服务发现功能是否正常
4.3 验证 http 和 nginx 服务是否注册到 consul
5. consul-template
5.1 准备 template nginx 模板文件
5.2 安装配置 nginx 服务
5.3 配置并启动 template
5.4 访问 template-nginx
5.5 增加一个 nginx 容器节点
6. consul 多节点
6.1 安装 docker
6.2 拷贝 consul 相关服务文件,启动 consul 服务
6.3 查看集群信息
一、概述
1. 服务注册与发现
① 服务注册:在Docker中运行的应用程序可以通过Consul客户端向Consul服务注册自己的信息,包括服务名称、IP地址、端口号等。这样,Consul就会维护一个服务目录,记录着所有可用的服务实例及其位置信息。
② 服务发现:其他Docker容器或应用程序可以通过Consul客户端查询Consul服务注册中心,动态地发现和连接到需要的服务。Consul根据服务名称、标签、健康状态等条件来选择合适的服务实例,实现服务间的通信和协作。
2. 什么是 consul
Consul 是一种开源的服务发现和配置管理工具,由 HashiCorp 开发。它提供了一系列功能,包括服务注册、服务发现、健康检查、KV存储等,旨在简化构建和管理分布式系统的过程。
① 服务注册与发现:Consul 允许服务实例向 Consul 注册其信息,包括服务名称、网络位置(IP地址和端口号)、健康状态等。其他服务或客户端可以通过 Consul 查询服务注册中心,动态地发现和连接到需要的服务,从而实现服务间的通信。
② 健康检查:Consul 可以定期对服务实例进行健康检查,以确保服务的可用性。如果一个服务实例不健康,Consul 会将其标记为不可用,同时通知其他服务实例进行相应的调整,保证系统的稳定性。
③ KV 存储:Consul 提供了一个分布式的键值存储系统,允许用户存储和检索配置信息、应用程序状态等。这个功能对于动态配置和共享状态在分布式系统中是非常有用的。
④ 多数据中心支持:Consul 支持多数据中心部署,可以轻松地在不同地理位置的数据中心中管理和发现服务,提高系统的可用性和容错性。
3. 服务架构
3.1 传统架构
在 upstream 块中,需要指定后端服务器的 IP 地址和端口号,即 ip:port;在proxy_pass指令中,需要指定转发请求的目标;
当需要添加新的后端服务器时,需要修改代理端配置文件,且需要重启服务才可以生效,有一定的局限性。
3.2 consul 架构
后端服务 A-N 可以把当前自己的网络位置注册到服务发现模块,服务发现就以 K-V 的方式记录下来,K 一般是服务名,V 就是 ip:port。服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了。前端在调用后端服务 A-N 的时候,会先询问服务发现模块后端服务的网络位置,然后再调用它们的服务。
4. 关键特性
- 服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册;
- 健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面;
- Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
- 多数据中心:无需复杂的配置,即可支持任意数量的区域。
二、Consul 部署
1. 容器服务更新与发现拓扑图
Consul Template
- Consul Template守护进程是Consul Template工具的一部分,用于监视Consul中的键值存储(KV)中的变化,并根据这些变化来更新本地的配置文件。它可以在后台运行,并定期检查Consul中的数据,以确保生成的配置文件与最新的配置信息保持同步;
- 是一个配置文件模板,可以获取注册中心所有的服务发现,然后将服务发现的名称:端口号转发给 Nginx,并且更新 nginx.conf 文件。
Consul Server
- 作为注册中心,Consul Server 负责维护服务目录,记录当前可用的服务实例及其位置信息;
- 负责执行健康检查来确保服务的可用性,定期检查服务实例的健康状态,如果某个服务实例出现故障或不可用,Consul会将其标记为不健康,并从服务目录中移除;同时服务实例新增或者恢复,Consul会将其加入到服务目录中;
- 提供了KV存储,用于存储配置信息、应用程序状态等。这个分布式键值存储可以用于共享配置、动态更新应用程序参数等场景;
- 支持事件处理机制,可以发布和订阅各种事件,例如服务状态变更、健康检查结果等。
Consul Agent
- 是一个轻量级的代理程序,用于运行在每个部署了服务的节点上。它负责与Consul集群通信,并执行各种任务,包括服务注册、健康检查、服务发现和处理来自其他节点的RPC请求等。
Registrator
- 是一个服务注册器,它是一个独立的进程,运行在容器编排环境中;它的主要作用是监视运行中的服务实例,并将它们注册到服务发现系统中,例如Consul或etcd。通过这种注册,其他服务可以发现并与这些服务进行通信,而无需事先知道它们的位置或IP地址。
2. 部署信息
服务节点 | ip | 安装运行服务 | docker版本 |
consul 服务器 | 192.168.190.107 | 运行consul服务、nginx服务、consul-template守护进程 | 26.0.2 |
registrator 服务器 | 192.168.190.108 | 运行registrator容器、运行nginx容器 | 20.10.17 |
consul 服务器 | 192.168.190.106 | 运行consul服务 | 26.0.2 |
3. consul 服务器
3.1 建立 consul 服务
① 二进制包直接安装
[root@consul ~]# mkdir /opt/consul
[root@consul ~]# cd /opt/consul/
[root@consul consul]# ls
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/
② 设置代理,后台启动 consul 服务端
[root@consul consul]# consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.190.107 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 7694
③ 启动 consul 后默认会监听5个端口
[root@consul consul]# netstat -natp | grep consul
tcp 0 0 192.168.190.107:8300 0.0.0.0:* LISTEN 37870/consul
tcp 0 0 192.168.190.107:8301 0.0.0.0:* LISTEN 37870/consul
tcp 0 0 192.168.190.107:8302 0.0.0.0:* LISTEN 37870/consul
tcp6 0 0 :::8500 :::* LISTEN 37870/consul
tcp6 0 0 :::8600 :::* LISTEN 37870/consul
# 8300:replication、leader farwarding的端口
# 8301:lan cossip的端口
# 8302:wan gossip的端口
# 8500:web ui界面的端口
# 8600:使用dns协议查看节点信息的端口
3.2 查看集群信息
① 查看members状态
[root@consul consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.190.107:8301 alive server 0.9.2 2 dc1
② 查看集群状态
[root@consul consul]# consul operator raft list-peers # 获取Consul集群中Raft协议的节点列表
Node ID Address State Voter RaftProtocol
consul-server01 192.168.190.107:8300 192.168.190.107:8300 leader true 2
[root@consul consul]# consul info | grep leaderleader = trueleader_addr = 192.168.190.107:8300
3.3 通过 http api 获取集群信息
[root@consul consul]# curl 127.0.0.1:8500/v1/status/peers
["192.168.190.107:8300"]
# 查看集群server成员
[root@consul consul]# curl 127.0.0.1:8500/v1/status/leader
"192.168.190.107:8300"
# 集群 server-leader
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[]}
# 注册的所有服务
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/nginx
# 查看 nginx 服务信息
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/nodes
[{"ID":"f17caaee-ff27-b4e8-c592-afcdad3a2e47","Node":"consul-server01","Address":"192.168.190.107","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.190.107","wan":"192.168.190.107"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]
# 集群节点详细信息
4. registrator 服务器
4.1 安装 Gliderlabs/Registrato
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。运行一个 Registrator 容器,开启自动发现服务:
[root@registrator ~]# docker run -d \ # 运行Docker容器并将其设置为后台运行
> --name=registrator \ # 指定名称为"registrator"
> --net=host \ # 使用主机网络模式
> -v /var/run/docker.sock:/tmp/docker.sock \
# 将主机的Docker守护进程的Unix套接字映射到容器内的/tmp/docker.sock,这样Registrator容器就可以与 Docker守护进程通信
> --restart=always \ # 容器遇到错误或意外退出时自动重启
> gliderlabs/registrator:latest \ # 使用镜像gliderlabs/registrator来运行容器,:latest表示使用最新版本的镜像
> --ip=192.168.190.108 \ # 设置Registrator容器的IP地址为192.168.10.13
> consul://192.168.190.107:8500 # 192.168.190.107:8500是Consul的地址和端口
4.2 测试服务发现功能是否正常
[root@registrator ~]# docker run -itd -p:1080:80 --name nginx-01 -h nginx1 nginx
[root@registrator ~]# docker run -itd -p:1081:80 --name nginx-02 -h nginx2 nginx
[root@registrator ~]# docker run -itd -p:1082:80 --name apache-01 -h apache1 httpd
[root@registrator ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3004e92d23e4 httpd "httpd-foreground" 8 seconds ago Up 7 seconds 0.0.0.0:1082->80/tcp, :::1082->80/tcp apache-01
108612e81495 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:1081->80/tcp, :::1081->80/tcp nginx-02
dfbfe87308ed nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:1080->80/tcp, :::1080->80/tcp nginx-01
53166bf2c442 gliderlabs/registrator:latest "/bin/registrator --…" 23 minutes ago Up 23 minutes registrator
# 一个发现服务,两个容器服务
4.3 验证 http 和 nginx 服务是否注册到 consul
[root@consul consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}
5. consul-template
Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。
Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。
5.1 准备 template nginx 模板文件
在consul服务器上操作:
[root@consul consul]# vim /opt/consul/nginx.ctmpl
upstream http_backend {{{range service "nginx"}}server {{.Address}}:{{.Port}};{{end}}
}
# 定义nginx upstream一个模板server {listen 8000;server_name localhost 192.168.190.107;access_log /var/log/nginx/kgc.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;}
}
# 定义一个server,监听8000端口,反向代理到upstream
5.2 安装配置 nginx 服务
在 consul 节点安装:
[root@consul consul]# yum install -y epel-release.noarch
[root@consul consul]# yum install -y nginx
[root@consul consul]# vim /etc/nginx/nginx.conf
http {include vhost/*.conf; # 添加虚拟主机目录创建虚拟主机目录:
[root@consul consul]# cd /etc/nginx/
[root@consul nginx]# mkdir vhost
启动nginx服务:
[root@consul nginx]# systemctl start nginx.service
5.3 配置并启动 template
在 consul 节点操作:
[root@consul opt]# ls
consul-template_0.19.3_linux_amd64.zip # 准备安装包
[root@consul opt]# unzip consul-template_0.19.3_linux_amd64.zip
[root@consul opt]# mv consul-template /usr/local/bin/在前台启动template服务,启动后不要按ctrl+c中止consul-template进程:
consul-template --consul-addr 192.168.190.107:8500 \
--template "/opt/consul/nginx.ctmpl:/etc/nginx/vhost/fqlnginx.conf:/usr/sbin/nginx -s reload" \
--log-level=info另外打开一个终端查看生成配置文件:
[root@consul opt]# cd /etc/nginx/vhost/
[root@consul vhost]# ls
fqlnginx.conf
[root@consul vhost]# cat fqlnginx.conf
upstream http_backend {server 192.168.190.108:1080;server 192.168.190.108:1081;}server {listen 8000;server_name localhost 192.168.190.107;access_log /var/log/nginx/kgc.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;}
}
5.4 访问 template-nginx
在 registrator 节点操作:
[root@registrator ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3004e92d23e4 httpd "httpd-foreground" 15 hours ago Up 15 hours 0.0.0.0:1082->80/tcp, :::1082->80/tcp apache-01
108612e81495 nginx "/docker-entrypoint.…" 15 hours ago Up 15 hours 0.0.0.0:1081->80/tcp, :::1081->80/tcp nginx-02
dfbfe87308ed nginx "/docker-entrypoint.…" 15 hours ago Up 15 hours 0.0.0.0:1080->80/tcp, :::1080->80/tcp nginx-01
53166bf2c442 gliderlabs/registrator:latest "/bin/registrator --…" 15 hours ago Up 15 hours registrator[root@registrator ~]# docker exec -it nginx-01 /bin/bash
root@nginx1:/# echo "this is web1 nginx_01" > /usr/share/nginx/html/index.html
root@nginx1:/# exit
[root@registrator ~]# docker exec -it nginx-02 /bin/bash
root@nginx2:/# echo "this is web2 nginx_02" > /usr/share/nginx/html/index.html
root@nginx2:/# exit
访问 192.168.190.107:8000/ 查看轮询结果:
[root@registrator ~]# curl http://192.168.190.107:8000
this is web1 nginx_01
[root@registrator ~]# curl http://192.168.190.107:8000
this is web2 nginx_02
[root@registrator ~]# curl http://192.168.190.107:8000
this is web1 nginx_01
[root@registrator ~]# curl http://192.168.190.107:8000
this is web2 nginx_02
5.5 增加一个 nginx 容器节点
① 增加一个 nginx 容器节点,测试服务发现及配置更新功能
[root@registrator ~]# docker run -itd -p:1083:80 --name nginx-03 -h nginx3 nginx
# 观察template服务,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf文件内容,并且重载nginx服务
② 查看 cousul 节点 template 更新的配置文件内容
[root@consul vhost]# pwd
/etc/nginx/vhost
[root@consul vhost]# ls
fqlnginx.conf
[root@consul vhost]# cat fqlnginx.conf
upstream http_backend {server 192.168.190.108:1080;server 192.168.190.108:1081;server 192.168.190.108:1083; # 新增了一个nginx服务}
……
③ 访问 192.168.190.107:8000/ 查看轮询结果
[root@registrator ~]# docker exec -it nginx-03 /bin/bash
root@nginx3:/# echo "this is web3 nginx_03" > /usr/share/nginx/html/index.html
root@nginx3:/# exit[root@registrator ~]# curl http://192.168.190.107:8000
this is web1 nginx_01
[root@registrator ~]# curl http://192.168.190.107:8000
this is web2 nginx_02
[root@registrator ~]# curl http://192.168.190.107:8000
this is web3 nginx_03
[root@registrator ~]# curl http://192.168.190.107:8000
this is web2 nginx_02
[root@registrator ~]# curl http://192.168.190.107:8000
this is web3 nginx_03
[root@registrator ~]# curl http://192.168.190.107:8000
this is web1 nginx_01
④ 停用 nginx-01 服务,查看 template 更新的配置文件内容,以及轮询结果
[root@registrator ~]# docker stop nginx-01
nginx-01
[root@registrator ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9814459efac nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:1083->80/tcp, :::1083->80/tcp nginx-03
108612e81495 nginx "/docker-entrypoint.…" 15 hours ago Up 9 minutes 0.0.0.0:1081->80/tcp, :::1081->80/tcp nginx-02
53166bf2c442 gliderlabs/registrator:latest "/bin/registrator --…" 15 hours ago Up 9 minutes registrator[root@consul vhost]# cat fqlnginx.conf
upstream http_backend {server 192.168.190.108:1081;server 192.168.190.108:1083;}
……[root@registrator ~]# curl http://192.168.190.107:8000
this is web2 nginx_02
[root@registrator ~]# curl http://192.168.190.107:8000
this is web3 nginx_03
[root@registrator ~]# curl http://192.168.190.107:8000
this is web2 nginx_02
[root@registrator ~]# curl http://192.168.190.107:8000
this is web3 nginx_03
6. consul 多节点
添加一台 docker 环境的服务器 192.168.190.106/24 加入已有的群集中,实际是为了扩展 consul 集群的规模和容量,以提高系统的可用性和可靠性。
6.1 安装 docker
安装依赖包:
yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云镜像源:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装最新版本:
yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker.service
systemctl enable docker.service
6.2 拷贝 consul 相关服务文件,启动 consul 服务
192.168.190.107:
[root@consul vhost]# scp /usr/local/bin/consul 192.168.190.106:/usr/local/bin/
192.168.190.106:
[root@ha02 ~]# consul agent \
> -server \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.190.106 \ # 指定Consul agent监听的IP地址,用于节点间通信
> -client=0.0.0.0 \
> -node=consul-server02 \ # 指定当前节点的名称为"consul-server02"
> -enable-script-checks=true \
> -datacenter=dc1 \ # 指定Consul集群所属的数据中心名称为"dc1"
> -join 192.168.190.107 &> /var/log/consul.log &
# 加入已知的Consul节点,这里指定加入IP地址为192.168.190.107的节点
[1] 3171
6.3 查看集群信息
查看members状态:
[root@ha02 ~]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.190.107:8301 alive server 0.9.2 2 dc1
consul-server02 192.168.190.106:8301 alive server 0.9.2 2 dc1
查看集群状态:
[root@ha02 ~]# consul operator raft list-peers
Node ID Address State Voter RaftProtocol
consul-server01 192.168.190.107:8300 192.168.190.107:8300 leader true 2
consul-server02 192.168.190.106:8300 192.168.190.106:8300 follower true 2
# 192.168.190.106状态为follower
相关文章:

Docker-Consul容器服务更新与发现
前言 Docker Compose 则进一步简化了多个容器应用的编排与管理。另一方面,Consul 作为一款先进的服务发现工具,为分布式和微服务架构提供了可靠的服务注册与发现机制。本文将探讨 Docker Compose 和 Consul 在容器化环境中的协同作用,以及它…...

练习题(2024/5/6)
1路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], target…...

利用matplotlib和networkx绘制有向图[显示边的权重]
使用Python中的matplotlib和networkx库来绘制一个有向图,并显示边的权重标签。 1. 定义了节点和边:节点是一个包含5个节点的列表,边是一个包含各个边以及它们的权重的列表。 2. 创建了一个有向图对象 G。 3. 向图中添加节点和边。 4. 设置了…...

Springboot+Vue项目-基于Java+MySQL的教学资料管理系统(附源码+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…...

从NoSQL到NewSQL——10年代大数据浪潮下的技术革新
引言 在数字化浪潮的推动下,数据库技术已成为支撑数字经济的坚实基石。腾讯云 TVP《技术指针》联合《明说三人行》特别策划的直播系列——【中国数据库前世今生】,我们将通过五期直播,带您穿越五个十年,深入探讨每个时代的数据库演…...
巴菲特股东大会5万字完整版来了!
北京时间5月4日晚22:15,一年一度的伯克希尔股东大会在美国小镇奥马哈重磅开幕。 在今年的伯克希尔股东大会上,比尔盖茨、苹果CEO蒂姆库克等商界大佬均现身大会现场。 在股东大会上,巴菲特先后谈到了已故老搭档芒格、减持苹果、AI影响、现金储…...
LY/T 1860-2022 非甲醛类热塑性树脂胶合板检测
热塑性树脂胶合板是指以木质单板为原料,以聚乙烯、聚丙烯等非甲醛类热塑性树脂为胶黏剂制备的一种普通胶合板。 LY/T 1860-2022非甲醛类热塑性树脂胶合板测试项目: 测试项目 测试方法 外观 GB/T 9846 尺寸 GB/T 9846 含水率 GB/T 17657 胶合强度…...

信息管理与信息系统就业方向及前景分析
信息管理与信息系统(IMIS)专业的就业方向十分广泛,包含计算机方向、企业信息化管理、数据处理和数据分析等,随着大数据、云计算、人工智能、物联网等技术的兴起,对能够处理复杂信息系统的专业人才需求激增,信息管理与信息系统就业…...

TCP的三次握手过程
TCP是面向连接的、可靠的、基于字节流的传输层通信协议。 TCP是面向连接的协议,所以使用 TCP前必须先建立连接,而建立连接是通过三次握手来进行的。 TCP包头结构 在讲解三次握手的过程之前,我们先来看一下 TCP包的结构: TCP包…...
Microsoft 推出 Phi-3 系列紧凑型语言模型
本心、输入输出、结果 文章目录 Microsoft 推出 Phi-3 系列紧凑型语言模型前言Phi-3 基础参数模型对比突破性训练技术降低人工智能安全风险Microsoft 推出 Phi-3 系列紧凑型语言模型 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你…...
Retrofit库中,Call;Retrofit使用举例;@GET,@PUT区别;
目录 在Retrofit库中,Call Retrofit使用举例 Call> listRepos(@Path("user") String user); Call是什么:...

# 怎么关闭 win10 系统中自带的【文件预览】功能?关闭WIN10【文件预览】功能的方法
怎么关闭 win10 系统中自带的【文件预览】功能?关闭WIN10【文件预览】功能的方法 win10 系统中自带的【文件预览】功能,默认是开启状态的,如果需要关闭它,一步搞定。 1、打开电脑文件浏览器,随便进入有文件的一个文件…...

强化学习玩flappy_bird
强化学习玩flappy_bird(代码解析) 游戏地址:https://flappybird.io/ 该游戏的规则是: 点击屏幕则小鸟立即获得向上速度。 不点击屏幕则小鸟受重力加速度影响逐渐掉落。 小鸟碰到地面会死亡,碰到水管会死亡。&#…...

JavaWeb请求响应概述
目录 一、请求响应流程-简述 二、深入探究 三、DispatcherServlet 四、请求响应流程-详细分析 一、请求响应流程-简述 web应用部署在tomcat服务器中,前端与后端通过http协议进行数据的请求和响应。前端通过http协议向后端发送数据请求,就可以访问到部…...
【IDEA】IDEA常用快捷键
Windows系统 快捷键功能备注CtrlShiftEnter格式化本行,并鼠标跳转到下一行CtrlAltL格式化代码Ctrli快速实现接口方法CtrlShiftU快速实现大小写转换CtrlAlt鼠标左键快速进入方法实现内部CtrlAlt←退回上一步鼠标所在地方CtrlAlt→回到刚才鼠标所在地方Ctrl空格代码智…...

Redission分布式锁 watch dog 看门狗机制
为了避免Redis实现的分布式锁超时,Redisson中引入了watch dog的机制,他可以帮助我们在Redisson实例被关闭前,不断的延长锁的有效期。 自动续租:当一个Redisson客户端实例获取到一个分布式锁时,如果没有指定锁的超时时…...

人脸识别系统架构
目录 1. 系统架构 1.1 采集子系统 1.2 解析子系统 1.3 存储子系统 1.4 比对子系统 1.5 决策子系统 1.6 管理子系统 1.7 应用开放接口 2. 业务流程 2.1 人脸注册 2.2 人脸验证 2.2.1 作用 2.2.2 特点 2.2.3 应用场景 2.3 人脸辨识 2.3.1 作用 2.3.2 特点 2.3.3…...

数塔问题(蛮力算法和动态规划)
题目:如下图是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大,及路径情况。(使用蛮力算法和动态规划算法分别实现) #include…...
启动 Redis 服务和连接到 Redis 服务器
启动 Redis 服务和连接到 Redis 服务器的步骤通常依赖于你的操作系统和 Redis 的安装方式。以下是一些常见的步骤: ### 启动 Redis 服务 对于大多数 Linux 发行版,Redis 服务可以通过以下命令启动: 1. 如果 Redis 是通过包管理器安装的&am…...

我独自升级崛起在哪下载 我独自升级电脑PC端下载教程分享
将于5月8日在全球舞台闪亮登场的动作角色扮演游戏《我独自升级崛起》,灵感源自同名热门动画与网络漫画,承诺为充满激情的游戏玩家群体带来一场集深度探索与广阔体验于一身的奇幻旅程。该游戏以独特的网络武侠世界观为基底,展现了一位普通人踏…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...