Jenkins入门使用详解,实现构建部署运行

news2024/11/23 21:00:46

Hi I’m Shendi


Jenkins入门使用详解,实现构建部署运行



Jenkins简介

Jenkins 是一个用 Java 编写的开源自动化工具

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

CI 指持续集成,属于开发人员的自动化流程

CD 指持续交付和/或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度。

Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。



下载安装运行

对于设备的要求:https://www.jenkins.io/zh/doc/book/installing/#prerequisites

进入 jenkins 官网下载:https://www.jenkins.io/zh/download/

在这里插入图片描述


我系统是windows,所以选的windows,下载完后是一个msi的文件,打开运行进行安装

一路next,到如下窗口

在这里插入图片描述


第一个选项是将服务运行在本地系统上,第二个是运行在指定用户上,可以直接选择第一个选项然后Next

然后是运行的端口,默认是8080,点Test Port然后继续Next

选择JDK所在地址,Next,Next,Install,开始安装。


在windows上可能会因为没有权限而按照失败,报2503等错误

解决办法如下

  1. 打开管理员权限的命令行,例如Win+X,然后按下A
  2. 输入 msiexec /package jenkins.msi的文件路径

后面的步骤和上面一致



安装完成后,目录结构如下

在这里插入图片描述


进行以下操作

  1. 打开终端进入到下载目录.
  2. 运行命令 java -jar jenkins.war --httpPort=8080.
  3. 打开浏览器进入链接 http://localhost:8080.

我使用的是windows,msi方式安装,所以第二步就不需要了,因为安装完后会自动启动(安装时填写的端口)


进入链接,界面如下,要等待

在这里插入图片描述

大概几秒钟,如果一直都是这个界面,那就打开浏览器控制台(F12),查看是否有以下的错误

GET http://localhost:8080/login?from=%2F 503 (Service Unavailable)

如果有,则需要进行以下操作

  1. 进入jenkins的工作目录:C:\ProgramData\Jenkins
  2. 进入.jenkins目录,打开hudson.model.UpdateCenter.xml进行修改
  3. 将url中的 https://updates.jenkins.io/update-center.json 修改为 http://mirror.xmission.com/jenkins/updates/update-center.json

进入jenkins安装目录,使用以下命令重启

jenkins restart


访问链接,界面显示如下

在这里插入图片描述


按照说明,进行配置即可,后面创建密码,如果选择的使用admin,那么密码默认就是上面解锁 Jenkins 的密码

dashboard界面如下

在这里插入图片描述



创建您的第一个Pipeline,实现hello,world


New Item介绍

  1. Freestyle project(自由风格项目):这个选项允许用户创建一个自定义的项目,可以执行任何任务,无论是构建、测试、部署还是其他工作。
  2. Pipeline(流水线项目):这个选项允许用户创建一个Jenkins Pipeline,在Pipeline中定义了一系列流程和任务,可以自动化构建、测试、打包、发布和部署过程。
  3. Multibranch Pipeline(多分支流水线项目):这个选项可以创建一个多分支Pipeline项目,同时支持不同的分支构建和测试。
  4. Folder:文件夹,用于组织和管理 Jenkins 中的多个项目


新建Item,输入工程的名称(例如 My Pipeline) ,选择多分支流水线(Multibranch Pipeline),确定

会进入到新建Item的Configuration(配置),点击增加源(Add Source),选择您想要使用的仓库类型并填写详细信息.

在这里插入图片描述


填写对应信息,例如我选择的Git,桌面上有一个Test文件夹,使用 git init 初始化,如何将路径填到项目仓库

在这里插入图片描述


点击保存,就会开始运行扫描,最终看到Success的信息就代表成功了

在这里插入图片描述



在配置好 Pipeline 之后,Jenkins 会自动检测您仓库中创建的任何新的分支或合并请求, 并开始为它们运行 Pipelines。

在项目下新建一个文件夹,命名为 Jenkinsfile注意大小写 ,具体查看Jenkins工程的配置内容

在这里插入图片描述


Jenkinsfile文件具体内容可以参考官方文档

例如

pipeline {
    agent any
    stages {
        stage('Hello') {
            steps {
                sh 'echo hello,world'
            }
        }
    }
}


更改了内容重新 git addgit commit

然后在 Jenkins 中点立刻Scan…

在这里插入图片描述


然后查看Scan多分支流水线日志,有这样的内容代表 Jenkinsfile 被找到了

Checking branches...
  Checking branch master
      ‘Jenkinsfile’ found
    Met criteria

接下来可以点击状态来查看,会发现有内容了,但是运行是失败

在这里插入图片描述


