Jenkins-pipeline语法说明
一. 简述:
Jenkins Pipeline 是一种持续集成和持续交付(CI/CD)工具,它允许用户通过代码定义构建、测试和部署流程。
二. 关于jenkinsfile:
1. Sections部分:
Pipeline里的Sections通常包含一个或多个Directives或 Steps:
a). agent:
指定整个Pipeline或特定阶段将在Jenkins环境中执行的节点位置,具体取决于该agent
部分的配置。该部分必须在pipeline
块内的顶层定义 ,但在stage中是可以使用的。
#agent可选项: 1). any:任何可用agent上执行。2). none:不会为整个Pipeline运行分配全局agent ,每个stage部分将需要包含其自己的agent部分3). label: 使用提供的label标签,在Jenkins环境中可用的代理上执行Pipeline或stage(agent { label 'my-defined-label' })4). node: agent { node { label 'labelName' } },等同于 agent { label 'labelName' },但node允许其他选项5). docker:执行Pipeline或stage时会动态供应一个docker节点去接受Docker-based的Pipelines。6). dockerfile: 使用从Dockerfile源存储库中包含的容器来构建执行Pipeline或stage eg:pipeline {agent none stages {stage('Example Build') {agent { docker 'maven:3-alpine' } steps {echo 'Hello, Maven'sh 'mvn --version'}}stage('Example Test') {agent { docker 'openjdk:8-jre' } steps {echo 'Hello, JDK'sh 'java -version'}}}
}常用选项:
#label : 标签,适用于node,dockr anddockerfile时,并且node是必须的
#customWorkspace: 自定workspace路径
#reuseNode:一个布尔值,默认为false。如果为true,则在同一工作空间中,。只适用于docker和dockerfile,并且仅在 individual stage中使用agent才有效eg:
agent {node {label 'my-defined-label'customWorkspace '/some/other/path'}
}
b). POST:
定义将在Pipeline运行或阶段结束时运行的操作。部分 always,changed,failure,success,unstable,和aborted。这些块允许在Pipeline运行或stage结束时执行,具体取决于Pipeline的状态。
#post 可选项:#always:无论Pipeline运行的完成状态如何。
#changed:当前Pipeline运行的状态与先前完成的Pipeline的状态不同时。
#failure:当前Pipeline处于“失败”状态时。
#success:当前Pipeline具有“成功”状态时
#unstable:当前Pipeline具有“不稳定”状态,如由测试失败,代码违例等引起。
#aborted:当前Pipeline处于“中止”状态时,通常是由于Pipeline被手动中止。eg:
pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'}}}post { always { echo 'I will always say Hello again!'}}
}通常情况下,post定义在pipeline的末端。
c). stages :包含一个或多个stage的序列,Pipeline的大部分工作在此执行。建议stages至少包含至少一个stage指令,用于连接各个交付过程,如构建,测试和部署等。
d). steps :
包含一个或多个在stage块中执行的step序列。
pipeline {agent anystages {stage('Example') {steps { echo 'Hello World'}}}
}
2. Directives(指令) 部分:
a). environment:
指定一系列键值对,这些键值对将被定义为所有step或stage-specific step的环境变量,具体取决于environment指令在Pipeline中的位置。该指令支持一种特殊的方法credentials(),可以通过其在Jenkins环境中的标识符来访问预定义的凭据。
pipeline {agent anyenvironment { CC = 'clang' # 顶级pipeline中定义的env适用于所有steps}stages {stage('Example') {environment { #只能适用于该过程的stepsAN_ACCESS_KEY = credentials('my-prefined-secret-text') #可在jenkins环境中通过其标示访问定义的凭据。}steps {sh 'printenv'}}}
}
b). options :
options指令允许在Pipeline本身内配置Pipeline专用选项。Pipeline本身提供了许多选项,例如buildDiscarder,但它们也可能由插件提供,例如 timestamps。
#可用选项:
buildDiscarder: pipeline保持构建的最大个数。
disableConcurrentBuilds: 不允许并行执行Pipeline,可用于防止同时访问共享资源等。
skipDefaultCheckout: 默认跳过来自源代码控制的代码。
skipStagesAfterUnstable: 一旦构建状态进入了“Unstable”状态,就跳过此stage。
timeout: 设置Pipeline运行的超时时间。
retry: 失败后,重试整个Pipeline的次数。
timestamps: 预定义由Pipeline生成的所有控制台输出时间。 eg:
pipeline {agent anyoptions {timeout(time: 1, unit: 'HOURS') #指定一个小时的全局执行超时,超出后中止运行}stages {stage('Example') {steps {echo 'Hello World'}}}
}
c). parameters :
提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline步骤。
#string: 字符串类型
#booleanparam: 布尔参数eg:
pipeline {agent anyparameters {string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')}stages {stage('Example') {steps {echo "Hello ${params.PERSON}"}}}
}
d). triggers(触发器):
定义了Pipeline自动化触发的方式。对于与源代码集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基于webhook的集成也已经存在。目前只有三个个可用的触发器:cron,pollSCM,upstream。
cron:接受一个cron风格的字符串来定义Pipeline触发的常规间隔,例如: triggers { cron('H 4/* 0 0 1-5') }
pollSCM:接受一个cron风格的字符串来定义Jenkins检查SCM源更改的常规间隔。如果存在新的更改,则Pipeline将被重新触发。例如:triggers { pollSCM('H 4/* 0 0 1-5') }
upstream: 接受逗号分隔的一系列作业和一个阈值。当字符串中的任何作业以定义的阈值结束时,管道将被重新触发,跨job。eg:
pipeline {agent anytriggers {cron('H */4 * * 1-5')}stages {stage('Example') {steps {echo 'Hello World'}}}
}
e). tools:
通过tools可自动安装工具,并放置环境变量到PATH。如果agent none,这将被忽略。
pipeline {agent anytools {//工具名称必须在Jenkins 管理Jenkins → 全局工具配置中预配置。maven 'apache-maven-3.0.1'}stages {stage('Example') {steps {sh 'mvn --version'}}}
}
f). when:
允许Pipeline根据给定的条件确定是否执行该阶段。该when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为stage执行返回true。这与子条件嵌套在一个allOf条件中相同(见下面的例子)。
更复杂的条件结构可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度。
#内置参数:
branch: 当正在构建的分支与给出的分支模式匹配时执行
environment:当指定的环境变量设置为给定值时执行
expression:当指定的Groovy表达式求值为true时执行
not:当嵌套条件为false时执行。必须包含一个条件
allOf:当所有嵌套条件都为真时执行。必须至少包含一个条件
anyOf:当至少一个嵌套条件为真时执行。必须至少包含一个条件eg:
pipeline {agent anystages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when {branch 'production'}steps {echo 'Deploying'}}}
}
3. Parallel(并行):
对耗时长,相互不存在依赖的stage可以使用此方式提升运行效率。除了parallel stage,单个parallel里的多个step也可以使用并行的方式运行。
pipeline {agent anystages {stage('Non-Parallel Stage') {steps {echo 'This stage will be executed first.'}}stage('Parallel Stage') {when {branch 'master'}failFast trueparallel {stage('Branch A') {agent {label "for-branch-a"}steps {echo "On Branch A"}}stage('Branch B') {agent {label "for-branch-b"}steps {echo "On Branch B"}}}}}
}
script:
需要一个script Pipeline,并在Declarative Pipeline中执行。对于大多数用例,script在Declarative Pipeline中的步骤不是必须的,但它可以提供一个有用的加强(groovy ?)。
pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'script {def browsers = ['chrome', 'firefox']for (int i = 0; i < browsers.size(); ++i) {echo "Testing the ${browsers[i]} browser"}}}}}
}
相关文章:
Jenkins-pipeline语法说明
一. 简述: Jenkins Pipeline 是一种持续集成和持续交付(CI/CD)工具,它允许用户通过代码定义构建、测试和部署流程。 二. 关于jenkinsfile: 1. Sections部分: Pipeline里的Sections通常包含一个或多个Direc…...
MySQL(3)运算符、排序与分页
运算符 一、算术运算符 加减乘除余 举例: SELECT 1001 FROM DUAL; 结果为101,与java中的连接字符串不同。 SELECT 100A FROM DUAL; 结果为100。 也可以理解为,遇到非数值类型时,先转换为数值类型(如2可以转换…...
Kafka面试题----Kafka消息是采用Pull模式,还是Push模式
Pull 模式为主 消费者主动拉取:Kafka 中的消费者是基于 Pull 模式来获取消息的。消费者通过向 Kafka 集群发送拉取请求,主动地从 Broker 中获取消息。这种方式使得消费者可以根据自身的消费能力和处理速度来灵活地控制消息的拉取频率和数量,…...
BLE透传方案,IoT短距无线通信的“中坚力量”
在物联网(IoT)短距无线通信生态系统中,低功耗蓝牙(BLE)数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输,最高能满足2Mbps的数据传输速率&…...
借助 .pth 文件完成多个 Python 解释器的合并
相关搜索 conda 虚拟环境如何使用 ROS 的 Python 模块conda 虚拟环境找不到 catkin_pkg 问题描述 如果你在 Ubuntu 20.04 中装了 conda,那么你的 Ubuntu 会有这些 Python 解释器: /usr/bin/python3:系统的解释器 (版本为 3.8.10࿰…...
今天也是记录小程序进展的一天(破晓时8)
嗨嗨嗨朋友们,今天又来记录一下小程序的进展啦!真是太激动了,项目又迈出了重要的一步,231啦!感觉每一步的努力都在积累,功能逐渐完善,离最终上线的目标越来越近了。大家一直支持着这个项目&…...
python高级加密算法AES对信息进行加密和解密
AES(高级加密标准)是一种广泛使用的对称加密算法,它以字节为单位处理数据,将明文分组加密成密文。AES算法的核心在于一个轮函数,该函数会对数据执行多次变换,包括字节代换、行移位、列混合和轮密钥加。这些…...
# [Unity]【游戏开发】 脚本生命周期与常见事件方法
在Unity中,脚本的生命周期是指脚本从创建到销毁的整个过程,以及在此过程中触发的各类事件。掌握脚本生命周期对优化游戏开发过程和避免性能问题至关重要。本文将详细探讨脚本生命周期的关键事件、常见的事件方法,并通过实例说明如何在合适的时机执行脚本逻辑,以确保游戏的流…...
《探秘鸿蒙Next:非结构化数据处理与模型轻量化的完美适配》
在鸿蒙Next的人工智能应用场景中,处理非结构化数据并使其适配模型轻量化需求是一项关键且具有挑战性的任务。以下是一些有效的方法和策略。 数据预处理 数据清洗:非结构化数据中往往存在噪声、重复和错误数据。对于文本数据,要去除乱码、特殊…...
Spring Boot框架下的上海特产销售商城网站开发之旅
摘要 本项目基于Spring Boot框架开发,旨在创建一个网络上海特产销售商城网站。在黄菊华老师的指导下,该项目不仅涵盖了核心代码讲解和答辩指导,还提供了详尽的开发文档、开题报告、任务书及PPT等毕业设计辅导材料。黄老师是《Vue.js入门与商城…...
HTML 基础入门:核心标签全解析
在网页开发的世界里,HTML(超文本标记语言)是基石般的存在。它负责构建网页的基本结构,为用户呈现出丰富多样的内容。今天,就让我们一起深入了解 HTML 中几个极为关键的基础标签,开启网页创作的第一步。 一…...
Docker基础安装与使用
Docker 简介 Docker 是一个开源的容器化平台,用于开发、部署和运行应用程序。它通过将应用程序及其依赖项打包到一个轻量级的、可移植的容器中,实现了应用程序的快速部署和跨环境一致性。 Docker 的核心概念 容器(Container)&a…...
基于Docker的Spark分布式集群
目录 1. 说明 2. 服务器规划 3. 步骤 3.1 要点 3.2 配置文件 3.2 访问Spark Master 4. 使用测试 5. 参考 1. 说明 以docker容器方式实现apache spark计算集群,能灵活的增减配置与worker数目。 2. 服务器规划 服务器 (1master, 3workers) ip开放端口备注ce…...
物业管理软件引领智能社区高效服务与管理创新
内容概要 物业管理软件是在智能社区建设中不可或缺的重要工具。随着城市化进程的加速,社区管理的复杂性也在不断上升,如何提高服务效率和管理水平,已经成为物业公司面临的主要挑战。在这样的背景下,物业管理软件以其强大的功能和…...
NoETL | 数据虚拟化如何在数据不移动的情况下实现媲美物理移动的实时交付?
在我们之前的文章中,我们回顾了Denodo在逻辑数据仓库和逻辑数据湖场景中所使用的主要优化技术(具体内容请参阅之前的文章)。 数据架构 | 逻辑数据仓库与物理数据仓库性能对比_物理数仓、逻辑数仓-CSDN博客文章浏览阅读1.5k次,点赞…...
ovs实现lb负载均衡
负载均衡定义 负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。常见的实现方式包括: 二层负载均衡:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均…...
2025 OWASP十大智能合约漏洞
随着去中心化金融(DeFi)和区块链技术的不断发展,智能合约安全的重要性愈发凸显。在此背景下,开放网络应用安全项目(OWASP)发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…...
在亚马逊云科技上用AI提示词优化功能写出漂亮提示词(下)
提示工程(Prompt Engineering)对各位小伙伴们来说是再熟悉不过了,提示词工程技术是通过编写指令词,指导开发者们调用AI基础模型(FMs)获得期望的响应。但是经常写提示词的朋友们会知道,为了获取理…...
智能鞋利用机器学习和深度学习技术进行患者监测和步态分析的演变与挑战
概述 近年来,创新型 "智能鞋 "层出不穷,将物联网(IoT)和可穿戴设备技术融入 "鞋 "中,成为我们日常生活中不可或缺的一部分。智能鞋可以通过鞋中嵌入的电子元件、传感器、微处理器和其他技术&…...
Unity编辑拓展显示自定义类型
配合自定义特性或着header可以添加注解 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.Reflection; using System; using Unity.VisualScripting;#if UNITY_EDITORpublic class EditorRender {public sta…...
Unity预制体未即时刷新
有时候在用代码修改预制体某个组件中的属性时,可能原本预制体未及时刷新: 可以使用PrefabUtility.SavePrefabAsset(gameobject)等函数,使得使用代码修改之后马上刷新生效。 一、AssetDatabase.Refresh() 功能: AssetDatabase.Re…...
SSO VS OAuth2区别
目录 理解认证与授权 Single Sign On(SSO) 编辑 OAuth2 OAuth2协议理解 Access Token的秘密 SSO与OAuth2的关系 理解认证与授权 Single Sign On(SSO) 示例图 1、用户通过浏览器访问系统 Protected APP(Goto app) 2、Protected APP 发现没有登录…...
12_PlayerPrefs存储登录窗口逻辑_回调函数优化Lamd表达式
创建 登录窗口LoginWnd.cs 绑定 登录窗口LoginWnd.cs 编写 登录窗口LoginWnd.cs using UnityEngine; using UnityEngine.UI; //输入文本 命名空间 //功能 : 登录注册窗口 public class LoginWnd : MonoBehaviour{public InputField iptAcct;public InputField iptPass;public …...
蒙操作系统(HarmonyOS)
鸿蒙操作系统(HarmonyOS)是由华为技术有限公司开发的面向未来、面向全场景的分布式操作系统。它旨在为各种不同类型的设备提供统一的操作系统和无缝的智能体验,从智能手机到可穿戴设备,再到智能家居产品等。在鸿蒙的应用生态中&am…...
PHP同城配送小程序
🚀 同城极速达——您生活中的极速配送大师 📱 一款专为现代都市快节奏生活量身打造的同城配送小程序,同城极速达,集高效、便捷、智能于一身,依托ThinkPHPGatewayWorkerUniapp的强大架构,巧妙融合用户端、骑…...
C#语言的学习路线
C#语言的学习路线 C#作为一种现代编程语言,凭借其简洁的语法、强大的功能和广泛的应用,得到了越来越多开发者的青睐。无论是开发桌面应用、Web应用、游戏,还是云服务,C#都有着广泛的应用场景。本文将为有志于学习C#的读者提供一条…...
js手写-实现Promise的then方法
简单引入then 代码 const PROMISE_STATUS_PENDING "pending";const PROMISE_STATUS_FULFILLED "fulfilled";const PROMISE_STATUS_REJECTED "rejected";class MyPromise {constructor(executor) {//status -- 存储promise的状态this.status…...
分布式系统通信解决方案:Netty Marshalling 全面解析
分布式系统通信解决方案:Netty Marshalling 全面解析 一、引言 在现代网络编程中,Netty 作为一款高性能、异步事件驱动的网络应用框架,因其强大的功能和灵活的扩展性,备受开发者青睐。Netty 广泛应用于分布式系统、RPC 框架以及…...
如何轻松实现域名指向服务器
在互联网时代,域名指向服务器是网站上线的关键步骤。域名是用户访问网站的入口,而服务器则是存储网站数据的地方。将域名正确指向服务器,能让用户顺利访问网站内容。虽然这个过程对新手来说可能有些陌生,但只要掌握正确的方法&…...
Java Web开发高级——单元测试与集成测试
测试是软件开发的重要环节,确保代码质量和功能的正确性。在Spring Boot项目中,单元测试和集成测试是常用的两种测试类型: 单元测试:测试单个模块(如类或方法)是否按预期工作。集成测试:测试多个…...
第九篇: 3.10. 【watchEffect】实现监听,立即执行函数
官网:立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行该函数。 watch对比watchEffect 都能监听响应式数据的变化,不同的是监听数据变化的方式不同 watch:要明确指出监视的数据 watchEffect&#x…...
【C++】模板(进阶)
本篇我们来介绍更多关于C模板的知识。模板初阶移步至:【C】模板(初阶) 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参,也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …...
有了TiDB,是否还需要“散装”大数据组件?
有了TiDB,是否还需要“散装”大数据组件? 最近和同事们讨论一个问题:在大数据应用日益增多的今天,如果使用了TiDB这样的一体化数据库,还需要使用那些传统的大数据组件(比如Hadoop、Spark等)吗&…...
OSCP - Proving Grounds - BullyBox
主要知识点 如果发现有域名,则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件,避免漏掉信息.git dump 具体步骤 执行nmap 扫描,发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…...
升级《在线写python》小程序的分享功能。昨天忘了...
小程序是使用uniapp写的,忘了开启分享功能,导致它现在是这样的。 挺不方便的,所以需要开启分享权限, 由于我这个没有其他需要隐藏的私密页面,所以事直接全局开启就行 在App.vue文件里的onShow里开启即可。加入如下代…...
Spingboot整合Netty,简单示例
Netty介绍在文章末尾 Netty介绍 项目背景 传统socket通信,有需要自身管理整个状态,业务繁杂等问题。 pom.xml <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.117.F…...
逆波兰表达式求值(力扣150)
这道题也是一道经典的栈应用题。为什么这样说呢?我们可以发现,当我们遍历到运算符号的时候,我们就需要操控这个运算符之前的两个相邻的数。这里相邻数不仅仅指最初数组里相邻的数,在进行了运算之后,得到的结果与后面的…...
Linux面试题
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
如何判断以太坊地址类型?
如何判断以太坊地址类型? 一、账户类型解释 2.1 以太坊外部账户(Externally Owned Account,EOA) 外部账户(EOA)是由私钥控制的账户,在以太坊网络中用来发送交易和执行其他操作。EOA 不是智能…...
有限元分析学习——Anasys Workbanch第一阶段笔记(14)静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立
目录 0 序言 1 静定与超静定问题 2 Workbranch中Supports介绍 3 简支梁挠度的有限元求解 4 自定义材料库建立 0 序言 静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立(内容对应视频22到24课)。 1 静定与超静定问题 在有限元分析中,不同的…...
为医院量身定制做“旧改”| 全视通物联网智慧病房
随着经济工作会议、卫生健康工作会议、“经济高质量发展成效”系列新闻发布会的依次召开,强基工程、三明医改、儿科和精神卫生服务年、中医药传承创新发展、促进生育、养老服务改革、病房改造提升行动...等关键词正成为新的热点,2025年卫生健康工作面临一…...
Java面试专题——面向对象
面向过程和面向对象的区别 面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。 面向对象:注重找“参与者…...
PHP异步非阻塞MySQL客户端连接池
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
【Linux 源码】内核态到用户态
文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 首…...
goland map学习-实践使用练习:判断存在及遍历
对于数据: type Person struct {Address stringAge intJob stringName string }type People map[string]Personvar per People{"1": Person{Address: "1",Age: 1,Job: "1",Name: "1",},"2&quo…...
【威联通】FTP服务提示:服务器回应不可路由的地址。被动模式失败。
FTP服务器提示:服务器回应不可路由的地址。被动模式失败。 问题原因网络结构安全管理配置服务器配置网关 问题 FTP服务器提示:服务器回应不可路由的地址…...
两份PDF文档,如何比对差异,快速定位不同之处?
PDF文档比对是通过专门的工具或软件,自动检测两个PDF文件之间的差异,并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分,帮助用户快速定位…...
Vue.js 组件之间的通信模式
Vue.js 组件之间的通信模式 组件之间的通信模式 在 Vue.js 中,组件之间的通信是构建复杂应用的关键。根据组件之间的关系和需求,Vue 提供了多种通信方式。本文介绍了常见的通信模式及其详细示例。 一、父子组件通信 1. 父组件向子组件传递数据&#…...
【Linux 重装】Ubuntu 启动盘 U盘无法被识别,如何处理?
背景 U盘烧录了 Ubuntu 系统作为启动盘,再次插入电脑后无法被识别 解决方案(Mac 适用) (1)查找 USB,(2)格式化(1)在 terminal 中通过 diskutil list 查看是…...
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...