从0开始搭建一个微服务的持续交付系统

2024-09-04 10:58

本文主要是介绍从0开始搭建一个微服务的持续交付系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从0开始搭建一个微服务的持续交付系统

Java高级架构技术 2018-10-31 22:58:35

本文介绍了如何利用开源软件快速搭建一套微服务的持续交付系统。本文假设的环境是Linux操作系统,用到的软件包括Git、Jenkins、Salt、ZooKeeper、Apache等。开始之前,我先简单介绍下持续交付和微服务的概念,以便大家更好的理解本文的精华。

关注我:私信回复“架构资料”获取往期Java高级架构资料、源码、笔记、视频

Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、

高并发等架构技术

什么是持续交付?我们先举个物流的例子,现在各大电商都非常重视物流的自动化建设,在实现包括运输、装卸、包装、分拣、识别等作业过程的设备和设施自动化的同时,更在研究无人机和自动驾驶汽车送货,达到物流的全自动。

那么软件开发呢,从开发人员check in代码到代码仓库,到代码的构建、部署、测试、发布,我们可以形象地把这个过程称为“软件物流”,现实世界的物流实现了相当的自动化,“软件物流”也应如是,实现从开发人员check in代码(客户下单)到生产系统上线(送货上门)的自动化。

说到这里,我们可以给持续交付下一个“非专业”的定义,持续交付就是实现“软件物流”的自动化。

从0开始搭建一个微服务的持续交付系统

图1.持续交付流水线

图1摘自《持续交付:发布可靠软件的系统方法》,展示了持续交付具体包括的内容。本文重点讨论如何实现微服务的持续交付流程,所以会忽略掉整个流程的一些细节(如代码分析、单元测试等等)。

那什么是微服务呢?微服务的概念最初由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。目前微服务的主流实现方式有两种:RESTful API和消息队列。

从0开始搭建一个微服务的持续交付系统

图2 RESTful微服务

 

从0开始搭建一个微服务的持续交付系统

图3 message queue微服务

图2、图3是两种典型微服务架构的简略图。当然现实中的系统会复杂的多,比如会有微服务聚合,多级缓存,注册中心等。

微服务相对单体式应用来说有明显的好处:

  1. 解决了单体式应用的复杂性问题,单个微服务很容易开发、理解和维护。
  2. 每个微服务都可以由独立的团队来开发,可以自由选择开发语言。
  3. 每个微服务可以独立部署,系统可以快速演进。
  4. 可以对每个微服务进行独立扩展,极大的提高系统伸缩性及资源利用率。

但在一个单体式应用拆分成数十个乃至上百个微服务,由于服务数量的增加,以及微服务支持多种编程语言的特性,对软件的构建,部署,测试,监控都带来了全新的挑战。本文将讨论如何通过持续交付来降低微服务构建,部署的复杂度。

微服务的持续交付:统一方法

由于微服务的特性,微服务的持续交付会比单体式应用的持续交付复杂的多。本节列出了为了降低微服务持续交付的复杂度,我们遵循的一些原则:

  1. 统一方法。这里有两个层面的含义,第一是流程的统一,有很多公司对运维自动化非常重视,但在开发,测试阶段没有采用自动化的方法。随着DevOPS运动的兴起,大家逐渐意识到需要在开发,测试阶段采用与生产环境相同的交付方法,这样在系统部署到生产环境的时候,这一交付流程已经经过多次的检验,出错的概率大大降低了。第二层含义与微服务相关,各个微服务可能用不同的语言实现,如Java、Python、C++、Golang、纯前端(JavaScript),我们要对采用不同语言实现的微服务使用统一的交付方法。
  2. 在版本控制系统中,每个微服务应该对应一个独立的仓库。以Git为例,一个Project下面,每个微服务对应一个独立Repository。这样各个微服务可以独立check in代码,而不会在持续构建的时候互相影响。
  3. 设计持续交付系统时要考虑实现软件交付的全自动化,虽然在现实中,会存在提交测试,生产变更审核等人工环节。但在理想情况下,开发人员check in 代码之后,能够自动触发构建,多套环境的部署及测试。
  4. 支持单个微服务升降级,这要求持续交付系统,对每个可部署的单元(微服务)要有独立的版本号。
  5. 程序与配置分离。要支持一套程序(可执行包+配置文件包)多处部署,这里强调了一套程序,是指在开发人员check in代码后,构建系统只生成一份程序(可执行包+配置文件包)。不管是部署到开发环境,测试环境,还是生产环境我们要用同一套程序,而不是对每个环境单独打包。我们知道Java war包会要求把配置文件包含在里面,这会造成不同的环境要求提供不同的war包,这就违反了我们说的这个原则,后面我们会讨论如何处理这个问题。
  6. 在应用程序部署时,不得依赖外网资源。我们把部署过程独立为两个阶段:环境准备阶段和应用程序部署阶段。环境准备包括操作系统,JDK或其他语言运行时系统级依赖库的安装,得益于IaaS的相对成熟,我们把这一阶段独立出来。而应用的部署需要定制化,也是本文讨论的部分。在部署应用时,要求所有的资源从内网获得,这样可以保证应用部署过程的快速、稳定、可重复。

快速搭建微服务的持续交付:持续构建

下面我们结合一个虚构的项目来介绍持续交付的实现细节,假设我们有一个项目BetaCat,由ms1、ms2…msN,n个微服务构成。下面我们重点介绍ms1微服务如何实现持续交付,其它微服务可以类推。

本节讨论下如何实现持续构建,下一节会探讨持续部署。

从0开始搭建一个微服务的持续交付系统

图4 Jenkins处理仓库代码流程

