使用Dockerfile構建鏡像 使用docker-compose 一鍵部署IM項目

本文講解:使用Dockerfile構建鏡像 & 使用docker-compose 一鍵部署IM項目。

im項目地址:xzll-im ,歡迎志同道合的開發者 一起 維護,學習,歡迎star 😄

1、Dockerfile編寫與鏡像構建&容器運行

Dockerfile 是構建鏡像的基礎 ,首先創建兩個空文件夾,用于存放im-connect和im-business的jar: image.png 之后使用 maven命令打包 注意此處選擇 profile為 test 對應我的虛擬機環境

mvn celan package -P test: image.png

之后上傳打好的jar到虛擬機: ``` sudo scp /Users/hzz/myselfproject/im-開源04/xzll-im-parent/im-connect/im-connect-service/target/im-connect-service.jar root@172.30.128.65:/usr/local/softhzz/xzll-im/jar-file/docker-file-way/connect

sudo scp /Users/hzz/myselfproject/im-開源04/xzll-im-parent/im-business/im-business-service/target/im-business-service.jar root@172.30.128.65:/usr/local/softhzz/xzll-im/jar-file/docker-file-way/business

```

之后分別編寫Dockerfile文件,內容如下:

```bash

business 的 Dockerfile 內容

FROM openjdk:11-jre-slim # jdk鏡像 VOLUME /tmp # 掛載 COPY im-business-service.jar business.jar ENTRYPOINT ["java", "-jar", "/business.jar"] # 啟動命令 EXPOSE 8083 # 暴露端口 與服務端口保持一致

connect的 Dockerfile 內容

FROM openjdk:11-jre-slim # jdk鏡像 VOLUME /tmp # 掛載 COPY im-connect-service.jar connect.jar ENTRYPOINT ["java", "-jar", "/connect.jar"] # 啟動命令 EXPOSE 10001 # 暴露端口 與服務端口保持一致 ``` image.png

現在這倆服務的 Dockerfile就就緒了之后我們制作鏡像:

```bash . 代表當前目錄 前邊鏡像名 后邊版本號

docker build -t im-business:0.0.2 . docker build -t im-connect:0.0.2 . ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/44a0c8c317f24f9b9c72ff720040d72a~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=3452&h=1640&s=450498&e=png&b=000000) 使用docker images看一下 有沒有: ![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f13bb51807f04640b3c8a24ba97ed006~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1574&h=440&s=127839&e=png&b=010101) 使用鏡像啟動容器: bash docker run -d -p 8083:8083 --restart always --name im-business im-business:0.0.2 docker run -d -p 10001:10001 --restart always --name im-connect im-connect:0.0.2 ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/01bbd831efa94cb1967bc320985a4bba~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=3304&h=830&s=363736&e=png&b=010101) 查看啟動日志 docker logs -f --tail 50 im-business docker logs -f --tail 50 im-connect ``` image.png

發消息試試能不能走通流程: image.png 可以看到是沒問題的。至此Dockerfile方式構建鏡像 啟動容器就說完了 但是這種方式比較繁瑣,每一個服務都得搞個Dockerfile 服務多了頭炸了。所以有了服務編排工具,常見的: - docker-compose (姑且可以將其歸納為容器編排 但是論功能上 和k8s還是差挺遠的,k8s后續會用) - k8s - OpenShift - Docker Swarm

下邊就以docker-compose開刀 方便輕松管理多服務的情況!

2、docker-compose安裝與容器編排

為什么使用docker-compose

在上邊我們介紹了使用 Dockerfile 構建 docker 鏡像 然后 在鏡像基礎上啟動應用程序,乍看起來已經能夠滿足我們的日常需求了,無論需要什么環境,在 Dockerfile 里逐步構建,然后 build、run,就 ok 了,也滿足了我們docker 隔離性、快速部署的要求,為什么還需要docker-compose呢?

