docker——项目部署
什么是Docker?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或者包装系统。
Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源码托管在Github上,基于go语言并且遵从Apache2.0协议开源。
Docker 为提供了一整套的解决方案,不仅解决了容器化问题,而且解决了分发问题,很快被各大厂商选择变成了云基础设施,厂商围绕 Docker 也开始了生态建设。
什么是虚拟化、容器化?
物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。
虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
容器化:容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例 instances)被分割成几个独立的单元,在内核中行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。docker 是现今容器技术的事实标准。
为什么需要虚拟化、容器化?
其实虚拟化和容器化最主要的目的就是为了资源隔离,随着资源隔离的实现也带来了更大的利益。
- 容器对比虚拟机更轻量,启动更快
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
这是因为docker不需要加载内核了,所以启动更快。 - 资源利用率高
将利用率较低的服务器进行整合,用更少的硬件资源运行更多的业务,降低IT支出和运维管理成本。 - 环境标准化
一次构建,随处执行。 实现执行环境的标准化发布,部署和运维。开发过程中一个常
见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些
bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,
确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类
问题。

docker image
docker images [OPTIONS] [REPOSITORY[:TAG]]
关键参数
- -a:列出本地所有的镜像(含中间印象层、默认情况下过滤掉中间镜像层)
- –digests:显示镜像的摘要信息
- -f:显示满足条件的镜像
- –format:指定返回值的模版文件
- –no-trunc:显示完整的镜像信息
- -q:显示出镜像ID
docker pull
- 拉取出需要的镜像
什么是dockerfile?
dockerfile是一个文本文件,其中包含了一条条的指令,用于构建镜像。
FROM 指定镜像
指定基础镜像,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
语法格式如下:
FROM <image>
FROM <image>:<tag> RUN 运行指定的命令
RUN <command> CMD 容器启动时要运行的命令
CMD command param1 param2ENTRYPOINT-为容器指定默认运行程序
ENTRYPOINT command param1 param2
docker compose
什么是docker compose?
docker-compose是Docker官方的开源项目,使用python编写,实现上调用了Docker服务的API进行容器管理和编排,其官方定义和运行多个docker容器的应用。
dockere-compose有2个很重要的概念:
- 服务:一个应用的服务,实际上可以包含若干运行相同镜像的实例
- 项目:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义,整个docker-compose.yml定义一个项目。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

有了上面最基本的认识后,我来介绍一下我的项目及如何进行项目部署。
在我的项目中,有7个业务子服务
- 入口网关子服务
- 用户管理子服务
- 好友管理子服务
- 消息转发子服务
- 消息存储子服务
- 文件管理子服务
- 语言转化子服务
每一个子服务都需要打包成一个镜像,要知道每个服务都需要链接很多库,这时候有2种方式
- 手动将库一一拷贝到指定目录下
- 用shell脚本来拷贝到指定目录下(我采取的方式)
下列是文件子服务需要链接的库:

这里我用wak命令将连接的库给提取了出来
ldd file_server | awk '{if (match($3,"/")){print $3}}'

然后我们需要将库给拷贝到指定的路径下
#!/bin/bash#传递两个参数:
# 1. 可执行程序的路径名
# 2. 目录名称 --- 将这个程序的依赖库拷贝到指定目录下
declare depends
get_depends() {depends=$(ldd $1 | awk '{if (match($3,"/")){print $3}}')mkdir $2cp -Lr $depends $2
}get_depends ./gateway/build/gateway_server ./gateway/depends
get_depends ./file/build/file_server ./file/depends
get_depends ./friend/build/friend_server ./friend/depends
get_depends ./message/build/message_server ./message/depends
get_depends ./speech/build/speech_server ./speech/depends
get_depends ./transmite/build/transmite_server ./transmite/depends
get_depends ./user/build/user_server ./user/dependscp /bin/nc ./gateway/
cp /bin/nc ./file/
cp /bin/nc ./friend/
cp /bin/nc ./message/
cp /bin/nc ./speech/
cp /bin/nc ./transmite/
cp /bin/nc ./user/
get_depends /bin/nc ./gateway/depends
get_depends /bin/nc ./file/depends
get_depends /bin/nc ./friend/depends
get_depends /bin/nc ./message/depends
get_depends /bin/nc ./speech/depends
get_depends /bin/nc ./user/depends
get_depends /bin/nc ./transmite/depends
其中nc命令可以作为客户端发起TCP和UDP连接,用于测试主机端口是否开放,还可以用来监听端口等。 这里不详细解释了
此时我们就完成了依赖库的指定,我们就可以来创建dockerfile了。
这里我是ubuntu22.04版本

