当前位置: 首页 > news >正文

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,然后定义以下阶段:
这里,我们定义了BuildTestDeploy 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&#xff0c;全称Garbage-First Garbage Collector&#xff0c;在JDK1.7中引入了G1 GC&#xff0c;从JAVA 9开始&#xff0c;G1 GC是默认的GC算法。通过-XX:UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器&#xff0c;分区既可以是年轻代也可以是老…...

GitHub详细教程

将代码推送到GitHub仓库涉及一系列的步骤。以下是详细的步骤说明&#xff1a; 创建一个新的仓库&#xff08;如果还没有的话&#xff09;&#xff1a; 访问 GitHub。登录您的帐户。点击页面右上角的图标&#xff0c;然后选择“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.镜像集群模式 普通集群模式只能同步主节点上的交换机和队列信息&#xff0c;但对于队列中的消息不做同步&#xff0c;主节点宕机也不能进行切换&#xff08;故障转移&#xff…...

Linux 网络驱动实验

本文章对Linux 网络驱动实验中的设备树进行介绍&#xff0c;Linux网络驱动程序比较复杂&#xff0c;只要学会应用。 1、I.MX6ULL 网络外设设备树 I.MX6ULL 有两个 10/100M 的网络 MAC 外设&#xff0c;因此 I.MX6ULL 网络驱动主要就是这两个网络 MAC 外设的驱动。 fec1…...

访问Apache Tomcat的虚拟主机管理页面

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

【算法】排序——归并排序和计数排序

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法头疼记&#xff1a;算法专栏…...

discuz封面设置失败的解决办法(centos系统+windows系统)

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

AI绘画-Stable Diffusion笔记

软件&#xff1a;Stable Diffusion 视频教程来自 https://www.bilibili.com/video/BV1As4y127HW/?spm_id_from333.337.search-card.all.click 提示词 提示词类别 内容型提示词 人物主题特征&#xff1a; 服饰穿搭&#xff1a;white dress 发型发色&#xff1a;blonde hair,l…...

中值滤波算法及例程

中值滤波是一种常用的非线性图像滤波算法&#xff0c;它能够有效去除图像中的椒盐噪声&#xff08;即孤立的亮或暗像素点&#xff09;&#xff0c;同时保持图像边缘和细节的清晰度。中值滤波的主要思想是使用一个滑动窗口&#xff0c;在窗口内对像素值进行排序&#xff0c;并将…...

SpringBoot 如何使用 Ehcache 作为缓存

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

Stable Diffusion 图片换脸插件Roop保姆教程 附错误解决办法和API使用

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