点击右边的 #8,然后选择 Console Output 查看日志

可以看到报错内容如下

ERROR: Checkout of Git remote 'C:\Users\Administrator\Desktop\Test' aborted because it references a local directory, which may be insecure. You can allow local checkouts anyway by setting the system property 'hudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT' to true.

这个是因为我使用的本地的git用来测试,所以需要配置一下,在jenkins安装目录找到 jenkins.xml

打开,并修改,加上这一句

-Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true

在这里插入图片描述


然后使用 jenkins restart 来重启jenkins


进入Jenkins,重新运行,发现报错改为了找不到文件

java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
	at java.base/java.lang.ProcessImpl.create(Native Method)
	at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:494)
	at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159)
Caused: java.io.IOException: Cannot run program "nohup" (in directory "C:\ProgramData\Jenkins\.jenkins\workspace\Test_master"): CreateProcess error=2, 系统找不到指定的文件。

因为我使用的是windows,所以要更改Jenkinsfile文件,将其中的sh改为bat(sh是在linux中使用的)


改完后重新 git addgit commit,jenkins中重新扫描运行

可以看到运行成功了

在这里插入图片描述


点进去查看Console Output,可以看到输出的 hello,world

在这里插入图片描述



配置

在Jenkins主页点击Manager Jenkins,Global Tool Configuration来配置Maven,JDK,Git等。



Jenkinsfile


执行多个步骤

Pipelines 由多个步骤(step)组成,允许你构建、测试和部署应用。 Jenkins Pipeline 允许您使用一种简单的方式组合多个步骤, 以帮助您实现多种类型的自动化构建过程。

可以把“步骤(step)”看作一个执行单一动作的单一的命令。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败。

当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功。

具体可以直接参考官方文档:https://www.jenkins.io/zh/doc/pipeline/tour/running-multiple-steps/


timeout 代表超时,retry代表重试/循环,可嵌套使用,例如执行五次 ./flakey-deploy.sh,如果超过三分钟则超时,状态为失败

steps {
    timeout(time: 3, unit: 'MINUTES') {
        retry(5) {
	        sh './flakey-deploy.sh'
        }
	}
}

当 Pipeline 运行完成时,你可能需要做一些清理工作或者基于 Pipeline 的运行结果执行不同的操作, 这些操作可以放在 post 部分。

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'echo "Fail!"; exit 1'
            }
        }
    }
    post {
        always {
            echo 'This will always run'
        }
        success {
            echo 'This will run only if successful'
        }
        failure {
            echo 'This will run only if failed'
        }
        unstable {
            echo 'This will run only if the run was marked as unstable'
        }
        changed {
            echo 'This will run only if the state of the Pipeline has changed'
            echo 'For example, if the Pipeline was previously failing but is now successful'
        }
    }
}


定义执行环境

您可能已经注意到每个示例中的 agent 指令。 agent 指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。 正如您所预料的,所有的Pipeline都需要 agent 指令。

在执行引擎中,agent 指令会引起以下操作的执行:

  • 所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。
  • 一个工作空间 workspace 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件

例如

pipeline {
    agent {
        docker { image 'node:7-alpine' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

agent 指令更多选项和相关信息,可以查看 语法参考 。



使用环境变量

环境变量可以像下面的示例设置为全局的,也可以是阶段(stage)级别的。 如你所想,阶段(stage)级别的环境变量只能在定义变量的阶段(stage)使用。

使用 environment 来设置环境变量,例如

pipeline {
    agent any

    environment {
        DISABLE_AUTH = 'true'
        DB_ENGINE    = 'sqlite'
    }

    stages {
        stage('Build') {
            steps {
                sh 'printenv'
            }
        }
    }
}

上面的 printenv 是Linux用于显示系统环境变量与值的命令


在使用中,可以通过 ${} 的方式来获取,也可以使用 ${env.} 来获取,建议使用 env 这种方式,例如

pipeline {
    agent any

    environment {
        DISABLE_AUTH = 'true'
        DB_ENGINE    = 'sqlite'
    }

    stages {
        stage('Build') {
            steps {
                bat 'echo ${env.DISABLE_AUTH}'
            }
        }
    }
}


记录测试和构建结果

虽然测试是良好的持续交付过程中的关键部分,但大多数人并不希望筛选数千行控制台输出来查找有关失败测试的信息。 为了简化操作,只要您的测试运行时可以输出测试结果文件,Jenkins 就可以记录和汇总这些测试结果。 Jenkins 通常与 junit 步骤捆绑在一起,但如果您的测试运行结果无法输出 JUnit 样式的 XML 报告, 那么还有其他插件可以处理任何广泛使用的测试报告格式。

Jenkins的记录测试和构建结果通常用于测试环境中


例如

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh './gradlew build'
            }
        }
        stage('Test') {
            steps {
                sh './gradlew check'
            }
        }
    }

    post {
        always {
            archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: true
            junit 'build/reports/**/*.xml'
        }
    }
}