# 声明基础镜像来源
FROM ubuntu:22.04
# 声明工作路径
WORKDIR /im
RUN mkdir -p /im/logs &&\mkdir -p /im/data &&\mkdir -p /im/conf &&\mkdir -p /im/bin
# 将可执行程序文件,拷贝进入镜像
COPY ./build/gateway_server /im/bin/
# 将可执行程序依赖,拷贝进入镜像
COPY ./depends/ /lib/x86_64-linux-gnu/COPY ./nc /bin/
# 设置容器的启动默认操作 --- 运行程序
CMD /im/bin/gateway_server -flagfile=/im/conf/gateway_server.conf
但是,有7个子服务,如果一个一个创建容器,还是太麻烦了,所以有了docker-compose来编排容器。 当我们写完docker-compose后,只需要使用docker-compose up就可以将容器创建出来。
version: "3.8"services:etcd:image: quay.io/coreos/etcd:v3.3.25container_name: etcd-serviceenvironment:- ETCD_NAME=etcd-s1- ETCD_DATA_DIR=/var/lib/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379volumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/etcd:/var/lib/etcd:rwports:- 2379:2379restart: alwaysmysql:image: mysql:8.0.39container_name: mysql-serviceenvironment:MYSQL_ROOT_PASSWORD: 123456volumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./sql:/docker-entrypoint-initdb.d/:rw- ./middle/data/mysql:/var/lib/mysql:rwports:- 3306:3306restart: alwaysredis:image: redis:6.0.16container_name: redis-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/redis:/var/lib/redis:rwports:- 6379:6379restart: alwayselasticsearch:image: elasticsearch:7.17.21container_name: elasticsearch-serviceenvironment:- "discovery.type=single-node"volumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/elasticsearch:/data:rwports:- 9200:9200- 9300:9300restart: alwaysrabbitmq:image: rabbitmq:3.9.13container_name: rabbitmq-serviceenvironment:RABBITMQ_DEFAULT_USER: rootRABBITMQ_DEFAULT_PASS: 123456volumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/rabbitmq:/var/lib/rabbitmq:rwports:- 5672:5672restart: alwaysfile_server:build: ./file#image: server-user_servercontainer_name: file_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息: entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/file_server.conf:/im/conf/file_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10002:10002restart: alwaysentrypoint:# 跟dockerfile中的cmd比较类似,都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379 -c "/im/bin/file_server -flagfile=/im/conf/file_server.conf"depends_on:- etcdfriend_server:build: ./friend#image: file-server:v1container_name: friend_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息: entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/friend_server.conf:/im/conf/friend_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10006:10006restart: alwaysdepends_on:- etcd- mysql- elasticsearchentrypoint:# 跟dockerfile中的cmd比较类似,都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,9200 -c "/im/bin/friend_server -flagfile=/im/conf/friend_server.conf"gateway_server:build: ./gateway#image: file-server:v1container_name: gateway_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息: entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/gateway_server.conf:/im/conf/gateway_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 9000:9000- 9001:9001restart: alwaysdepends_on:- etcd- redisentrypoint:# 跟dockerfile中的cmd比较类似,都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,6379 -c "/im/bin/gateway_server -flagfile=/im/conf/gateway_server.conf"message_server:build: ./message#image: file-server:v1container_name: message_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息: entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/message_server.conf:/im/conf/message_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10005:10005restart: alwaysdepends_on:- etcd- mysql- elasticsearch- rabbitmqentrypoint:# 跟dockerfile中的cmd比较类似,都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,9200,5672 -c "/im/bin/message_server -flagfile=/im/conf/message_server.conf"speech_server:build: ./speech#image: file-server:v1container_name: speech_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息: entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/speech_server.conf:/im/conf/speech_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10001:10001restart: alwaysdepends_on:- etcdentrypoint:# 跟dockerfile中的cmd比较类似,都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379 -c "/im/bin/speech_server -flagfile=/im/conf/speech_server.conf"transmite_server:build: ./transmite#image: file-server:v1container_name: transmite_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息: entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/transmite_server.conf:/im/conf/transmite_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10004:10004restart: alwaysdepends_on:- etcd- mysql- rabbitmqentrypoint:# 跟dockerfile中的cmd比较类似,都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,5672 -c "/im/bin/transmite_server -flagfile=/im/conf/transmite_server.conf"user_server:build: ./user#image: file-server:v1container_name: user_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息: entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/user_server.conf:/im/conf/user_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10003:10003restart: alwaysdepends_on:- etcd- mysql- redis- elasticsearchentrypoint:# 跟dockerfile中的cmd比较类似,都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,5672,9200 -c "/im/bin/user_server -flagfile=/im/conf/user_server.conf"
现在我已经通过docker pull将需要用到的中间件镜像给拉取了下来。

此时进行docker-compose up -d 将容器启动起来。


此时我们所有的子服务都打包成了一个镜像,并且已经启动(通过docker container ls -a可以查看)。


