【微服务】springboot 构建镜像多种模式使用详解
目录
一、前言
二、微服务常用的镜像构建方案
3.1 使用Dockerfile
3.2 使用docker plugin插件
3.3 使用docker compose 编排文件
三、环境准备
3.1 服务器
3.2 安装JDK环境
3.2.1 创建目录
3.2.2 下载安装包
3.2.3 配置环境变量
2.2.4 查看java版本
3.3 安装maven
3.3.1 下载maven安装包并解压
3.3.2 配置setting文件
3.3.3 配置maven的环境变量
3.3.4 验证maven是否配置成功
3.4 安装git
3.5 准备docker环境和docker compose环境
四、搭建springboot工程
4.1 搭建步骤
4.1.1 添加依赖
4.1.2 添加测试接口
4.1.3 接口测试
五、使用Dockerfile构建docker镜像
5.1 添加Dockerfile文件
5.2 推送代码到仓库
5.3 下载代码
5.4 使用mvn命令打包
5.5 docker-compose构建镜像
5.6 启动镜像
5.7 访问服务
5.8 优化改进
5.8.1 利用jenkins进行任务构建
5.8.2 使用shell脚本
六、使用docker maven plugin插件构建镜像
6.1 docker maven plugin介绍
6.1.1 docker maven plugin 配置语法说明
6.1.2 Docker Maven 插件常用执行命令
6.2 使用Docker Maven Plugin插件构建镜像
6.2.1 添加插件配置信息
6.2.2 添加一个测试接口
6.2.3 推送代码到gitee
6.2.4 再次拉取代码
6.2.5 打包构建镜像
6.2.6 镜像检查
5.2.7 启动镜像
5.2.8 访问接口
5.2.9 打包阶段触发构建镜像
七、使用dockerfile maven plugin插件构建镜像
7.1 dockerfile maven plugin概述
7.2 使用dockerfile maven plugin制作镜像
7.2.1 配置Dockerfile文件
7.2.2 配置maven plugin信息
7.2.3 代码推送与拉代码
7.2.4 镜像打包
7.2.5 镜像检查
7.2.6 启动镜像服务
7.2.7 接口测试
7.3 dockerfile maven plugin补充说明
7.3.1 跳过插件目标
7.3.2 跳过某一个goal
八、写在文末
一、前言
容器化部署方式让微服务从打包到部署更加方便,以springboot开发的微服务为例来说,随着服务的数量越来越多,微服务部署需要占用的服务器资源开销也越来越大,这对于很多项目团队来说,服务器资源是一笔不可忽略的成本计算,而容器化部署之后,一定程度上可以缓解服务部署带来的服务器资源过度紧张的问题,接下来将详细聊聊如何基于springboot微服务快速完成镜像打包,部署的常用方式。
二、微服务常用的镜像构建方案
常用的服务构建镜像方式主要有下面几种
3.1 使用Dockerfile
这是一种经过很多中小团队实践之后,容易上手,技术成本也比较低的方式,对于springboot开发的小型应用服务来说,是一个不错的选择,网上关于这方面的资料也比价多。
3.2 使用docker plugin插件
docker plugin插件,可以结合maven管理工具,以插件的方式引入到工程中,再通过参数配置的方式,即可实现在项目打包的时候完成镜像的构建工作。
3.3 使用docker compose 编排文件
这种方式更适合于那种基于微服务框架开发的应用,通过docker compose 编排文件,最后完成微服务启动时所依赖的所有环境,难度较大,但是可以基于这种方式,后续再在服务接入k8s时提供基础和便利。
接下来将详细介绍几种常用的镜像构建方式。
三、环境准备
3.1 服务器
配置:
- 虚拟机或云服务一台,基于centos7.5或以上的版本;
- 配置,2C4G(或者更高);
3.2 安装JDK环境
后文中项目拉取到服务器目录之后,需要基于java环境打包,所以需提前配置jdk,这里选择jdk17版本。参考下面的步骤操作。
3.2.1 创建目录
cd /usr/local/soft
mkdir java
cd java/
3.2.2 下载安装包
使用下面的命令下载,也可以到官网进行下载
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
3.2.3 配置环境变量
解压安装包
tar -zxvf jdk-17_linux-x64_bin.tar.gz
配置环境变量,使用vi /etc/profile命令,将以下内容添加到文件末尾
JAVA_HOME=/usr/local/soft/java/jdk-17.0.11
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH
使用source命令重新加载配置文件使其生效
source /etc/profile
2.2.4 查看java版本
使用下面的命令查看java是否安装成功
java -version
3.3 安装maven
后文中需要通过git拉取代码后在服务器打包构建,需要安装maven,这里使用的是3.6.3的版本,大于这个版本都可以
3.3.1 下载maven安装包并解压
使用下面的命令下载和解压
#下载
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz
3.3.2 配置setting文件
为了保证后续下载服务依赖的jar包时速度比较快,建议配置下中央仓库的地址
cd apache-maven-3.6.3/
cd conf
cp settings.xml settings.xml.bk
vi settings.xml
配置下面的镜像仓库地址,拷贝下面的配置信息到settings.xml中
#配置本地仓库地址
<localRepository>/usr/local/soft/mvn/repo</localRepository>#使用阿里镜像下载
<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>
3.3.3 配置maven的环境变量
将下面的配置信息追加到/etc/profile文件中
#改环境变量
vi /etc/profile#复制下面三行到最下面(路径要根据自己情况改)
#maven
export MAVEN_HOME=/usr/local/soft/mvn/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin#保存退出,然后重载配置
source /etc/profile
3.3.4 验证maven是否配置成功
#查看
mvn -v#检查
mvn -version
3.4 安装git
使用下面的命令安装git
yum install git
3.5 准备docker环境和docker compose环境
提前在服务器安装docker和docker-compose环境,网上资料比较多,这里就略过了
docker安装和docker-compose的安装可以参考:docker-compose安装与配置
四、搭建springboot工程
快速搭建一个springboot工程,参考下面的流程,本例使3.2.4的版本
4.1 搭建步骤
4.1.1 添加依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/></parent><properties><docker.image.prefix>dcloud</docker.image.prefix></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency></dependencies><build><finalName>boot-docker</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
4.1.2 添加测试接口
为了方便测试,这里添加一个测试接口
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DockerImageController {//localhost:8088/docker/v1@GetMapping("/docker/v1")public Object dockerTest1(){return "docker image test";}}
4.1.3 接口测试
调用一下上面的接口,确保可以正常使用
五、使用Dockerfile构建docker镜像
这种方式也是目前很多项目团队在使用的方式,主要是通过在工程中添加Dockerfile文件,最后再在安装了docker环境的服务器上通过docker-compose的命令构建镜像的方式,最后启动镜像服务,下面快速还原一下该过程。
5.1 添加Dockerfile文件
在工程根目录下添加一个Dockerfile文件,编写的配置内容参考如下
#FROM java:8
FROM openjdk:17-jdk-alpine
ADD target/boot-docker.jar boot-docker.jar
ENTRYPOINT ["java","-jar","/boot-docker.jar"]
注意:
1、使用的java版本建议与服务器安装版本保持一致,这里使用的都是17;
2、Dockerfile文件中还可以添加更丰富的信息,比如指定java -jar启动的其他参数;
5.2 推送代码到仓库
然后将上面的代码推送至git
5.3 下载代码
登录目标服务器之后,使用git clone命令下载gitee的代码
git clone https://gitee.com/licong_congge/boot-docker.git
5.4 使用mvn命令打包
进入到项目主目录,依次执行下面的命令,初次执行可能比较慢,需要从远程的阿里仓库下载依赖包
cd boot-docker/
mvn clean package
5.5 docker-compose构建镜像
打包成功后,使用下面的命令构建服务jar包的镜像,注意,进入工程的主目录执行,即Dockerfile文件所在的目录
docker build -t boot-docker:1.0 .
构建完成后,使用下面的命令查看上面构建的镜像
5.6 启动镜像
确认镜像构建成功后,使用下面的docker命令启动服务
docker run -d -it -p 8088:8088 --name=boot-k8s boot-docker:1.0
参数说明:
-
-d,后天启动;
-
8088:8088,宿主机8088端口,映射容器内的8088服务端口;
-
--name=boot-k8s,自定义启动的镜像名;
-
boot-docker:1.0,上述构建出来的镜像名;
通过docker ps检查容器是否启动成功
5.7 访问服务
开放服务器8088端口,访问一下接口做测试
5.8 优化改进
以上,我们通过手动的方式完成了一个微服务工程从编写Dockerfile文件开始,到最后构建出镜像,并通过制作的镜像启动容器服务的完整操作流程,但是从操作上来看,过程还是比较繁琐的,因此可以考虑从两个方面进行改进。
5.8.1 利用jenkins进行任务构建
在jenkins中,可以通过任务编排的方式,将上述的每一步进行前后的配置和编排,从而以任务的方式完成。
5.8.2 使用shell脚本
细心的同学不难发现,其实上面的每一步,都可以在shell脚本中进行编写,按照业务的顺序进行组装即可,shell脚本中大致的逻辑如下:
git clone 代码分支
cd 项目主目录
mvn clean package
查看目前运行中的docker镜像以及版本号
重新构建docker镜像(根据上一个版本号进行叠加)
停止之前运行中的docker镜像服务
启动本次最新构建的docker镜像
六、使用docker maven plugin插件构建镜像
从上面的打包到构建镜像的整个过程还是比较繁琐的,每一步出现错误都可能引起后面操作步骤的失败。那么是否还有更简单的方式来做这个事情呢?答案是肯定的,那就是使用docker-maven-plugin的方式来做。
6.1 docker maven plugin介绍
Docker Maven Plugin插件是一个 Maven 插件,它允许开发人员在构建过程中使用 Docker。使用该插件,开发人员可以在 Maven 构建过程中构建、运行和推送 Docker 镜像。这使得开发人员能够更轻松地集成 Docker 到他们的开发工作流程中,从而可以更方便地进行应用程序的构建和部署。
github地址:https://github.com/spotify/docker-maven-plugin
6.1.1 docker maven plugin 配置语法说明
要使用 Docker Maven 插件,你需要在 Maven 项目的 pom.xml
文件中添加相关配置。
1)你需要在 plugins
部分添加 Docker Maven 插件的依赖:
<build><plugins><plugin><groupId>io.fabric8</groupId><artifactId>docker-maven-plugin</artifactId><version>VERSION</version><configuration><!-- 插件的配置选项 --></configuration></plugin></plugins>
</build>
2)在 configuration 部分,你可以配置插件的选项,例如 Docker 镜像的名称、标签、构建上下文等。
6.1.2 Docker Maven 插件常用执行命令
可以使用以下命令来执行 Docker Maven 插件的常用功能
-
mvn docker:build
:构建 Docker 镜像; -
mvn docker:push
:推送 Docker 镜像到 Docker Registry; -
mvn docker:start
:启动 Docker 容器; -
mvn docker:stop
:停止 Docker 容器;
6.2 使用Docker Maven Plugin插件构建镜像
参考下面的操作步骤
6.2.1 添加插件配置信息
在当前工程的pom文件中,在pom中增加新的Docker Maven插件相关配置信息,其他的与上述保持一致,参考如下配置,结合里面的注释进行理解
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>io.fabric8</groupId><artifactId>docker-maven-plugin</artifactId><version>0.33.0</version><configuration><!-- Docker 推送镜像仓库地址(如果有,可以配置) --><!--<pushRegistry>http://localhost:5000</pushRegistry>--><images><image><!--由于推送到私有镜像仓库,镜像名需要添加仓库地址(相当于告诉去哪里拉取镜像)--><name>${project.name}:${project.version}</name><!--定义镜像构建行为--><build><!--定义基础镜像,这里使用的是JDK17--><from>openjdk:17</from><args><!-- jar的名称,一般配置为gav的av --><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></args><!--定义哪些文件拷贝到容器中--><assembly><!--定义拷贝到容器的目录--><targetDir>/</targetDir><!--只拷贝生成的jar包--><descriptorRef>artifact</descriptorRef></assembly><!--定义容器启动命令--><entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint><!--定义维护者--><maintainer>firefish</maintainer><!--使用Dockerfile构建时打开--><!--<dockerFileDir>${project.basedir}</dockerFileDir>--></build><!--定义容器启动行为--><run><!--设置容器名,可采用通配符,像下面这样(一般配置为gav的a)--><!--<containerNamePattern>%a-%i</containerNamePattern>--><containerNamePattern>${project.artifactId}</containerNamePattern><!--设置宿主机与容器的端口映射--><ports><port>8088:8088</port></ports><!--设置超时等待时间--><!--<wait><http><url>http://localhost:8088</url></http><time>20000</time></wait>--></run></image></images></configuration></plugin></plugins></build>
这个配置做了些什么事情呢?总结来说,主要做了下面的步骤:
- 引入docker-maven-plugin插件,通过maven坐标的方式进行引入;
- 在image标签中指定镜像名;
- 配置构建参数,即在build标签中配置;
- 比如指定镜像名称,拷贝jar包到镜像容器中,指定启动镜像的命令等;
- 定义容器的启动行为,比如指定容器对外的暴露端口;
6.2.2 添加一个测试接口
该接口给docker容器启动服务时候做服务检测时使用
@GetMappingpublic Object hello(){return "hello";}
调用一下确保接口可用
6.2.3 推送代码到gitee
推送到代码仓库,方便后续做持续集成
6.2.4 再次拉取代码
可以重新创建一个目录,然后拉取代码到该目录
6.2.5 打包构建镜像
使用上面介绍的命令进行镜像的打包构建,进入代码的主目录,执行打包构建命令
mvn package docker:build
执行之后,等待镜像包的构建完成即可,从下面的执行日志中不难看出,这里相当于是通过在pom中声明配置的方式,完成了类似Dockerfile中执行命令的编写。简单来说,这个命令的执行,就会自动进行编译,打包,构建镜像。
执行完成后,在target目录下生成了jar包
6.2.6 镜像检查
有没有生成镜像呢?通过docker images检查下,发现已经按照预期的目标生成了镜像
5.2.7 启动镜像
在上面介绍了基于这种方式的常用命令,使用下面的命令启动容器
mvn docker:start
然后通过docker ps命令,可以看到镜像的容器已经启动
5.2.8 访问接口
最后访问一下接口,看是否能够正常访问服务
5.2.9 打包阶段触发构建镜像
即在使用mvn package的时候就可以直接构建镜像了,可以再在上述配置的后面添加如下配置
<!--触发构建及推送操作的执行计划--><executions><!-- 定义特定的执行目标--><execution><!-- 执行的ID,用于唯一标识执行目标--><id>build</id><!-- 绑定到maven构建生命周期中的阶段,在此处为verify阶段--><phase>verify</phase><goals><!-- 指定构建docker镜像的目标--><goal>build</goal></goals></execution></executions>
七、使用dockerfile maven plugin插件构建镜像
从上面docker maven plugin的使用来看,需要在plugin中插件中配置较多的参数,虽然来说脱离了编写Dockerfile的麻烦,这也同时带来另一个问题,配置参数太多,对于初学者,或者对此研究不深的人来说,如果遇到某个参数配置错误,或者对某些配置参数不够理解,则在打包镜像的过程中遇到问题难以跨越,下面介绍另一种插件,即dockerfile maven plugin,使用这种插件,可以结合Dockerfile一起使用,同时配置参数更少,在实操过程中也将更为灵活。
7.1 dockerfile maven plugin概述
正常情况下,在开发一个应用程序后,会使用maven命令进行打包,生成对应的jar文件。而后,基于Dockerfile文件,使用docker-compose命令将jar文件build成一个镜像(docker image)。最后,就可以基于创建的镜像开启服务。这是在springboot工程中制作镜像的一般思路,在上文我们也做了演示。
如果使用dockerfile-maven-plugin 插件,可以在项目构建的时候自动生成镜像,也可以自动将生成的镜像push到指定的镜像库。
7.2 使用dockerfile maven plugin制作镜像
仍然以上面的代码为例,基于dockerfile maven plugin插件,来演示完整的镜像制作过程。
7.2.1 配置Dockerfile文件
在项目的根目录下添加一个Dockerfile文件,配置内容如下:
FROM openjdk:17-jdk-alpine
ARG JAR_FILE
ADD target/${JAR_FILE} /boot-docker.jar
ENTRYPOINT ["java","-jar","/boot-docker.jar"]
EXPOSE 8088
参数说明:
- FROM openjdk:17-jdk-alpine;
- 基础镜像,即容器中启动服务时依赖的jdk镜像,并指定具体版本;
- ARG JAR_FILE;
- ARG 构建参数的格式是:ARG <参数名>[=<默认值>],Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖。
- ADD target/${JAR_FILE} /boot-docker.jar
- 将构建的服务jar包添加到容器中;
- ENTRYPOINT,容器中服务器启动命令,可以扩展更多参数,比如指定启动时的jvm参数信息等;
- EXPOSE 8088,对外暴露的端口;
7.2.2 配置maven plugin信息
在build标签中添加dockerfile maven plugin的配置信息
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><executions><execution><id>default</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions><configuration><repository>congge/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin></plugins></build>
核心配置参数说明如下:
-
execution,指定了该插件build目标使用默认绑定。
-
默认情况下,build和tag目标绑定到package阶段,push目标绑定到deploy阶段,这里不涉及tag和push目标。
-
-
repository,表示生成的镜像的repository信息;
-
tag元素,指定生成镜像的tag,一般使用工程的版本号即可,这里使用Maven模块的版本号;
-
buildArgs,指定传递给Dockerfile的参数,比如上面Dockerfile中的JAR_FILE;
-
${project.build.finalName}.jar,是jar包路径,这里使用了最终生成的jar包的文件名;
7.2.3 代码推送与拉代码
重新拉取上面最新的代码到服务器目录
7.2.4 镜像打包
使用下面的命令执行工程的打包与镜像构建
mvn package
从日志也能清晰看到完整的过程,执行完成后,在当前的目录下,可以看到jar包已经生成
7.2.5 镜像检查
使用docker images命令检查镜像是否生成
7.2.6 启动镜像服务
有了镜像之后,就可以启动并使用了,使用下面的命令启动镜像服务
docker run -d -p 8088:8088 congge/boot-docker:1.0-SNAPSHOT
7.2.7 接口测试
最后再次访问一下上述提供的接口
7.3 dockerfile maven plugin补充说明
相关命令补充说明
7.3.1 跳过插件目标
如果要临时跳过所有的Dockerfile相关的目标,执行如下Maven命令:
mvn clean install -Ddockerfile.skip
7.3.2 跳过某一个goal
如果只是想跳过某一个goal,执行如下Maven命令:
mvn clean package -Ddockerfile.build.skipmvn clean package -Ddockerfile.tag.skipmvn clean deploy -Ddockerfile.push.skip
八、写在文末
本文通过较大的篇幅详细介绍了如何基于springboot服务构建镜像的几种方式,随着k8s在越来越多的项目中落地使用,服务的容器化部署已经成为一种传统部署的很好补充,值得深入学习和研究,本篇到此结束,感谢观看。
相关文章:

【微服务】springboot 构建镜像多种模式使用详解
目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …...

手写tomcat(Ⅲ)——tomcat动态资源的获取
仿写tomcat的Servlet接口体系 之前写过一篇博客,Tomcat的Servlet-GenericServlet-HttpServlet体系的具体结构,以及Servlet的生命周期 Servlet讲解 想要模仿tomcat获取动态资源,就需要我们自己仿写一个Servlet接口体系 主要包括:…...
软件测试面试题(四)
一:测试评估的目标? 量化测试进程 生成缺陷和测试覆盖率的总结报告 测试评估的问题 没有把测试覆盖率作为报告测试进程的根据,使得不知测试是否结束; 没有做测试缺陷评估,缺陷评估是量度软件可行性的重要指标&…...
infoq学习笔记-云原生网关当道,三大主流厂商如何“竞 技”?
注基础组件的质量,这些基础组件是用户看不到的。这些组件包括代码质量、自动化的CI/CD、端对端测试、混沌测试等。在APISIX中,我们内置了大 量的测试案例代码,包括单元测试、E2E测试、混沌测试,以及一些基准测试等,从而…...

Python中别再用 ‘+‘ 拼接字符串了!
大家好,在 Python 编程中,我们常常需要对字符串进行拼接。你可能会自然地想到用 操作符将字符串连接起来,毕竟这看起来简单明了。 在 Python 中,字符串是不可变的数据类型,这意味着一旦字符串被创建,它就…...
前端上传heic图片转jpe格式并展示
各大浏览器对 HEIC 格式图片的支持情况,包括上传和显示的支持度 浏览器版本HEIC 上传HEIC 显示Chrome版本 85 及以上支持不支持Firefox所有版本支持不支持Safari版本 11 及以上支持支持Edge版本 18 及以上支持不支持Opera所有版本支持不支持IE不支持不支持不支持 …...