其中 stage(‘Test’) 部分是执行测试用例,执行的Gradle的命令,maven则 mvn test

通过 archiveArtifacts 步骤和文件匹配表达式可以很容易的完成构建结果记录和存储



清理和通知

因为 post 部分保证在 Pipeline 结束的时候运行, 所以我们可以添加通知或者其他的步骤去完成清理、通知或者其他的 Pipeline 结束任务。

参考官方文档:https://www.jenkins.io/zh/doc/pipeline/tour/post/



部署

大多数最基本的持续交付 Pipeline 至少会有三个阶段:构建、测试和部署,这些阶段被定义在 Jenkinsfile 中。 这一小节我们将主要关注部署阶段,但应该指出稳定的构建和测试阶段是任何部署活动的重要前提。

stage代表阶段


pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying'
            }
        }
    }
}

阶段即为部署环境

一个常见的模式是扩展阶段的数量以获取额外的部署环境信息, 如 “staging” 或者 “production”,如下例所示。

stage('Deploy - Staging') {
    steps {
        sh './deploy staging'
        sh './run-smoke-tests'
    }
}
stage('Deploy - Production') {
    steps {
        sh './deploy production'
    }
}

在这个示例中,我们假定 ./run-smoke-tests 脚本所运行的冒烟测试足以保证或者验证可以发布到生产环境。 这种可以自动部署代码一直到生产环境的 Pipeline 可以认为是“持续部署”的一种实现。 虽然这是一个伟大的想法,但是有很多理由表明“持续部署”不是一种很好的实践, 即便如此,这种方式仍然可以享有“持续交付”带来的好处。 [1] Jenkins Pipeline可以很容易支持两者。


人工确认

通常在阶段之间,特别是不同环境阶段之间,您可能需要人工确认是否可以继续运行。 例如,判断应用程序是否在一个足够好的状态可以进入到生产环境阶段。 这可以使用 input 步骤完成。 在下面的例子中,“Sanity check” 阶段会等待人工确认,并且在没有人工确认的情况下不会继续执行。

pipeline {
    agent any
    stages {
        /* "Build" and "Test" stages omitted */

        stage('Deploy - Staging') {
            steps {
                sh './deploy staging'
                sh './run-smoke-tests'
            }
        }

        stage('Sanity check') {
            steps {
                input "Does the staging environment look ok?"
            }
        }

        stage('Deploy - Production') {
            steps {
                sh './deploy production'
            }
        }
    }
}


实现自动化部署

一般会使用一台单独的服务器安装 Jenkins,然后通过远程命令的方式来操作其他服务器

需要在Jenkins中安装插件:Publish Over SSHVersion


因我目前只有一台服务器,所以不使用远程部署方式


这里使用一个SpringBoot项目(Maven)作为示例,其余语言/项目大同小异

可以把 Jenkins 理解为从 Git 上拉取代码,然后执行命令的工具


拉取的代码在哪个文件夹?

windows一般在 C:\ProgramData\Jenkins\.jenkins\workspace

可以在Jenkins的运行控制台中查看到路径

在这里插入图片描述



Jenkinsfile

分为构建,测试,运行三阶段

Maven中,构建使用 mvn clean package,但是默认会在构建后执行测试,只需要构建则加上-DskipTests

测试使用 mvn test 命令

运行一般会格外写一个脚本,Linux上写sh,Windows上写bat,Java项目的话,内容为

java -Dfile.encoding=UTF-8 -jar target/my.jar

Jenkinsfile文件内容如下

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                bat 'mvn -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                bat 'mvn test'
            }
        }
        stage('Deliver') { 
            steps {
                bat 'run'
            }
        }
    }
    post {
	    always {
	        junit 'target/surefire-reports/*.xml' 
	    }
	}
}

需要注意的是Deliver部分,去运行了一个名为 run.bat 的脚本文件,需要确保这个文件不会被卡住,例如上面描述的 java -jar,运行后就会一直在执行Java程序了,导致阶段一直不能被完成。

在windows中可以通过加上 start 来在新命令行运行

start java -Dfile.encoding=UTF-8 -jar target/my.jar

在windows中,通常控制台会报错:拒绝访问。

具体解决办法我写了另一篇文章:Jenkins在Windows上运行start java报拒绝访问及阶段执行完后取消自动关闭程序的问题解决 - https://sdpro.top/blog/html/article/1050.html