首先我們要知道docker 是輕量化的應用程序,docker 官方推薦每個 docker 容器中只運行一個進程,那么就是說,我們需要分別為我們的應用以及中間件創建單獨的 docker 容器,然后分別啟動它,想象一下,構建好 docker 之后,每次啟動我們的網站,如果有n個服務 那么就得docker run n次,是不是很繁瑣?而且此時這幾個 docker 是分散獨立的,很不方便管理,既然這幾個 docker 都是為了同一個網站服務,是不是應該把它們放到一起?這就引出了 docker-compose 項目。

什么是docker-compose

docker-compose是 docker 官方的開源項目,使用 python 編寫,實現上調用了 Docker 服務的 API 進行容器管理,其官方定義為為:定義和運行多個 Docker 容器的應用(Defining and running multi-container Docker applications)),其實就是上面所講的功能。

安裝Docker-Compose

Docker Compose是一個用來定義和運行復雜應用的Docker工具,一個使用Docker容器的應用,通常由多個容器組成。使用Docker Compose不再需要使用shell腳本來啟動容器。

Compose 通過一個配置文件來管理多個Docker容器,在配置文件中,所有的容器通過services來定義,然后使用docker-compose腳本來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器,非常適合組合使用多個容器進行開發的場景

注意這個docker-compose和docker是有對應關系的,一定要在github找好關系,對應錯了的話挺麻煩。 我用的docker版本是26.1.4 所以我要下載的docker-compose就是:v2.27.2

image.png

如果網絡好的話 直接 下載: bash sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.2/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose

但是我的虛擬機上網絡很差 所以直接在宿主機下載好 然后上傳到虛擬機。 image.png

上傳到虛擬機的/usr/local/bin 目錄: bash sudo scp /Users/hzz/Downloads/docker-compose-linux-x86_64 root@172.30.128.65:/usr/local/bin 改個名叫docker-compose bash mv docker-compose-linux-x86_64 docker-compose 之后授權: bash sudo chmod +x /usr/local/bin/docker-compose 之后驗證下: bash docker-compose -v image.png

docker-compose 安裝成功 ,接下來開始docker-compose之旅。

docker-compose.yml編寫與批量上傳

首先: 需要在項目根目錄編寫個docker-compose.yml文件 當然你vim方式在虛擬機上創建也行,但是為了直觀我這里先在idea中創建,完事上傳到虛擬機。

```yml version: '3' services: im-gateway: build: ./im-gateway hostname: im-gateway containername: im-gateway restart: always ports: - "8081:8081" networks: - defaultnetwork volumes: - "/tmp/data/logs:/logs" im-auth: build: ./im-auth hostname: im-auth containername: im-auth restart: always ports: - "8082:8082" networks: - defaultnetwork volumes: - "/tmp/data/logs:/logs" im-business: # 可以根據Dockerfile構建鏡像(但是,Docker Compose 會在檢測到上下文變化時重新構建鏡像。也就是說如果你不修改Dockerfile docker-compose應該不是每次都構建鏡像 實測確實如此) build: ./im-business # 也可以指定鏡像名 # image: im-business:0.0.2

# 設置容器的主機名 即修改 : /etc/hosts 中的內容
hostname: im-business
# 容器名稱
container_name: im-business
# 重啟策略, always 表示無論哪種狀態退出,都會重啟容器
restart: always
ports:# 設置主機與容器的端口映射- "8083:8083"
networks:# 使用默認網絡即:docker0 橋接- default_network
volumes:# 將主機的 /tmp/data/logs 目錄掛載到容器的 /logs 目錄。這樣可以實現數據的持久化,當容器重啟時,數據不會丟失- "/tmp/data/logs:/logs"

im-connect: build: ./im-connect hostname: im-connect containername: im-connect restart: always ports: - "10001:10001" networks: - defaultnetwork volumes: - "/tmp/data/logs:/logs" im-console: build: ./im-console hostname: im-console containername: im-console restart: always ports: - "8084:8084" networks: - defaultnetwork volumes: - "/tmp/data/logs:/logs" networks: default_network: # 橋接 driver: bridge ```