华为OD机试 - 组成最大数(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…...

十一、2023.10.5.计算机网络(end).11

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

基于SpringBoot的网上摄影工作室

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

Spring源码解析——IOC之bean 的初始化

正文 一个 bean 经历了 createBeanInstance() 被创建出来&#xff0c;然后又经过一番属性注入&#xff0c;依赖处理&#xff0c;历经千辛万苦&#xff0c;千锤百炼&#xff0c;终于有点儿 bean 实例的样子&#xff0c;能堪大任了&#xff0c;只需要经历最后一步就破茧成蝶了。…...

互联网摸鱼日报(2023-10-07)

互联网摸鱼日报(2023-10-07) 36氪新闻 小米汽车将研发增程式电动车&#xff0c;产品已有规划&#xff1b;LG新能源和丰田汽车北美公司签署电动汽车电池供应协议&#xff5c;36氪新能源日报1005 详解企业数字化转型建设过程中所需的七种能力 电商平台&#xff0c;如何让丰收「…...

深入理解RBAC

RBAC是一种基于角色实现访问控制的权限管理机制&#xff0c;通过定义角色和权限、用户和角色、角色和角色之间的关系&#xff0c;实现多层次、细粒度、可复用的权限管理系统。原文: Role-based Access Control (RBAC) Model[1] Bernard HermantUnsplash Avery Pennarun写的&quo…...

uniapp微信小程序蓝牙连接与设备数据对接

蓝牙连接并通信方法封装大致步骤。 初始化蓝牙并搜索&#xff1b;获取并启用service服务&#xff1b;数据读取和监听设备返回数据 需要使用uniapp官方提供api&#xff1a; // 关闭蓝牙 uni.closeBluetoothAdapter({}) // 打开蓝牙 uni.openBluetoothAdapter({}) // 搜索附近…...

HBase 计划外启动 Major Compaction 的原因

HBase 的 Compaction 有两个线程池,一个是为 Minor Compaction 准备的, 一个是为 Major Compaction 准备的,hbase.regionserver.thread.compaction.throttle 是决定 Compaction 请求放入哪个线程池的阈值,当待合并文件的总大小小于这个阈值时,就是一个 Minor Compaction,…...

设计模式-桥接模式

概念 用于把抽象化与实现化解耦使得二者可以独立变化 演示 class ColorShape {yellowCircle() {console.log(yellow circle)}redCircle() {console.log(red circle)}yellowTriangle() {console.log(yellow triangle)}redTriangle() {console.log(red triangle)} }// 测试 le…...

arcgis地形分析全流程

主要内容&#xff1a;DEM的获取与处理、高程分析、坡度分析、坡向分析、地形起伏度分析、地表粗糙度分析、地表曲率分析&#xff1b; 主要工具&#xff1a;镶嵌至新栅格、按掩膜提取、投影栅格、坡度、坡向、焦点统计 一 DEM的获取与处理 1.1 DEM是什么&#xff1f; DEM(D…...

mapper.xml中的sql标签

在MyBatis中&#xff0c;mapper.xml文件是用于定义数据库操作的映射文件&#xff0c;其中的<sql>标签用于定义可重用的SQL片段。这些SQL片段可以在<select>, <update>, <insert>, <delete>等操作中被引用&#xff0c;以避免在多个地方重复编写相…...

重启redis的步骤

要重启 Redis&#xff0c;需要使用以下步骤&#xff1a; 登录到您的服务器&#xff1a;使用 SSH 或其他远程访问方式登录到托管 Redis 的服务器。 停止 Redis 服务器&#xff1a;您可以使用以下命令停止 Redis 服务器&#xff1a; redis-cli shutdown 这将向 Redis 服务器发送…...

第二证券:如何选股票的龙头股?

在股票商场中&#xff0c;每个出资者的方针都是可以出资到那些未来可以表现出色并带领整个工作开展的龙头股。选股关于出资者来说非常要害&#xff0c;由于选股不妥或许会导致出资失利。那么&#xff0c;怎么选股票的龙头股呢&#xff1f;本文从多个角度进行剖析&#xff0c;协…...

【华为OD机考B卷 | 100分】统计监控、需要打开多少监控器(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 OD&#xff0c;B 卷 100 分题目【OD 统一考试&#xff08;B 卷&#xff09;】 1. 题目描述 某长方形停车场每个车位上方都有一个监控…...

Python Django 详解(基础)

文章目录 1 概述1.1 安装 django1.2 创建 django 项目1.3 创建 app 2 启动 Django2.1 settings.py&#xff1a;注册 app2.2 view.py&#xff1a;URL和视图对应2.3 启动 Django2.4 访问 3 快速上手3.1 templates&#xff1a;html 模板3.2 static&#xff1a;静态文件3.3 模板语法…...

C语言内存函数

目录 memcpy(Copy block of memory)使用和模拟实现memcpy的模拟实现 memmove(Move block of memory)使用和模拟实现memmove的模拟实现: memset(Fill block of memory)函数的使用扩展 memcmp(Compare two blocks of memory)函数的使用 感谢各位大佬对我的支持,如果我的文章对你有…...

【Docker】Docker-compose及Consul多容器编排工具

使用一个Dockerfile模版文件可以定义一个单独的应用容器&#xff0c;当需要定义多个容器时就需要编排 docker swarm&#xff08;管理跨节点&#xff09; 编排工具——docker compose Dockerfile可以让用户管理一个单独的应用容器&#xff1b;而Compose则允许用户在一个模板&…...