这样又会出现一个问题,因为是自动化,程序运行后不会被关闭,会导致代码更新后再次运行报错,端口被占用的问题

为了解决这个问题,需要在最开始的时候运行关闭程序的脚本,可自行编写或百度到关闭程序的脚本,例如通过端口来关闭

set port=9915
set portpid=none
FOR /F "tokens=1-5" %%i IN ('netstat -ano^|findstr ":%port%"') DO @set portpid=%%m
if not %portpid% ==none ( taskkill /pid %portpid% /f ) else ( echo here is no pid for port %port% )
echo port:%port%

最终的Jenkinsfile内容如下

pipeline {
    agent any
    stages {
    	stage('Init') {
    		steps {
    			bat 'stop'
    		}
    	}
        stage('Build') {
            steps {
                bat 'mvn -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                bat 'mvn test'
            }
        }
        stage('Deliver') {
            steps {
            	withEnv(['JENKINS_NODE_COOKIE=noKill']) {
			  		bat 'run'
				}
            }
        }
    }
    post {
	    always {
	        junit 'target/surefire-reports/*.xml' 
	    }
	}
}

最后,当代码有修改时只需要上到git,然后在Jenkins重新构建即可

当然,也可以配置触发器等…




END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539892.html

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

相关文章

【数据结构】--单链表力扣面试题①移除链表元素

题述&#xff1a; 给你一个链表的头结点head和一个整数val,请你删除链表中所有满足Node.val val的节点&#xff0c;并返回新的头结点。 思考&#xff1a; 为什么说要返回新的头结点&#xff0c;因为你删除的可能存在把原来的头结点删除的情况&#xff0c;这时就需要有新的头结…

【机器学习】

说明&#xff1a;机器学习总结 0、数据集 1、贝叶斯分类器 &#xff08;一&#xff09;计算题 所有样本分为两类&#xff08;c &#xff09;&#xff1a;好瓜是、好瓜否 &#xff08;1&#xff09;计算先验概率&#xff1a;P(c ) &#xff08;2&#xff09;计算每个属性的条…

元宇宙:梦想能否照进现实?

开篇我想问大家一个问题&#xff1a;有没有想过人类的未来是什么样子&#xff1f; 就目前我们所能探索的世界&#xff0c;不论从空间上有跨越了几十亿光年的距离&#xff0c;还是从时间有上几万几亿年的演化&#xff0c;对于宇宙来说&#xff0c;我们人类实在是太过渺小、脆弱…

非暴力沟通模型

非暴力沟通模型 非暴力沟通的创始人是马歇尔.卢森堡&#xff0c;师从人本主义心理学之父卡尔.罗杰斯。《非暴力沟通》一书入选香港大学推荐的50本必读书籍之列。 模型介绍 非暴力沟通&#xff08;英文名称&#xff1a;NonviolentCommunication&#xff0c;简称NVC&#xff09;…

AMBER分子动力学模拟之结果分析(MMGB/PBSA)-- HIV蛋白酶-抑制剂复合物(4)

AMBER分子动力学模拟之结果分析(MMGB/PBSA)-- HIV蛋白酶-抑制剂复合物(4) 结合自由能计算 我们首先计算焙变&#xff0c;用到的是pbsa和gbsa方法。我们需要一下文件 三个top文件&#xff0c;pro.prmtop lig.prmtop com.prmtop&#xff1b;输入文件MM_GBSA.in&#xff1b;将要…

Nextcloud集成Onlyoffice实现协同办公。

Nextcloud 安装 LAMP&#xff08;LinuxApacheMySQLPHP&#xff09;方式。局域网单机模式。 安装环境&#xff1a; OS:ubuntu 22.04 Nextcloud&#xff1a;26 Apache&#xff1a;2.4.52 mysql&#xff1a;Server version: 8.0.33-0ubuntu0.22.04.1 (Ubuntu) php:PHP 8.1.2-1u…

(GCC)从零开始的ETH开发--STM32F407ZGTX

开发环境&#xff1a; windows10 软件&#xff1a; STM32CubeMX最新版本&#xff1a; gcc工具链&#xff1a; vscode 硬件&#xff1a; STM32F407ZGT6开发板&#xff0c;ETH原理图&#xff1a; ​ 根据硬件可知MAC和PHY之间的接口类型为RMII&#xff0c;且PHY使用的外…

【文老师软考数据库】(全)