之后我們在每個項目的resource下創建對應的Dockerfile以便構建對應項目的鏡像,如下是網關的: image.png

接下來我們mvn clean package -P test 打包

現在jar包,Dockerfile docker-compose.yml都有了 剩下的工作就是將其上傳到虛擬機然后構建并啟動了。一共有5個springboot服務 5個Dockerfile 5個jar包 一個docker-compose.yml文件 一共11個文件 如果一個個執行scp上傳的話太費勁,這里寫個腳本,執行腳本就一次性上傳完成,這就舒服了,但是我在腳本中使用的是sshpass工具上傳,所以先在mac安裝下 sshpass工具:

bash brew install hudochenkov/sshpass/sshpass image.png bash brew link sshpass image.png 安裝好sshpass后 就是編寫批量上傳腳本了,內容如下: ```bash

!/bin/bash

批量上傳本地文件到 虛擬機 以便鏡像構建以及 容器運行

定義本地和遠程目錄前綴

localbasedir="/Users/hzz/myselfproject/im-開源04/xzll-im-parent" remotebasedir="/usr/local/softhzz/xzll-im/jar-file/docker-compose-way"

定義要上傳的文件和目標目錄

files=( "$localbasedir/im-gateway/target/im-gateway.jar:$remotebasedir/im-gateway/" "$localbasedir/im-auth/target/im-auth.jar:$remotebasedir/im-auth/" "$localbasedir/im-business/im-business-service/target/im-business-service.jar:$remotebasedir/im-business/" "$localbasedir/im-connect/im-connect-service/target/im-connect-service.jar:$remotebasedir/im-connect/" "$localbasedir/im-console/im-console-service/target/im-console-service.jar:$remotebasedir/im-console/" "$localbasedir/im-gateway/src/main/resources/Dockerfile:$remotebasedir/im-gateway" "$localbasedir/im-auth/src/main/resources/Dockerfile:$remotebasedir/im-auth/" "$localbasedir/im-business/im-business-service/src/main/resources/Dockerfile:$remotebasedir/im-business/" "$localbasedir/im-connect/im-connect-service/src/main/resources/Dockerfile:$remotebasedir/im-connect/" "$localbasedir/im-console/im-console-service/src/main/resources/Dockerfile:$remotebasedir/im-console/" "$localbasedir/docker-compose.yml:$remotebasedir/" )

遠程服務器的用戶名和主機名

remote_user="root"

本機上的 環境變量 放到了: sudo vi ~/.zshrc 中

remotehost="$XUNIJIADDRESS" remotepassword="$REMOTEPASSWORD"

日志文件

logfile="uploadlog.txt"

遍歷數組并執行上傳

for filepair in "${files[@]}"; do file="${filepair%%:}" remote_dir="${file_pair##:}"

echo "確保遠程目錄存在: $remotedir" | tee -a "$logfile" sshpass -p "$remotepassword" ssh ${remoteuser}@${remotehost} "mkdir -p $remotedir"

echo "上傳文件 $file 到 $remotedir" | tee -a "$logfile" if sshpass -p "$remotepassword" scp -r "$file" ${remoteuser}@${remotehost}:"$remotedir"; then echo "上傳成功: $file" | tee -a "$logfile" else echo "上傳失敗: $file" | tee -a "$logfile" fi echo "" | tee -a "$log_file" done ``` 注意:此腳本會判斷 如果目標文件夾不存在則創建

上傳日志如下: image.png 可以看到虛擬機中已有了: image.png

構建鏡像并一鍵啟動(包含服務和中間件)

之后我們直接 使用下邊命令構建&啟動 docker-compose 中定義的服務: bash docker-compose up -d --build 執行效果如下: image.png 看下我們掛載到宿主機的日志文件 : image.png image.png 從日志上看 都已經啟動成功。至此,本xzll-im項目就可以使用docker-compose啟動啦 當然后續將依賴的中間件也加到docker-compose中去 一鍵啟動項目+中間件。更方便了。

