使用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.mzph.cn/diannao/38038.shtml

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

相关文章

Nginx和CDN运用

一.Web缓存代理 1.工作机制 代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。将获得的网页数据&#xff08;静态Web元素&#xff09;保存到缓存中并发送给客户机&#xff0c;以便下次请求相同的数据时快速响应。 2.代理服务器的概念 代理服务器是一个位…

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; 短视频矩阵系统是一种通过多个短视频平台进行内容创作…

多多代播24小时值守:电商直播时代是带货爆单的关键

在电商直播盛行的今天&#xff0c;直播带货已成为品牌与消费者沟通的关键。然而&#xff0c;流量波动大&#xff0c;竞争激烈&#xff0c;使品牌面临诸多挑战。因此&#xff0c;许多品牌寻求专业代播服务&#xff0c;并特别强调24小时值守的重要性。 流量来源的不稳定性是一个显…

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 作为一种高效、灵活和可扩展的全文检索…

springboot系列八: springboot静态资源访问,Rest风格请求处理, 接收参数相关注解

文章目录 WEB开发-静态资源访问官方文档基本介绍快速入门注意事项和细节 Rest风格请求处理基本介绍应用实例注意事项和细节思考题 接收参数相关注解基本介绍应用实例PathVariableRequestHeaderRequestParamCookieValueRequestBodyRequestAttributeSessionAttribute ⬅️ 上一篇…

微服务-网关Gateway

个人对于网关路由的理解&#xff1a; 网关就相当于是一个项目里面的保安&#xff0c;主要作用就是做一个限制项。&#xff08;zuul和gateway两个不同的网关&#xff09; 在路由中进行配置过滤器 过滤器工厂&#xff1a;对请求或响应进行加工 其中filters&#xff1a;过滤器配置…

摸鱼大数据——Spark基础——Spark环境安装——PySpark搭建

三、PySpark环境安装 PySpark: 是Python的库, 由Spark官方提供. 专供Python语言使用. 类似Pandas一样,是一个库 Spark: 是一个独立的框架, 包含PySpark的全部功能, 除此之外, Spark框架还包含了对R语言\ Java语言\ Scala语言的支持. 功能更全. 可以认为是通用Spark。 功能 P…

Golang | Leetcode Golang题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; /** 102. 二叉树的递归遍历*/ func levelOrder(root *TreeNode) [][]int {arr : [][]int{}depth : 0var order func(root *TreeNode, depth int)order func(root *TreeNode, depth int) {if root nil {return}if len(arr) depth {arr a…

线性代数--行列式1

本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项&#xff0c;便于之后的考研复习使用。 首先&#xff0c;对于普通的二阶和三阶行列式&#xff0c;我们可以直接对其进行拆开&#xff0c;展开。 而对于n阶行列式 其行列式的值等于它的任意…

C++特殊类设计单例模式...

文章目录 请设计一个类&#xff0c;不能被拷贝请设计一个类&#xff0c;只能在堆上创建对象请设计一个类&#xff0c;只能在栈上创建对象请设计一个类&#xff0c;不能被继承请设计一个类&#xff0c;只能创建一个对象(单例模式)单例模式&#xff1a;饿汉模式&#xff1a;懒汉模…