目录 第一章 计算机系统基本知识 1.1 计算机系统 1.1.1 计算机硬件组成 1.1.2 中央处理单元 1.1.3 数据表示 1.1.4 校验码 1.2 计算机体系结构 1.2.1 体系结构分类 1.2.2 指令系统存 1.2.3 储系系统 1.2.4 输入/输出技术 1.2.5 总线结构 1.3 可靠性、性能、安全 …

Win10系统为什么又提示重装打印机驱动?

明明没干嘛&#xff0c;Win 10系统却提示需要重新安装打印机驱动程序。驱动人生就来说说Win10重新安装打印机驱动程序的原因及解决方法&#xff1a; 一般来说&#xff0c;如果用户更新了Win 10的操作系统&#xff0c;可能导致之前的打印机驱动错误或缺失&#xff0c;这时候就需…

运行KT001小车问题汇总

运行KT001小车问题汇总&#xff1a; Q: 在安装ros的时候&#xff0c;出现这样的问题是因为什么&#xff0c;是镜像文件里边缺少东西了吗&#xff0c;可以怎么解决&#xff1f; A: 导入的是vmk配置文件&#xff0c;缺少iso镜像文件&#xff0c;不影响ros的运行。 Q: 编辑好这个…

Android ANativeWindow 渲染画面

ANativeWindow 是 Android NDK&#xff08;Native Development Kit&#xff09;提供的一个C/C编程接口&#xff0c;用于与底层的图形系统进行交互&#xff0c;实现图像渲染和处理等功能。 使用方法&#xff1a;上层用 SurfaceView&#xff0c;传递 SurfaceView 的 Surface 给 n…

ChatGPT的插件能用了,每月 20 美元的实习生真香

文章目录 开启插件并使用其他补充缺点和不足总结 哈喽嗨&#xff01;你好&#xff0c;我是小雨青年&#xff0c;一名 追赶 AI 步伐的程序员。 自从上周 OpenAI 官宣了即将开放插件给 Plus 用户以来&#xff0c;这三天我就每天都会刷新ChatGPT 设置页面。 直到今天早上&#x…

SolVES模型应用(生态系统服务社会价值模型)

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

思迈特软件Smartbi荣登“2023未来银行科技服务商100强”

近日&#xff0c;中国科学院《互联网周刊》、eNet研究院联合发布了“2023未来银行科技服务商100强”企业榜单。思迈特软件以“商业智能BI产品”凭借在金融科技创新的独特优势及在银行数字化转型实践中的卓越成就荣耀上榜。 据了解&#xff0c;“未来银行科技服务商100强”榜单&…

SQL删除重复的记录(只保留一条)-窗口函数row_number()

文章目录 一、关于mysql表中数据重复二、聚合函数min(id)not in二、窗口函数row_number()四、补充&#xff1a;常见的窗口函数 一、关于mysql表中数据重复 关于删除mysql表中重复数据问题&#xff0c;本文中给到两种办法&#xff1a;聚合函数、窗口函数row_number()的方法。 (注…

ffmpeg-mpv配置详解04

mpv.conf 格式详解 存放位置 windows下 Roaming\mpv linux下在.conf/mpv # mpv conf ################################################################################ # 记忆播放[退出时记住播放状态、音量、播放速度、位置等] save-position-on-quit # 播放状态保存位置…

运行时栈帧结构与方法调用

1 运行时栈帧结构 Java虚拟机以方法作为最基本执行单元&#xff0c;“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 1.1 局部变量表 局部变量表的容量以变量槽为最小单位。 Java…

强化学习:贝尔曼方程(Bellman Equation)

∗ ∗ 重点&#xff1a;状态值、贝尔曼方程 ∗ ∗ **重点&#xff1a;状态值、贝尔曼方程** ∗∗重点&#xff1a;状态值、贝尔曼方程∗∗ return评估策略 在前面概念介绍中&#xff0c;我们知道了可以用 return 来评估一个策略的好坏。如图&#xff0c;有三个不同的策略&…

线性插值提高DDS相位分辨率

DDS&#xff08;Direct Digital Synthesizer&#xff09;即直接数字频率合成技术&#xff0c;主要由正弦查找表与控制器组成&#xff0c;通过控制器给出的相位&#xff0c;在正弦查找表中查找对应的正余弦值并予以输出。通过多个 DDS 信号的组合&#xff0c;可以进一步构建出 A…

【源码解析】Disruptor框架的源码解析

Disruptor初始化 初始化Disruptor实例 //单线程模式&#xff0c;获取额外的性能 Disruptor<MessageModel> disruptor new Disruptor<>(factory, bufferSize, executor,ProducerType.SINGLE, new BlockingWaitStrategy());创建RingBuffer实例 Deprecatedpublic D…