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

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

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

相关文章

生成Android证书

前提&#xff1a;确保本机安装好了java1.8 第一步 打开CMD keytool -genkey -alias AAAA -keyalg RSA -keysize 2048 -validity 36500 -keystore D:\mygitee\keyStore\szxApp.jksD:\mygitee\keyStore\szxApp.jks是证书要生成的位置 szxApp.jks 是证书名称 D:\mygitee\keySto…

volatile为什么无法保证原子性

假设定义 volatile int i 0; 现在2个线程同时 i&#xff0c;为什么数据还可能会出错&#xff1f;一起来看下图&#xff0c;虽然volatile的机制是&#xff1a;如果volatile修饰的变量有修改&#xff0c;那么会将变更内容写回主内存&#xff0c;同时让其他线程工作内存的该变量缓…

Pytorvh之Vision Transformer图像分类

文章目录 前言一、Transformer1.Transformer概览2.Self-Attention3.Multi-head Attention4.Position-wise Feed-Forward Networks(位置前馈网络)5.残差连接和层归一化6.Positional Encodings(位置编码) 二、Vision Transformer1.Vision Transformer概览2.Embedding层结构&#…

C++中resize和reserve

1.reserve(n)对capacity操作 capacity < n : 扩容capacity > n : 不操作 2.resize(n, m)对size操作 size < n : size增加到n 增加的值为msize > n : size减小到ncapacity < n : 先增大容量至n 再增大size至n 增加的值为m

计算机网络 | OSI 参考模型

计算机网络 | OSI 参考模型 计算机网络 | OSI 参考模型应用层表示层会话层传输层网络层数据链路层物理层 参考视频&#xff1a;王道计算机考研 计算机网络 参考书&#xff1a;《2022年计算机网络考研复习指导》 计算机网络 | OSI 参考模型 OSI 参考模型自下而上分为7层&…

Text-to-SQL小白入门(八)RLAIF论文:AI代替人类反馈的强化学习

学习RLAIF论文前&#xff0c;可以先学习一下基于人类反馈的强化学习RLHF&#xff0c;相关的微调方法&#xff08;比如强化学习系列RLHF、RRHF、RLTF、RRTF&#xff09;的论文、数据集、代码等汇总都可以参考GitHub项目&#xff1a;GitHub - eosphoros-ai/Awesome-Text2SQL: Cur…

mysql5.7获取json数组中的某个对象

前言 表中的一个字段类型是字符串&#xff0c;存的是一个对象数据。 现在要根据对象中的某个属性&#xff0c;获取到整个对象信息。 如果是mysql8&#xff0c;则可以使用JSON_TABLE。 示例&#xff1a;https://blog.csdn.net/weixin_44071721/article/details/123347229 sele…

MIT 6.S081 Operating System/Fall 2020 macOS搭建risc-v与xv6开发调试环境

文章目录 本机配置安装环境Homebrew执行安装脚本查看安装是否成功 RISC-V tools执行brew的安装脚本 QEMUXV6 测试有用的参考链接&#xff08;感谢前辈&#xff09;写在结尾 本机配置 电脑型号&#xff1a;Apple M2 Pro 2023 操作系统&#xff1a;macOS Ventura 13.4 所以我的电…

C# 处理TCP数据的类(服务端)

using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Threading;namespace TestDemo {/// <summary>/// 处理TCP数据的类&#xff08;服务端&#xff09;/// </summary>public class TcpService{/// <s…

Java中ArrayList 和 LinkedList 的区别是什么?

Java中ArrayList 和 LinkedList 的区别是什么&#xff1f; ArrayList 和 LinkedList 都是Java中常用的集合类&#xff0c;它们用于存储和操作元素的容器&#xff0c;但在内部实现和使用方式上有很大的区别。以下是它们的区别、作用、优缺点以及示例说明&#xff1a; 区别&…

Linux 安全 - LSM hook点

文章目录 一、LSM file system hooks1.1 LSM super_block hooks1.2 LSM file hooks1.3 LSM inode hooks 二、LSM Task hooks三、LSM IPC hooks四、LSM Network hooks五、LSM Module & System hooks 一、LSM file system hooks 在VFS&#xff08;虚拟文件系统&#xff09;层…

JVM第六讲:JVM 基础 - Java 内存模型引入

JVM 基础 - Java 内存模型引入 很多人都无法区分Java内存模型和JVM内存结构&#xff0c;以及Java内存模型与物理内存之间的关系。本文是JVM第六讲&#xff0c;从堆栈角度引入JMM&#xff0c;然后介绍JMM和物理内存之间的关系, 为后面JMM详解, JVM 内存结构详解, Java 对象模型详…

蓝桥杯基础---切面条

切面条 一根高筋拉面&#xff0c;中间切一刀&#xff0c;可以得到2根面条。 如果先对折1次&#xff0c;中间切一刀&#xff0c;可以得到3根面条。 如果连续对折2次&#xff0c;中间切一刀&#xff0c;可以得到5根面条。 那么&#xff0c;连续对折10次&#xff0c;中间切一刀…

react数据管理之setState与Props

react数据管理之setState与Props setState调用原理 setState 是 React 中用于更新组件状态&#xff08;state&#xff09;的方法。它的调用原理可以分为以下几个步骤&#xff1a; 状态的改变&#xff1a;当调用 setState 时&#xff0c;React 会将新的状态对象与当前状态对象…

QT 网络编程 服务端 客户端 QTcpServer

服务端的创建 //创建服务端QTcpServer对象 server new QTcpServer(this);//设置服务端&#xff0c;端口&#xff0c;这里绑定的是主机的所有网卡&#xff0c; server->listen(QHostAddress::Any, 8080);//绑定连接信号与槽 connect(this->server, &QTcpServer::new…

[C++随想录] 继承

继承 继承的引言基类和子类的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员多继承的结构棱形继承的结构棱形虚拟继承的结构继承与组合 继承的引言 概念 继承(inheritance)机制是面向对象程序设计使代码可以 复用的最重要的手段&#xff0c;它允许程序…

Design patterns--观察者模式

设计模式之观察者模式 代码示例 #ifndef OBSERVER_H #define OBSERVER_H#include <map>class Observer { public:Observer();virtual void update(std::map<int, double>) 0; }; #endif // OBSERVER_H#include "observer.h"Observer::Observer() {}#if…

玩转Linux Shell Terminal Tmux

一、Shell编程☘️ 1. Shell指令快捷操作 1. echo # 系统指令 $ echo $(pwd) # 对于系统自带的pwd&#xff0c;此处不能写echo $pwd# 自定义变量 $ foo$(pwd) $ echo $foo # 不同于pwd&#xff0c;对于自定义的foo&#xff0c;不能用$(foo)2. !! # 假设你先执行了以下原本…

python基于django的留学生服务管理平台

留学服务管理平台的用户是系统最根本使用者&#xff0c;按需要分析系统包括三类用户&#xff1a;学生、教师、管理员。这三类用户对系统的需求简要如下。技术栈 后端&#xff1a;pythondjango 前端&#xff1a;vueCSSJavaScriptjQueryelementui 开发语言&#xff1a;Python 框架…

深度学习基础知识 给模型的不同层 设置不同学习率

深度学习基础知识 给模型的不同层 设置不同学习率 1、使用预训练模型时&#xff0c;可能需要将2、学习率设置方式&#xff1a; 1、使用预训练模型时&#xff0c;可能需要将 &#xff08;1&#xff09;预训练好的 backbone 的 参数学习率设置为较小值&#xff0c; &#xff08;2…