后續補充:

將依賴的中間件也寫到docker-compose.yml中 這樣的話 真正做到一鍵啟動。

改后的docker-compose.yml文件: ```yml version: '3.9' services: im-gateway: build: context: ./im-gateway dockerfile: Dockerfile image: im-gateway:latest

hostname: im-gateway
container_name: im-gateway
restart: always
ports:- "8081:8081"
networks:- default_network
volumes:- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

im-auth: build: context: ./im-auth dockerfile: Dockerfile image: im-auth:latest

hostname: im-auth
container_name: im-auth
restart: always
ports:- "8082:8082"
networks:- default_network
volumes:- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

im-business: # 可以根據Dockerfile構建鏡像(但是,Docker Compose 會在檢測到上下文變化時重新構建鏡像。也就是說如果你不修改Dockerfile docker-compose應該不是每次都構建鏡像 實測確實如此) build: context: ./im-business # 指定Dockerfile文件位置 dockerfile: Dockerfile # 指定名稱 image: im-business:latest # 指定生成鏡像的 名稱

# 也可以直接指定鏡像名 但是要確保鏡像存在 (如果在docker倉庫, 則不需要再本地存在鏡像 會自動pull)
# image: im-business:0.0.2# 設置容器的主機名 即修改 : /etc/hosts 中的內容
hostname: im-business
# 容器名稱
container_name: im-business
# 重啟策略, always 表示無論哪種狀態退出,都會重啟容器
restart: always
ports:# 設置主機與容器的端口映射- "8083:8083"
networks:# 使用默認網絡即:docker0 橋接- default_network
volumes:# 將主機的 /tmp/data/logs 目錄掛載到容器的 /logs 目錄。這樣可以實現數據的持久化,當容器重啟時,數據不會丟失- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

im-connect: build: context: ./im-connect dockerfile: Dockerfile image: im-connect:latest

hostname: im-connect
container_name: im-connect
restart: always
ports:- "10001:10001"
networks:- default_network
volumes:- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

im-console: build: context: ./im-console dockerfile: Dockerfile image: im-console:latest

hostname: im-console
container_name: im-console
restart: always
ports:- "8084:8084"
networks:- default_network
volumes:- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

# ######################################### 以下是此im項目 依賴的中間件 #########################################

# rocketMq nameServer rmqnamesrv: image: apache/rocketmq:4.8.0 containername: rmqnamesrv restart: always ports: - "9876:9876" volumes: - /usr/local/softhzz/docker/rocketmqnamesrv/store:/root/store - /usr/local/softhzz/docker/rocketmqnamesrv/logs:/root/logs command: sh mqnamesrv # rocketMq broker rmqbroker: image: apache/rocketmq:4.8.0 containername: rmqbroker restart: always ports: - "10911:10911" - "10909:10909" volumes: - /usr/local/softhzz/docker/rocketmqbroker/store:/root/store - /usr/local/softhzz/docker/rocketmqbroker/logs:/root/logs - /usr/local/softhzz/docker/rocketmqbroker/conf/broker.conf:/opt/rocketmq-4.8.0/conf/broker.conf environment: - LOCALIP=${LOCALIP} command: sh mqbroker -c /opt/rocketmq-4.8.0/conf/broker.conf

rocketmq-console: image: styletang/rocketmq-console-ng containername: rocketmq-console restart: always ports: - "8080:8080" environment: JAVAOPTS: "-Drocketmq.namesrv.addr=${LOCALIP}:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" dependson: - rmqnamesrv - rmqbroker # nacos nacos: image: nacos/nacos-server:2.0.3 containername: nacos restart: always ports: - "8848:8848" volumes: - /usr/local/softhzz/docker/nacos/data:/home/nacos/data - /usr/local/softhzz/docker/nacos/logs:/home/nacos/logs environment: MODE: standalone #redis redis: image: redis containername: redis restart: always ports: - "6379:6379" volumes: - /usr/local/softhzz/docker/redis/data:/data - /usr/local/softhzz/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf # zk zookeeper: image: zookeeper containername: zookeeper restart: always ports: - "2181:2181" volumes: - /usr/local/softhzz/docker/zk/data:/data - /usr/local/softhzz/docker/zk/datalog:/datalog - /usr/local/softhzz/docker/zk/conf/zoo.cfg:/conf/zoo.cfg

networks: default_network: # 橋接 driver: bridge ```