如图4所示,开发人员check in 代码到Git仓库后,Jenkins会自动地进行构建工作,并把打好的包上传到Repo server上。

从0开始搭建一个微服务的持续交付系统

图5 配置文件示例

作为统一方法的一部分,我们在每个微服务仓库上创建了CI目录,用于配置文件的打包,在CI目录里,只放入需要参数化的配置文件,执行脚本等,并会严格遵循原有系统的目录结构,如图5所示,我们要求有start.sh、stop.sh及service(用于Linux的init启停该微服务)。

图5中配置文件参数化内容,参数部分用”{{“与”}}”包围起来,在持续部署的时候会根据传入的参数替换为特定的值。

我们还定义了持续构建的统一输出,对每个微服务采用tgz的打包格式,微服务ms1持续构建的输出文件示例如下:

  • ms1-1.0.7.tgz (可执行包)
  • ms1_config-1.0.7.tgz(配置文件包)

在可执行包里面要求把所有的依赖库(除了系统lib库)都包含在里面,对不同编程语言的微服务的构建工具没有强制要求,统一由Jenkins调用。C/C++我们推荐使用CMake,Java一般用Maven,Python直接打包。

配置文件包就是前面GIT仓库的CI目录直接打包而成。

从0开始搭建一个微服务的持续交付系统

图6 Bundle示例

同时为了在部署时不用具体指定每个微服务的版本号,我们引入了bundle的概念,如图6。在任何一个微服务构建之后,会触发bundle,sha512校验文件生成,并上传到Repo Server。

最后让我们看下持续交付上传到Repo Server的目录结构:

从0开始搭建一个微服务的持续交付系统

图7 目录结构

这样持续构建的工作就完成了,接下来就需要进行持续部署了。

关注我:私信回复“架构资料”获取往期Java高级架构资料、源码、笔记、视频

Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、

高并发等架构技术

快速搭建微服务的持续交付:持续部署

在开始持续部署的讨论之前,我们先描述一下软件运行注入配置的三个时点:

从0开始搭建一个微服务的持续交付系统

 

图8 配置注入的三个时间点打包时点,典型的是Java的war包,会把配置文件打包在一起。部署时点,在部署的时候利用专门的部署工具更新配置文件,这也是我们采用的方法;运行时点,程序运行时通过环境变量或注册中心/配置中心获得配置信息,如用Docker部署微服务时就要考虑通过这种方法来获得所需要的配置信息。

从0开始搭建一个微服务的持续交付系统

图9 采用salt进行部署

图9显示了我们对不同的环境统一采用salt进行部署。由于我们支持用户只输入bundle的版本信息来实现部署,这就要求在持续部署的时候,部署系统能自动获取每个微服务的版本号,为此我们对salt/foreman做了一点小改动,修改后返回的pillar格式包含各个微服务的版本,同时下载并解压对应的配置文件包到salt master的相应目录,以及关闭salt master file_list缓存:fileserver_list_cache_time: 0。

从0开始搭建一个微服务的持续交付系统

图10 foreman web界面以及Salt格式

图10左边表示我们在foreman web界面上设置的参数,右边表示通过salt pillar.items取得的格式,可以看到多了每个微服务的版本号信息。

下面我们按照部署三部曲(安装、配置注入、服务运行)来介绍部署规则文件(saltstate、sls文件)的编写:

1、betacat_ms1.sls 第一部分:安装

从0开始搭建一个微服务的持续交付系统

 

在这一部分,检查并创建安装目录,下载需要的可执行包,并解压到正确的位置,可执行包直接从Repo Server获取,并通过sha512验证文件的完整性。

2、betacat_ms1.sls 第二部分:配置注入

从0开始搭建一个微服务的持续交付系统

 

配置注入部分,读取配置文件包,通过salt master转换后下发给目标机。这里用红框标出了设计的核心。通过salt的file.recurse和之前持续部署中打好的配置程序包,并把所有的配置项传入。可以做到不用对多个配置文件单独编写部署逻辑,完全参数化。

3、betacat_ms1.sls 第三部分:服务运行

从0开始搭建一个微服务的持续交付系统

 

在这一部分,确保微服务在运行状态,并在必要的时候重启。这里需要特别指出的一点,在整个sls文件中,对不同的微服务来说,只有3个元参数:项目名称(BeatCat)、微服务名称(ms1)以及sig(ms1, 微服务进程的唯一识别字符串)。那么我们可以通过简单的脚本来自动生成sls文件,而不需要手工编写。大大降低持续部署的开发维护成本。

快速搭建微服务的持续交付:全自动化

为了支持持续交付流程的全自动化,我们引入了ZooKeeper,如图14。

从0开始搭建一个微服务的持续交付系统

图14 引入ZooKeeper后的流程

 

  1. 代码check in 到Git后,触发构建,Jenkins会把打好的包上传到Repository Server,并更新ZooKeeper的本次及latest包版本信息。
  2. 侦听到ZooKeeper的latest包版本信息变动后,会触发saltstack的部署命令向各个环境部署最新的程序。
  3. 部署完毕,会更新ZooKeeper上的目标机部署版本信息。
  4. 侦听到ZooKeeper上的目标机部署版本信息变动后,会触发一套或多套自动化测试脚本的运行。
  5. 自动化测试通过后,会更新ZooKeeper上的包版本的测试信息。
  6. 通过测试的包,可以自动上传到生产环境的repo server,并更新生产环境ZooKeeper的包版本信息。
  7. 生产环境,侦听到ZooKeeper的包版本信息变动后,会触发生产环境的部署。
  8. 生产环境部署完毕,会更新ZooKeeper上的目标机部署版本信息。

这篇关于从0开始搭建一个微服务的持续交付系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135831

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识