Spring Cloud Pipelines 入门实践

news2024/11/24 18:43:39

文章目录

  • 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 {
    
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public 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 200
        body([
            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 any
    stages {
        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.coloradmin.cn/o/1091823.html

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

相关文章

基于Python简单实现接口自动化测试(详解)

一、简介 本文从一个简单的登录接口测试入手&#xff0c;一步步调整优化接口调用姿势&#xff0c;然后简单讨论了一下接口测试框架的要点&#xff0c;最后介绍了一下我们目前正在使用的接口测试框架pithy。期望读者可以通过本文对接口自动化测试有一个大致的了解。 二、引言 …

统信UOS 1060系统增量备份

原文链接&#xff1a;统信UOS 1060系统增量备份 hello&#xff0c;大家好啊&#xff0c;今天给大家带来关于统信UOS 1060系统备份还原的系列内容的第三篇文章&#xff0c;系统增量备份&#xff0c;我们可以将系统增量备份到u盘中&#xff0c;后面需要的话&#xff0c;可以进行还…

C#中base关键字的使用

在C#编程语言中&#xff0c;base关键字扮演着重要的角色。它用于在派生类中调用基类的成员&#xff0c;并为开发人员提供了一种简单而有效的方式来实现继承以及重用代码。在本文中&#xff0c;我们将探讨base关键字的使用及其在C#中的代码实例。 首先&#xff0c;我们需要了解…

如何成功安装Node.js并在VS Code终端使用npm

✨✨✨ 感谢优秀的你打开了小白的文章 “希望在看文章的你今天又进步了一点点&#xff0c;生活更加美好&#xff01;”&#x1f308;&#x1f308;&#x1f308; 目录 1.什么是Node.js? 2.解决方法 3.淘宝镜像安装 1.什么是Node.js? Node.js 是一种开源与跨平台的 JavaSc…

Apollo(阿波罗)分布式配置中心

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

力扣-459.重复的子字符串

Idea 看题解的KMP自己手动实现太难了&#xff0c;我还是选择容易理解的暴力枚举叭 AC Code class Solution { public:bool isCheck(string subs, string s) {if(s.size() % subs.size() ! 0) return false;int k s.size() / subs.size();string comp "";while(k-…

【微信小程序】6天精准入门(第1天:小程序入门)

一、介绍 1、什么是小程序 小程序是一种轻量级的应用程序&#xff0c;可以在移动设备上运行&#xff0c;不需要用户下载和安装。它们通常由企业或开发者开发&#xff0c;用于提供特定功能或服务。 微信小程序&#xff08;wei xin xiao cheng xu&#xff09;&#xff0c;简称小程…

设备巡检管理系统—动态化管理设备

为进一步夯实设备基础管理&#xff0c;提高设备运行的可靠性&#xff0c;做到及时发现设备故障隐患&#xff0c;并根据检查结果分析提出预防性维修计划&#xff0c;从而使用凡尔码搭建设备管理系统来管理设备&#xff0c;该系统能最大限度地减少设备故障停机&#xff0c;杜绝设…

【git】gitlab常用命令

gitlab官网 官网&#xff1a;官网 中文官网&#xff1a;中文官网 默认的gitlab安装目录 /opt/gitlab/bin 启动 gitlab-ctl start 查看状态 gitlab-ctl status 停止 gitlab-ctl stop 重启GitLab gitlab-ctl restart 查看gitlab的配置文件 配置的路径是&#xff1a;/…

【Java】jvm 元空间、常量池(了解)

JDK1.8 以前的 HotSpot JVM 有方法区&#xff0c;也叫永久代&#xff08;permanent generation&#xff09;方法区用于存放已被虚拟机加载的类信息&#xff0c;常量、静态遍历&#xff0c;即编译器编译后的代码JDK1.7 开始了方法区的部分移除&#xff1a;符号引用&#xff08;S…

Zotero同步坚果云

实用教程 无意之中发现的Zotero同步坚果云的教程&#xff0c;简直和自己当时看视频&#xff0c;搜经验贴做的步骤一模一样&#xff0c;十分赞&#xff01;值得收藏&#xff01;只是忘记当时在哪保存的图片了&#xff0c;所以没法引用&#xff01;只能在这借花献佛&#xff0c;…

二叉树学习笔记

1、链表实现二叉树 // 树节点类 class Bitreenode {char data;Bitreenode* ls, * rs, * fa; // ls为左儿子节点&#xff0c;rs为右儿子节点&#xff0c;fa为父节点 public:Bitreenode() {data 0;ls rs fa nullptr;}void set_ls(Bitreenode *p) {ls p;}void set_rs(Bitre…

ONNX推理流程

文章目录 python版API推理流程 python版API推理流程 使用netron工具查看onnx网络结构 如下图&#xff0c;可以看出此次要使用的网络输入为&#xff1a; 输入名称&#xff1a;input输入形状&#xff1a;[1, 3, 256, 256]输入数据类型&#xff1a;float32 网络的输出为&#xff1…

如何利用IP地址定位保护网络安全?

通过IP地址定位可以在一定程度上增强网络安全&#xff0c;但它并不是唯一的安全措施。以下是如何利用IP地址定位来保护网络安全的一些方法&#xff1a; 异常检测和入侵检测&#xff1a;监控网络上的IP地址流量&#xff0c;定位异常活动&#xff0c;如大规模的连接尝试、不寻常的…

习题1. 31

话不多说 先上代码 (defn product [ term a nxt b](defn iter [a result](if (> a b)1 (* (term a) (iter (nxt a) result))))(iter a 1)) 跟习题1.30比较起来&#xff0c;就是两个地方不同 乘法不能乘0 必须是1。难度来讲&#xff0c;跟1.30难度是一样的。增加了迭代过…

Qt之submodule编译

工作中会遇到这样一种情况&#xff1a;qt应用程序在运行时提示找不到某个qt的动态库。我遇到的是缺少libQt5Websocket.so&#xff0c;因为应用程序是在x86平台银河麒麟v10上开发&#xff0c;能够正常编译运行&#xff0c;然后移植到rk3588&#xff08;aarch64架构&#xff09;上…

阿里云/腾讯云/华为云国际版实名账号:亚太已发展超2500个本地生态伙伴 超50%收入由伙伴创造

华为全联接大会2022在泰国开幕&#xff0c;以“创新无限&#xff0c;一切皆服务”为主题的华为云峰会成功举办&#xff0c;华为云亚太地区部总裁曾兴云、华为云首席产品官方国伟以及多位客户伙伴发表主旨演讲。会上&#xff0c;华为云发布《云原生2.0架构白皮书》并联合CNCF&am…

OpenResty安装

OpenResty 是一个基于 Nginx 的 Web 平台&#xff0c;它将 Nginx 和 Lua 脚本语言结合起来&#xff0c;提供了更强大的 Web 应用开发和部署能力。OpenResty 仓库是 OpenResty 项目的官方仓库&#xff0c;包含了 OpenResty 的源代码、文档、示例等资源。 OpenResty 仓库地址是&…

【C++】位图及其应用

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

【算法-动态规划】钢条切割问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…