配置文件: 首先需要設置環境變量,方便我們在docker-compose.yml或者配置文件中引用:

```bash

編輯bash文件

sudo vim ~/.bashrc

設置環境變量

export LOCAL_IP=$(ip addr show enp0s3 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)

使其生效

source ~/.bashrc

打印看看 將輸出enp0s3網卡對應的ip

echo $LOCAL_IP ```

```bash

zoo.cfg配置文件內容:

tickTime=2000 dataDir=/data dataLogDir=/datalog clientPort=2181 initLimit=5 syncLimit=2 server.1=zookeeper:2888:3888

redis.conf文件內容:

appendonly yes requirepass 123456

broker.conf文件 內容:

brokerClusterName = DefaultCluster brokerName = broker-a brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNCMASTER flushDiskType = ASYNCFLUSH namesrvAddr=${LOCALIP}:9876 autoCreateTopicEnable=true brokerIP1=${LOCALIP} ```

由于我將中間件和服務全部搞到docker-compose中 所以以后不需要docker run方式啟動了 這里把之前啟動的容器和下載的鏡像 全部清理掉。 執行 ```bash

將停止并刪除所有容器

docker rm -f $(sudo docker ps -a -q)

刪除所有鏡像

docker rmi $(docker images -q) ``` 之后再執行命令 構建 或者 pull鏡像并啟動容器:

  • (自己寫的服務是構建 即根據docker-compose.yml中的buil指令 來使用Dockerfile文件build)
  • (中間件是直接指定了鏡像名稱 所以直接去docker倉庫 pull)

bash docker-compose up -d --build 可以看到 項目服務和相關中間件 一個命令全部啟動成功了,挺爽的: image.png

有個點要注意,就是日志輸出框架的配置,需要指定目錄到容器的 /logs, 這樣才能和docker-compose中的日志掛載配置相吻合 ,我使用的是log4j2 ,我是這么定義的(以im-console為例): ```xml

im-console /logs

<DefaultRolloverStrategy max="40" /><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /></RollingRandomAccessFile>
<logger level="OFF" name="jdbc.sqltiming" additivity="false"><AppenderRef ref="Console" /><AppenderRef ref="File" /></logger><logger level="OFF" name="jdbc.companyAudit" additivity="false"><AppenderRef ref="Console" /><AppenderRef ref="File" /></logger><logger level="OFF" name="jdbc.resultset" additivity="false"><AppenderRef ref="Console" /><AppenderRef ref="File" /></logger><logger level="OFF" name="jdbc.connection" additivity="false"><AppenderRef ref="Console" /><AppenderRef ref="File" /></logger><logger level="OFF" name="jdbc.audit" additivity="false"><AppenderRef ref="Console" /><AppenderRef ref="File" /></logger><logger level="OFF" name="serviceStatsLog" additivity="false"><AppenderRef ref="Console" /><AppenderRef ref="File" /></logger>

```

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38038.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot中使用Thymeleaf進行頁面渲染

Spring Boot中使用Thymeleaf進行頁面渲染 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何在Spring Boot應用中使用Thymeleaf模板引擎進行頁面…

Nginx和CDN運用

一.Web緩存代理 1.工作機制 代替客戶機向網站請求數據&#xff0c;從而可以隱藏用戶的真實IP地址。將獲得的網頁數據&#xff08;靜態Web元素&#xff09;保存到緩存中并發送給客戶機&#xff0c;以便下次請求相同的數據時快速響應。 2.代理服務器的概念 代理服務器是一個位…