VMware虚拟机-设置系统网络IP、快照、克隆
1.设置网络IP 1.点击右上角开关按钮-》有线 已连接-》有线设置 2.手动修改ip 3.重启或者把开关重新关闭开启 2.快照设置 快照介绍: 通过快照可快速保存虚拟机当前的状态,后续可以使用虚拟机还原到某个快照的状态。 1.添加快照(需要先关闭虚拟机) 2.在…...

指纹识别概念解析
目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来,指纹在侦破刑事案件、解决诉…...
图像处理神经网络数据预处理步骤的详细解释和分析
1. 尺寸调整(Resizing) 目的:神经网络通常需要固定尺寸的输入图像。通过统一图像尺寸,可以确保输入的一致性,使得网络能够正常处理。 方法:将所有输入图像调整为特定的尺寸(例如224x224像素&a…...

音视频开发4-补充 FFmpeg 开发环境搭建 -- 在windows 上重新build ffmpeg
本节的目的是在windows 上 编译 ffmpeg 源码,这样做的目的是:在工作中可以根据工作的实际内容裁剪 ffmpeg,或者改动 ffmpeg 的源码。 第一步 :下载, 安装,配置 ,运行 msys64 下载 下载地址&…...
第十二周笔记
微信小程序的自定义事件是指开发者可以自行定义并触发的事件,以实现特定的功能或逻辑。通过自定义事件,开发者可以更灵活地管理小程序的交互和数据流动,提升用户体验和开发效率。下面我将详细讲解微信小程序自定义事件,包括定义、…...

SketchUp v2024 v24.0.553 解锁版安装教程 (强大的绘图三维建模工具)
前言 SketchUp(简称SU,俗称草图大师)全球知名的三维建模软件,强大的绘图工具、建模渲染、扩展插件和渲染器模板、海量3D模型库及建模灯光材质渲染效果图,用于建筑师、城市规划专家、游戏开发等行业。 一、下载地址 …...
力扣题解记录
三元组队列、取出元组中的元素:腐烂的橘子...
Flutter 中的 ExpandIcon 小部件:全面指南
Flutter 中的 ExpandIcon 小部件:全面指南 Flutter 提供了一系列的动画图标,ExpandIcon 就是其中之一,它用于表示一个可以展开或收起的内容区域。这个小部件通常用于实现折叠列表、手风琴菜单或其他类似的UI元素。本文将为您提供一个全面的指…...

想转行程序员的朋友,有什么想问的在评论区随便问,我知道的都告诉你。
你想转行程序员吗? 我自己是法学院毕业后,通过2年的努力才转行程序员成功的。 我发现对于一个外行来说,找不到一个适合自己的方向,光靠努力在一个新的行业里成功异常艰难。即使你非常努力,但方向错了也会做大量的无用…...

Jenkins工具系列 —— 通过钉钉API 发送消息
文章目录 钉钉环境搭建使用钉钉API接口 发送消息机器人安全设置使用自定义关键词机器人安全设置使用加签方式 资料下载 钉钉环境搭建 在jenkins安装钉钉插件以及小机器人,这部分内容可参考:插件 钉钉发送消息 使用钉钉API接口 发送消息 机器人安全设置…...

MySQL--存储引擎
一、存储引擎介绍 1.介绍 存储引擎相当于Linux的文件系统,以插件的模式存在,是作用在表的一种属性 2.MySQL中的存储引擎类型 InnoDB、MyISAM、CSV、Memory 3.InnoDB核心特性的介绍 聚簇索引、事务、MVCC多版本并发控制、行级锁、外键、AHI、主从复制特…...

【经典文献】光-声立体成像:关于系统标定与三维目标重建
论文名称:《Opti-Acoustic Stereo Imaging: On System Calibration and 3-D Target Reconstruction》作者列表:Shahriar Negahdaripour, Hicham Sekkati, and Hamed Pirsiavash作者单位:美国迈阿密大学电气与计算机工程系,佛罗里达…...

弘君资本股市行情:股指预计保持震荡上扬格局 关注汽车、银行等板块
弘君资本指出,近期商场体现全体分化,指数层面上看,沪指一路震动上行,创出年内新高,创业板指和科创50指数体现相对较弱,依然是底部震动走势。从盘面体现上看,轮动依然是当时商场的主基调…...

看这两位东北圣女美吗?如何描写美女的大长腿?
看这两位东北圣女美吗?如何描写美女的大长腿? 最近署名为懂球娘娘的一篇描写东北圣女的文章火了,文中描述了海棠朵朵与辛芷蕾这两位娇媚动人的角色。其美艳动人的形象和魅力四溢的描写让人为之倾倒。 这种通过文字展现人物魅力的能力让人佩服…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...