Spring Cloud Pipelines 入门实践
文章目录
- 1. 前言
- 2. Spring Cloud Pipelines 是做什么的
- 2.1. 预定义的流程
- 2.2. 集成测试和契约测试
- 2.3.部署策略
- 4. Spring Cloud Pipelines的使用示例
- 4.1. 创建一个Spring Boot应用
- 4.2. 将代码托管到GitHub仓库
- 4.3. 添加Spring Cloud Pipelines依赖
- 4.4. 配置Spring Cloud Pipelines
- 4.5. 创建Jenkinsfile
- 4.6. 提交变更到GitHub
- 4.7. 配置Jenkins
- 4.8. 触发持续交付流程
- 4.9. 查看流程运行结果
- 5. 参考文档
1. 前言
在今天的软件开发中,微服务架构已经成为一种主流的设计模式。与传统的单体应用相比,微服务架构具有许多优点,如更高的可扩展性、更强的故障隔离性,以及更快的开发和部署速度。然而,微服务架构也带来了新的挑战。其中一个主要的挑战是如何有效地管理和协调各个微服务之间的交互。对于一个大型的微服务系统来说,这可能会涉及到数十甚至数百个微服务。
另一个挑战是如何将微服务快速、安全地部署到生产环境。在微服务架构中,每个服务都可能独立地更新和部署。这意味着我们需要一种能够自动化这个过程的方法,以减少人工操作的错误并提高部署的效率。这就是所谓的持续交付流程。
为了解决这些挑战,Spring Cloud团队推出了Spring Cloud Pipelines项目。它是一个预先定义的持续交付管道集,用于部署和测试微服务应用。它的目标是提供统一的、生产级别的持续交付流程,以确保在部署到生产环境之前对应用程序进行全面的测试。
在接下来的文章中,我们将详细介绍Spring Cloud Pipelines的特性和组件,并通过 示例来演示如何使用它来管理微服务应用的持续交付流程。无论是微服务的新手还是资深开发者,我相信都能从中获取有价值的信息。
2. Spring Cloud Pipelines 是做什么的
Spring Cloud Pipelines 它提供了一套预定义的持续交付流程(管道),这些流程可用于部署和测试基于Spring Boot的微服务应用程序。
Spring Cloud Pipelines的一些主要特性和功能:
2.1. 预定义的流程
Spring Cloud Pipelines为提供了一套预定义的持续交付流程。这些流程包括了从代码提交到将应用部署到生产环境的所有步骤。每一个步骤都被设计为一个独立的阶段,可以根据需要对这些阶段进行自定义。
对不起,我可能不能提供一个完整的示例,因为这需要一个真实的代码库和一个完整的持续集成/持续交付(CI/CD)环境。然而,我可以详细地描述一下如何设置和使用Spring Cloud Pipelines。
假设已经有一个基于Spring Boot的微服务应用,并且已经设置了一个CI/CD环境(例如Jenkins,GitLab CI或Concourse)。
首先,需要在的项目中添加Spring Cloud Pipelines的依赖。可以在项目的pom.xml文件中添加以下依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-pipelines</artifactId><version>${spring-cloud.version}</version>
</dependency>
然后,需要配置Spring Cloud Pipelines。在src/main/resources/application.yml文件中,添加以下配置:
spring:cloud:pipelines:deploy:prod:services: my-service
这里,my-service
是的微服务的名字。
接下来,需要在的CI/CD环境中设置Spring Cloud Pipelines的任务。在Jenkins中,可以创建一个新的Jenkinsfile,然后定义以下阶段:
这里,我们定义了Build
、Test
和Deploy to prod
三个阶段。每个阶段都使用Maven命令来执行。
pipeline {stages {stage('Build') {steps {sh "./mvnw clean package"}}stage('Test') {steps {sh "./mvnw test"}}stage('Deploy to prod') {steps {sh "./mvnw spring-cloud:deploy -Dspring.profiles.active=prod"}}}
}
2.2. 集成测试和契约测试
集成测试和契约测试是微服务架构中的重要组成部分。在微服务架构中,各个服务间相互独立,通过网络接口进行通信。因此,确保这些服务能正确地协同工作尤为重要。
集成测试:
在集成测试阶段,Spring Cloud Pipelines会启动的应用以及所有的依赖服务。然后,它会运行一系列测试用例,这些测试用例会模拟真实的业务场景,并触发应用与其依赖服务的交互。通过分析测试结果,可以验证的应用是否能够正确地与其他服务进行通信,并执行预期的业务逻辑。
Spring Cloud Pipelines使用Spring Boot的集成测试支持来完成这个过程。只需要编写相应的测试用例,Spring Boot会自动启动应用和依赖的服务,并运行这些测试。
契约测试:
在契约测试阶段,Spring Cloud Pipelines会使用Spring Cloud Contract来验证的应用是否符合其所依赖的服务的契约。
契约是一种描述服务间如何交互的规范。例如,一个服务可能期望另一个服务的某个接口返回特定格式的数据。Spring Cloud Contract能帮助自动化这种契约的验证过程。
首先,需要定义契约。这通常是一个以YAML或Groovy DSL格式编写的文件,描述了服务的请求和响应应该遵循的规则。
然后,Spring Cloud Contract会为每个契约生成一组测试用例。这些测试用例会模拟服务的请求,并验证响应是否符合契约。
最后,Spring Cloud Pipelines会运行这些测试用例,如果所有的测试都通过,那么说明的应用符合其依赖的服务的契约。
通过集成测试和契约测试,Spring Cloud Pipelines能帮助确保的微服务应用在部署到生产环境前能正确地与其他服务进行通信。
假设我们在开发一个订单服务,这个服务依赖于一个库存服务。当创建一个新订单时,订单服务需要调用库存服务来检查所需商品的库存。
在订单服务中创建一个集成测试。这个测试会启动订单服务和库存服务,然后模拟创建订单的过程
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class OrderServiceIntegrationTest {@Autowiredprivate TestRestTemplate restTemplate;@Testpublic void testCreateOrder() {// 模拟商品库存足够的情况mockServer.expect(ExpectedCount.once(), requestTo(new URI("http://localhost:" + port + "/inventory/1"))).andExpect(method(HttpMethod.GET)).andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body("{\"id\": 1, \"count\": 100}"));// 创建订单ResponseEntity<Order> response = restTemplate.postForEntity("/orders", new Order(...), Order.class);// 验证订单创建成功assertEquals(HttpStatus.CREATED, response.getStatusCode());assertNotNull(response.getBody().getId());}
}
在库存服务中定义一个契约,描述订单服务如何调用库存接口:
Contract.make {request {method 'GET'url '/inventory/1'}response {status 200body([id: 1,count: 100])headers {contentType(applicationJson())}}
}
Spring Cloud Contract会根据这个契约自动生成测试用例来验证库存接口的实现是否符合契约。
在Spring Cloud Pipelines中配置这两个测试阶段:
在这个配置中,Integration Test
阶段会运行我们的集成测试,Contract Test
阶段会运行由Spring Cloud Contract自动生成的契约测试。
通过这种方式,我们可以确保订单服务在与库存服务交互时能正常工作,并且遵循了预定义的接口契约。
pipeline {stages {stage('Integration Test') {steps {sh "./mvnw test"}}stage('Contract Test') {steps {sh "./mvnw spring-cloud-contract:verify"}}...}
}
2.3.部署策略
Spring Cloud Pipelines确实支持多种部署策略,如蓝绿部署和金丝雀发布。下面我们来看看这些部署策略:
蓝绿部署:
蓝绿部署是一种将新版本应用上线的策略,它减少了部署新版本应用对生产环境影响的风险。在这种策略中,有两个完全相同的生产环境,称为“蓝环境”和“绿环境”。在任何时候,只有一个环境处于活动状态,另一个环境则用于部署和测试新版本的应用。
当新版本的应用在绿环境中测试通过后,切换流量到绿环境,这时蓝环境变为备用。如果新版本的应用出现问题,我们可以迅速切换回蓝环境,保证服务不受影响。
金丝雀发布:
金丝雀发布是另一种部署新版本应用的策略。在这个策略中,新版本的应用并不是一次性部署到所有服务器,而是先部署到一部分服务器上。这部分服务器上运行的新版本应用被称为“金丝雀”。
金丝雀发布的主要优点是可以快速发现新版本应用可能存在的问题,而不会影响所有用户。一旦金丝雀实例运行稳定,我们就可以逐渐将新版本应用部署到其他服务器。
以上是蓝绿部署和金丝雀发布的基本概念。在Spring Cloud Pipelines中,你可以通过修改配置来选择使用哪种部署策略,例如:
spring:cloud:pipelines:strategy: blueGreen
或者
spring:cloud:pipelines:strategy: canary
部署策略的具体实现会取决于你使用的平台和工具。例如,如果你使用Kubernetes,你可以使用其内置的服务和部署对象来实现蓝绿部署和金丝雀发布。
4. Spring Cloud Pipelines的使用示例
创建一个简单的Spring Boot应用,并使用Spring Cloud Pipelines、GitHub和Jenkins进行持续集成和持续部署。
4.1. 创建一个Spring Boot应用
使用Spring Initializr创建一个简单的Spring Boot应用,
或使用以下命令生成
curl https://start.spring.io/starter.zip -o my-service.zip
unzip my-service.zip
cd my-service
4.2. 将代码托管到GitHub仓库
详细操作略
在GitHub上创建一个新仓库并将刚创建的Spring Boot应用代码推送到该仓库。
git init
git add .
git commit -m "Initial commit"
git remote add origin git@github.com:your-username/my-service.git
git push -u origin master
4.3. 添加Spring Cloud Pipelines依赖
详细操作略
在项目的pom.xml
依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-pipelines</artifactId><version>${spring-cloud.version}</version>
</dependency>
4.4. 配置Spring Cloud Pipelines
在src/main/resources/application.yml
文件中,添加以下配置:
spring:cloud:pipelines:deploy:prod:services: my-service
4.5. 创建Jenkinsfile
详细操作略
在项目根目录下创建一个名为Jenkinsfile
的文件,然后定义以下阶段:
pipeline {agent anystages {stage('Build') {steps {sh "./mvnw clean package"}}stage('Test') {steps {sh "./mvnw test"}}stage('Deploy') {steps {sh "./mvnw spring-cloud:deploy -Dspring.profiles.active=prod"}}}
}
4.6. 提交变更到GitHub
将Jenkinsfile
和其他更改提交到GitHub仓库:
git add .
git commit -m "Add Jenkinsfile"
git push
4.7. 配置Jenkins
详细操作略
这个详细过程省略,如果公司有Jenkins 服务,可以使用现成的。不必要重复造轮子。
- 安装并启动Jenkins服务器
- 安装GitHub插件、Pipeline插件和Maven插件
- 配置Jenkins与GitHub的连接以及Maven配置
- 创建一个新的Pipeline项目,并将GitHub仓库URL设置为刚刚创建的仓库
4.8. 触发持续交付流程
详细操作略
- 在Jenkins中选择你刚刚创建的Pipeline项目,然后点击“Build Now”
- Jenkins将自动检出GitHub仓库中的代码,然后按照
Jenkinsfile
中定义的阶段进行构建、测试和部署
4.9. 查看流程运行结果
你可以在Jenkins的控制台输出中查看每个阶段的运行结果。如果所有阶段都执行成功,那么你的应用将会被成功部署到目标环境。
5. 参考文档
https://cloud.spring.io/spring-cloud-static/spring-cloud-pipelines/1.0.0.M8/multi/multi_spring-cloud-pipelines.html
相关文章:

Spring Cloud Pipelines 入门实践
文章目录 1. 前言2. Spring Cloud Pipelines 是做什么的2.1. 预定义的流程2.2. 集成测试和契约测试2.3.部署策略 4. Spring Cloud Pipelines的使用示例4.1. 创建一个Spring Boot应用4.2. 将代码托管到GitHub仓库4.3. 添加Spring Cloud Pipelines依赖4.4. 配置Spring Cloud Pipe…...

G1 GC详解及设置
一、概述 G1 GC,全称Garbage-First Garbage Collector,在JDK1.7中引入了G1 GC,从JAVA 9开始,G1 GC是默认的GC算法。通过-XX:UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器,分区既可以是年轻代也可以是老…...
GitHub详细教程
将代码推送到GitHub仓库涉及一系列的步骤。以下是详细的步骤说明: 创建一个新的仓库(如果还没有的话): 访问 GitHub。登录您的帐户。点击页面右上角的图标,然后选择“New repository”。填写仓库名称、描述等信息&…...

【小沐学Python】Python实现Web图表功能(Dash)
文章目录 1、简介2、安装3、功能示例3.1 Hello World3.2 连接到数据3.3 可视化数据3.4 控件和回调3.5 设置应用的样式3.5.1 HTML and CSS3.5.2 Dash Design Kit (DDK)3.5.3 Dash Bootstrap Components3.5.4 Dash Mantine Components 4、更多示例4.1 Basic Dashboard4.2 Using C…...

【RabbitMQ】docker rabbitmq集群 docker搭建rabbitmq集群
docker rabbitmq集群 docker搭建rabbitmq集群 RabbitMQ提供了两种常用的集群模式 1.普通集群模式 2.镜像集群模式 普通集群模式只能同步主节点上的交换机和队列信息,但对于队列中的消息不做同步,主节点宕机也不能进行切换(故障转移ÿ…...
Linux 网络驱动实验
本文章对Linux 网络驱动实验中的设备树进行介绍,Linux网络驱动程序比较复杂,只要学会应用。 1、I.MX6ULL 网络外设设备树 I.MX6ULL 有两个 10/100M 的网络 MAC 外设,因此 I.MX6ULL 网络驱动主要就是这两个网络 MAC 外设的驱动。 fec1…...

访问Apache Tomcat的虚拟主机管理页面
介绍 通过Tomcat Host Manager应用可以创建、删除、管理Tomcat内的虚拟主机(virtual hosts)。该应用是Tomcat安装的一部分,默认在<Tomcat安装目录>/webapps/host-manager: 配置用户名、密码、角色 要访问Host Manager应…...

【算法】排序——归并排序和计数排序
主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏…...

discuz封面设置失败的解决办法(centos系统+windows系统)
discuz封面设置失败的解决办法(centos系统windows系统) centos系统:1、开启/var/www/html 这个目录的读写权限chmod -R 777 /var/www/html然后重启httpd:service httpd restart如果discuz论坛发布帖子,还是显示封面设置失败的话…...

AI绘画-Stable Diffusion笔记
软件:Stable Diffusion 视频教程来自 https://www.bilibili.com/video/BV1As4y127HW/?spm_id_from333.337.search-card.all.click 提示词 提示词类别 内容型提示词 人物主题特征: 服饰穿搭:white dress 发型发色:blonde hair,l…...
中值滤波算法及例程
中值滤波是一种常用的非线性图像滤波算法,它能够有效去除图像中的椒盐噪声(即孤立的亮或暗像素点),同时保持图像边缘和细节的清晰度。中值滤波的主要思想是使用一个滑动窗口,在窗口内对像素值进行排序,并将…...

SpringBoot 如何使用 Ehcache 作为缓存
使用Spring Boot Sleuth进行分布式跟踪 在现代分布式应用程序中,跟踪请求和了解应用程序的性能是至关重要的。Spring Boot Sleuth是一个分布式跟踪解决方案,它可以帮助您在分布式系统中跟踪请求并分析性能问题。本文将介绍如何在Spring Boot应用程序中使…...

Stable Diffusion 图片换脸插件Roop保姆教程 附错误解决办法和API使用
换脸技术已经不是新鲜事物,但如何实现简单、快速、高效的换脸操作呢?Roop插件正是为解决这一问题而生的。 sd-webui-roop 插件适用于已经本地部署了SD的用户。相较于传统的换脸技术,Roop插件几乎不需要训练,只需一张照片,即可在10秒内完成换脸。 但是要注意到是必须注意…...

华为OD机试 - 组成最大数(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》…...

十一、2023.10.5.计算机网络(end).11
文章目录 17、说说 TCP 可靠性保证?18、简述 TCP 滑动窗口以及重传机制?19、说说滑动窗口过小怎么办?20、说说如果三次握手时候每次握手信息对方没收到会怎么样,分情况介绍?21、简述 TCP 的 TIME_WAIT,为什么需要有这个状态&…...

基于SpringBoot的网上摄影工作室
目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 作品分类管理 轮播图管理 摄影作品管理 摄影作品收藏 摄影圈 摄影作品发布 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统…...

Spring源码解析——IOC之bean 的初始化
正文 一个 bean 经历了 createBeanInstance() 被创建出来,然后又经过一番属性注入,依赖处理,历经千辛万苦,千锤百炼,终于有点儿 bean 实例的样子,能堪大任了,只需要经历最后一步就破茧成蝶了。…...
互联网摸鱼日报(2023-10-07)
互联网摸鱼日报(2023-10-07) 36氪新闻 小米汽车将研发增程式电动车,产品已有规划;LG新能源和丰田汽车北美公司签署电动汽车电池供应协议|36氪新能源日报1005 详解企业数字化转型建设过程中所需的七种能力 电商平台,如何让丰收「…...

深入理解RBAC
RBAC是一种基于角色实现访问控制的权限管理机制,通过定义角色和权限、用户和角色、角色和角色之间的关系,实现多层次、细粒度、可复用的权限管理系统。原文: Role-based Access Control (RBAC) Model[1] Bernard HermantUnsplash Avery Pennarun写的&quo…...
uniapp微信小程序蓝牙连接与设备数据对接
蓝牙连接并通信方法封装大致步骤。 初始化蓝牙并搜索;获取并启用service服务;数据读取和监听设备返回数据 需要使用uniapp官方提供api: // 关闭蓝牙 uni.closeBluetoothAdapter({}) // 打开蓝牙 uni.openBluetoothAdapter({}) // 搜索附近…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...