Kubernetes面試整理-如何監控Kubernetes集群的健康和性能?

監控 Kubernetes 集群的健康和性能是確保集群穩定運行的重要任務。以下是一些常用的方法和工具來監控 Kubernetes 集群: 1. Prometheus 和 Grafana Prometheus 是一個開源的系統監控和報警工具,Grafana 是一個開源的分析和監控平臺。兩者通常一起使用來監控 Kubernetes 集群。…

k8s token加新節點

在 master 節點執行 kubeadm token create --print-join-command得到token和cert&#xff0c;這兩個參數在2個小時內可以重復使用&#xff0c;超過以后就得再次生成 kubeadm join apiserver.k8s.com --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha…

【入門】5分鐘了解卷積神經網絡CNN是什么

本文來自《老餅講解-BP神經網絡》https://www.bbbdata.com/ 目錄 一、卷積神經網絡的結構1.1.卷積與池化的作用2.2.全連接層的作用 二、卷積神經網絡的運算2.1.卷積層的運算2.2.池化的運算2.3.全連接層運算 三、pytorch實現一個CNN例子3.1.模型的搭建3.2.CNN完整訓練代碼 CNN神…

【Dison夏令營 Day 04】如何用 Python 編寫簡單的數字猜謎游戲代碼

上個周末&#xff0c;我整理了一份可以用 Python 編寫的游戲列表。但為什么呢&#xff1f; 如果您是 Python 程序員初學者&#xff0c;編寫有趣的游戲可以幫助您更快更好地學習 Python 語言&#xff0c;而不會被語法之類的東西所困擾。我在學習 Python 的時候曾制作過一些這樣…

Hadoop-03-Hadoop集群 免密登錄 超詳細 3節點公網云 分發腳本 踩坑筆記 SSH免密 服務互通 集群搭建 開啟ROOT

章節內容 上一節完成&#xff1a; HDFS集群XML的配置MapReduce集群XML的配置Yarn集群XML的配置統一權限DNS統一配置 背景介紹 這里是三臺公網云服務器&#xff0c;每臺 2C4G&#xff0c;搭建一個Hadoop的學習環境&#xff0c;供我學習。 之前已經在 VM 虛擬機上搭建過一次&…

短視頻矩陣系統搭建APP源碼開發

前言 短視頻矩陣系統不僅有助于提升品牌影響力和營銷效率&#xff0c;還能幫助企業更精準地觸達目標受眾&#xff0c;增強用戶互動&#xff0c;并利用數據分析來持續優化營銷策略。 一、短視頻矩陣系統是什么&#xff1f; 短視頻矩陣系統是一種通過多個短視頻平臺進行內容創作…

Vue 3 實戰教程(快速入門)

Vue 3 實戰教程&#xff08;快速入門&#xff09; Vue.js 是一個用于構建用戶界面的漸進式框架&#xff0c;Vue 3 是 Vue 的最新版本&#xff0c;帶來了許多改進和新特性。本文將通過一個簡單的項目示例&#xff0c;帶你快速入門 Vue 3 的基礎使用。 環境設置 安裝 Node.js …

多多代播24小時值守:電商直播時代是帶貨爆單的關鍵

在電商直播盛行的今天&#xff0c;直播帶貨已成為品牌與消費者溝通的關鍵。然而&#xff0c;流量波動大&#xff0c;競爭激烈&#xff0c;使品牌面臨諸多挑戰。因此&#xff0c;許多品牌尋求專業代播服務&#xff0c;并特別強調24小時值守的重要性。 流量來源的不穩定性是一個顯…

《VUE.js 實戰》讀書筆記