此时所有子服务就在docker中启动起来了,就可以直接来提供服务,不需要自己来解决库依赖问题以及Linux版本问题。
最后我们只需要将运行程序和其依赖的库打包,就可以在任何服务器上运行。只需要简单的拉取和运行,这就是为什么docker风靡全球的原因。
相关文章:
docker——项目部署
什么是Docker? Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几…...
设计模式(Unity)——更新中
设计模式 文章目录 设计模式工厂模式创建方法(Create Methods)简单工厂(Simple Factory)工厂方法(Method Factory)抽象工厂(Abstract Factroy) 策略模式 工厂模式 创建方法…...
小程序中引入下载到本地的iconfont字体图标加载不出来问题解决
我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …...
百度富文本禁止编辑
<script type"text/javascript">$(function () {editorcontent new baidu.editor.ui.Editor();editorcontent.render(authentication);//禁用代码editorcontent.ready(function () {editorcontent.setDisabled();});try {editorcontent.sync();} catch (err) …...
C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信
1. 前言 RabbitMQ是一个流行的开源消息队列系统,支持多种消息协议,广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中,我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…...
头歌网络安全(11.12)
头歌禁止复制解决 必须先下篡改猴!!!! 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关:使用Servlet生成验证码 任务描述 本关任务:使用se…...
洛谷 P1725 琪露诺(线段树优化dp)
题目链接 https://www.luogu.com.cn/problem/P1725 思路 我们令 d p [ i ] dp[i] dp[i]表示琪露诺移动到第 i i i个格子时能够获得的最大冰冻指数。 显然,状态转移方程为: d p [ i ] m a x ( d p [ i ] , d p [ k ] a [ i ] ) dp[i] max(dp[i],dp…...
【LeetCode】【算法】19. 删除链表的倒数第N个结点
LeetCode 19. 删除链表的倒数第N个结点 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 思路 思路:快慢指针,快指针先移动n步,快慢指针再同时移动直到快指针到达链表末尾,此…...
Python爬虫 | 爬取豆瓣电影Top250的数据
简单记录一下,实现爬取豆瓣电影Top 250的数据。 这里我使用requests库来发送HTTP请求,以及BeautifulSoup库来解析HTML页面。 1.安装requests和BeautifulSoup库。 如果没有安装,可以通过以下命令安装: pip install requests bea…...
mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误
1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量(我的是在~/.bash.profile) export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…...
完全清除:苹果手机照片怎么彻底删除
在使用iPhone的过程中,由于拍摄积累的照片往往会占用大量存储空间。有时候,我们需要彻底删除这些照片以释放空间或保护隐私。苹果手机照片怎么彻底删除?在此,本文将与你分享一些实用的技巧。 彻底删除的重要性 彻底删除照片不仅涉…...
高德地图多个图片组成标点(自定义点标记内容)
图标的实现自定义点标记内容...
02-1_MVCC版本链清理
MVCC-版本链清理 文章目录 MVCC-版本链清理简介依赖机制Purge 操作的触发时机版本链清理的详细过程示例操作流程延迟清理配置和监控总结 简介 MySQL 中的 MVCC 机制通过版本链来管理数据的多版本存储,以支持高并发的读写操作。然而,随着事务的进行&…...
探索Python视频处理的瑞士军刀:ffmpeg-python库
文章目录 **探索Python视频处理的瑞士军刀:ffmpeg-python库**第一部分:背景介绍第二部分:ffmpeg-python库是什么?第三部分:如何安装ffmpeg-python库?第四部分:简单库函数使用方法1. 视频转码2. …...
进程间通信 - 通道
进程间通信 - 通道 什么是管道? 进程间的通信方式有五种,分别为:管道、信号量、共享内存、消息队列和套接字。 管道:本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于…...
华为数通HCIA系列第5次考试-【2024-46周-周一】
文章目录 1、子网掩码有什么作用,和IP地址是什么关系,利用子网掩码可以获取哪些信息?2、已知一个IP地址是192.168.1.1,子网掩码是255.255.255.0,求其网络地址3、已知某主机的IP地址是192.168.100.200,子网掩…...
【Linux】如何通过终端命令查看当前可用网络 WIFI + 设置已配置网络的连接优先级 + 连接/断连网络
【Linux】通过命令行,查看当前可用网络 WIFI 设置已配置网络的连接优先级 连接网络 列出所有可连接网络 nmcli device wifi list这个命令会列出所有可连接 wifi,*表示当前连接。 IN-USE BSSID SSID MODE CHAN …...
华为路由策略配置
一、AS_Path过滤 要求: AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接,引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…...
Debezium日常分享系列之:异步 Debezium 嵌入式引擎
Debezium日常分享系列之:异步 Debezium 嵌入式引擎 动机目标非目标保留Kafka Connect模型计划的更改线程池并行运行源任务存储偏移量并发处理CDC事件禁用CDC事件的完全排序自定义记录处理器并行处理记录的选项存储偏移量引擎状态和生命周期防止资源泄漏异常处理退出…...
leetcode206. Reverse Linked List
Given the head of a singly linked list, reverse the list, and return the reversed list. 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 思路一:双指针 class Solu…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