1. 初識vue.js MVVM模式從MVC模式演化而來&#xff0c;但是MVVM模式更多應用在前端&#xff0c;MVC則是前后端共同表現。傳統開發模式&#xff1a;jQuery RequireJS ( SeaJS ) artTemplate ( doT ) Gulp ( Grunt)。vue.js可以直接通過script引入方式開發&#xff0c;也可以…

Linux下安裝RocketMQ:從零開始的消息中間件之旅

感謝您閱讀本文&#xff0c;歡迎“一鍵三連”。作者定會不負眾望&#xff0c;按時按量創作出更優質的內容。 ?? 1. 畢業設計專欄&#xff0c;畢業季咱們不慌&#xff0c;上千款畢業設計等你來選。 RocketMQ是一款分布式消息中間件&#xff0c;具有高吞吐量、低延遲、高可用性…

本末倒置!做660+880一定要避免出現這3種情況!

每年都有不少人做過660題&#xff0c;但是做過之后&#xff0c;并沒有真正理解其中的題目&#xff0c;所以做過之后效果也不好&#xff01;再去做880題&#xff0c;做的也會比較吃力。 那該怎么辦呢&#xff0c;不建議你繼續做880題&#xff0c;先把660給吃透再說。 接下來給…

PostgreSQL使用教程

安裝 PostgreSQL 您可以從 PostgreSQL 官方網站下載適合您操作系統的安裝程序&#xff0c;并按照安裝向導進行安裝。 啟動數據庫服務器 安裝完成后&#xff0c;根據您的操作系統&#xff0c;通過相應的方式啟動數據庫服務器。 連接到數據庫 可以使用命令行工具&#xff08;如 p…

Objective-C使用塊枚舉的細節

對元素類型的要求 在 Objective-C 中&#xff0c;NSArray 只能存儲對象類型&#xff0c;而不能直接存儲基本類型&#xff08;例如 int&#xff09;。但是&#xff0c;可以將基本類型封裝在 NSNumber 等對象中&#xff0c;然后將這些對象存儲在 NSArray 中。這樣&#xff0c;en…

Maven編譯打包時報“PKIX path building failed”異常

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 方法11.報錯信息2.InstallCert.java3.生成證書文件 jssecacerts4.復制 jssecacerts 文件5. 然后重啟Jenkins 或者maven即可 方法21.下載證書2. 導入證書執行keytool…

7.優化算法之分治-快排歸并

0.分治 分而治之 1.顏色分類 75. 顏色分類 - 力扣&#xff08;LeetCode&#xff09; 給定一個包含紅色、白色和藍色、共 n 個元素的數組 nums &#xff0c;原地對它們進行排序&#xff0c;使得相同顏色的元素相鄰&#xff0c;并按照紅色、白色、藍色順序排列。 我們使用整數…

Elasticsearch (1):ES基本概念和原理簡單介紹

Elasticsearch&#xff08;簡稱 ES&#xff09;是一款基于 Apache Lucene 的分布式搜索和分析引擎。隨著業務的發展&#xff0c;系統中的數據量不斷增長&#xff0c;傳統的關系型數據庫在處理大量模糊查詢時效率低下。因此&#xff0c;ES 作為一種高效、靈活和可擴展的全文檢索…

PHP爬蟲類的使用技巧與注意事項

php爬蟲類的使用技巧與注意事項 隨著互聯網的迅猛發展&#xff0c;大量的數據被不斷地生成和更新。為了方便獲取和處理這些數據&#xff0c;爬蟲技術應運而生。PHP作為一種廣泛應用的編程語言&#xff0c;也有許多成熟且強大的爬蟲類庫可供使用。在本文中&#xff0c;我們將介…

Qt Creator 的設置文件保存位置

在使用 Qt Creator 進行開發時,備份或遷移設置(例如文本編輯器偏好、語法高亮等)是常見需求。了解這些設置文件在不同操作系統中的保存位置,可以簡化這個過程。本文將為您詳細介紹 Qt Creator 保存設置文件的位置。 默認文件位置 Qt Creator 會創建多個文件和目錄來存儲其…