部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

一.CI(Continuous Integration)简介

   CI规则1:尽量频繁地把代码签入到分支中以进行集成

  CI规则2:不光要对语法进行验,也要提供一系列的自动化来验证

  CI规则3:CI失败后,要把修复CI当做第一优先级的事情

  说明:作为CI流程的一部分,我们提供的制品应该每次只生成一次,然后在所有的部署一切使用,这不仅避免多次重复做一件事情,还可以保证部署上线的制品与测试通过的那是同一个。

 

二.把CI映射到微服务

     这里有几种做法:

    做法1:所有的东西都放在一起,向代码库的任何一次提交都会触发构建,同时会构建出多个制品。

    一般来说,我们绝对应该避免这个模式,但在项目初期是个例外。我即使只修改一个服务的一行代码也需要进行整体的验证和构建,事实上这有可能是不需要的,这会影响CI的周期。

    做法2:将每个CI映射到代码库中不同的目录,这种做法比第一种好。

    做法3:每个服务都有自己的代码库,都有自己的CI,这样就更加独立了。

 

三.CD(Continuous Delivery)简介

     正如我们项目组正在使用的PipeLine,这就是一个CD产品,它告诉我们每个步骤是否完成,距离最终的产品交付还有哪几项,软件质量的可视化得到了极大改善。

     

 

四.制品的选择

     Java可以生成Jar包和War包,Ruby有gem,它们在运行的时候需要特定的环境,Chef、Puppet、Ansible是集中配置管理系统,支持一些通用技术栈的构建物部署。

     我们也可以选择生成与操作系统相关的制品,如RedHat或CentOS的RPM、Ubuntu的deb包、Windows的MSIqn。使用操作系统的制品好处是,不需要考虑底层使用的是什么技术,只需要简单使用内置的工具就可以完成软件的安装。

     如果使用自动化配置管理工具来管理环境问题,一个问题是,需要花费大量的时间运行这些脚本,它们会一遍遍地安装 这些重复的工具,而且还可能有新的软件加进来,其安装时间会继续被拉长。我们可以使用虚拟机镜像,在部署软件时,只需要根据镜像创建一个实例,之后在其安装最新的微服务即可,不需要再花费时间来安装依赖,因为它们已经在镜像中安装好了,这样可以节省很多时间。但安装镜像也会花费很多时间,同时不同平台的镜像是不一样的,我们可以通过Packer来解决这个问题,它可以从Chef、Ansible、Puppet中的同一套配置中生成不同平台的镜像。

     那么,我们可能将微服务也包含在镜像中,那么当你启动镜像时,微服务就已经就绪了。

     但这同时也会带来一个问题,有人会进生产服务器修改其中某一台的配置,导致配置漂移问题,怎么办?应该禁止对任何运行的服务器做手动修改。

 

五.服务的配置管理

     对于不同的生产环境有不同的配置,我们应该如何处理?应该最小化环境间配置的差异,比如用来连接数据库的用户名和密码。

    另外,配置文件应该单独管理,如IT部正在使用的JFrog制品库。

 

六.服务与主机之间的映射

      这样的形式有多种。

      第1种:单主机多服务

      这种方式简单,但是也会存在挑战,如监控困难,我们不知道哪个服务使用CPU的频率更高一点,同时服务之间会造成影响,一个服务可能会造成系统资源用尽,这样其他服务也会有相应的影响。

      第2种:应用程序容器

      这种方式,从根本上说,是想试图优化资源的使用,但现在云服务的出现使得已经没有必要了。

      这种方式将5个Java服务打包在一个容器(如Jetty)中,这样不可避免地限制了技术的选择,同时在聚合监控时也会难以支持。

      第3种:每个主机一个服务

      这种方式很容易对服务进行扩展,安全性也可以在更小的范围内进行,但主机数据的增加也会是个问题。

      第4种:使用Pass(平台即服务)

      Pass平台会提供一些特定制品(如Java Jar包或Ruby 的gem等)的支持,还会帮你自动配置机器然后运行,能够透明地对系统进行弹性管理,允许你控制运行服务的节点数量,Pass平台帮你处理其他的工作。

 

七.如何管理微服务带来的大量主机:自动化

       为了让你从众多的服务器中解脱出来,你需要自动化,你需要写一行代码来启动或开户一个虚拟机,你需要能够自动部署软件,你需要自动完成数据库的变更。

      方法1:传统的虚拟化技术

              

      如上图所示,这就是传统的虚拟化技术,在操作系统之上,存在着Hypervisor,它的任务主要有两个,对CPU和内存资源做从虚拟主机到物理主机的映射和给上层提供一个控制的层,但Hypervisor也需要一定的资源来完成自己的工作,它也会占用CPU、IO和内存等,Hypervisor主机越多,占用的资源就越多。

      方法2:Vegrant

      这是一个部署平台,通常在开发和测试环境中使用,可以在一台机器上创建一个虚拟的云,它的底层使用的是标准的虚拟化系统,比如你可以同时创建多个VM,通过关掉其中的几台来测试故障模式,并且可以把本地目录映射到虚拟机上,这样就可以在修改代码后立即查看效果。

      方法3:Linux容器

      Linux容器可以创建一个隔离的进程空间,进而在这个空间运行其他的进程。在Linux中,进程必须由用户来运行,并且根据权限的不同拥有不同的能力,进程可以创建其他进程,举个例子,如果我在终端启动了一个乾,你可以认为它是终端程序的子进行,Linux内核的任务就是维护这个进程树。

      Linux容器扩展了这一想法,每个容器就是整个系统进程树的一棵子树,内核已经帮我们完成了给这些容器分配物理资源的任务, LXC就是这样一种容器(类似的还有Solaris Zones、Open VZ),它的基本结构如下:

             

      它不再需要Hyervisor,其实尽管每个容器可以运行不同的操作系统发行版,但必须共享相同的内核,因为进程树存在于内核中,这意味着,我们的主机操作系统可以是Ubuntu,而在容器中可以运行CenOS,只要它们的内核相同即可。

      容器更轻量,所以在相同的硬件上能够运行的容器数量比虚拟机要多得多,而且启动速度更快,但容器在隔离性上也还存在一定问题。

      方法4:Docker

      Docker是构建在轻量级容器之上的平台,它帮你处理了大多数与容器管理相关的事情,你可以在Docker中创建和部署应用,这些基于容器的应用与VM镜像很类似,Docker也能管理容器的配置,并帮你处理一些网络问题。

      Docker本身并不能解决所有的问题,它只是一个在单机上运行的简单的Paas,你还需要一些工具来帮你管理多台机器上的Docker实例上的服务。比如,当你向这些工具请求一个容器时,它会帮你找到容器并运行它。Google的Kubernetes和Deis就是这样的软件。

      Docker+调度工具构成的解决方案介于IaaS和PaaS之间,我们可以称之为CaaS(容器即服务)。

 

八.使用自动化脚本

       参数化的命令行调用是任何部署的最合理方式,可以使用CI工具来触发脚本的调用,从Windows的Bash到Python Fabric脚本等,好处是一次编写后面基本不用改了,也可以使用Terraform、Salt Stack这样的工具。

 

参考

      《微服务设计》(Sam Newman 著 / 崔力强 张骏 译)

相关文章: 

  • 微服务的概念——《微服务设计》读书笔记

  • 微服务架构师的职责——《微服务设计读书笔记》

  • 建模:确定服务的边界——《微服务设计》读书笔记

  • 微服务集成——《微服务设计》读书笔记

  • 服务的协作:服务间的消息传递——《微服务设计》读书笔记

  • 拆分:分解单块系统——《微服务设计》读书笔记

原文地址:http://www.cnblogs.com/gudi/p/6667102.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注


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

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

相关文章

使用ListView控件展示数据

一、使用ListView实现大图标小图标的功能: 1.拖一个ListView控件 2.拖两个imageList控件,并且重命名为imgBig和imgSmall,分别设置两个控件的图片和大小。 3.编辑ListView的Items,添加几项(C、D、E盘) 4.通过ListView绑…

React中的唯一标识key(用index VS id)和key的选择

1. 虚拟DOM中key的作用:1). 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。2). 详细的说: 当状态中的数据发生变化时,react会根据【新数据】生成【新的虚拟DOM】, 随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较&#x…

Android中ImageView的scaleType 属性说明。

ImageView是Android中最常用的控件之一,在使用ImageView的时候,必不可少的会使用到scaleType属性,该属性指定了你的ImageView如何显示图片。包括是否进行缩放,等比缩放,缩放后显示的位置, Android中提供了八…

支付渠道参数如何设计成路由化配置

转载自 支付渠道参数如何设计成路由化配置 今天我们来探讨在搭建支付系统时一个比较关键的问题:渠道参数路由化配置如何设计? 在开发支付系统的时候,我们经常会涉及到对接多个支付渠道,除常见的支付宝、微信外可能还会根据不同的…

实现Windows程序的数据更新

一、枚举: 1.语法:public enum 名字{ 值1,值2} 2.eg:public enum Genders{Male,FeMale} 3.使用枚举:枚举名.值 4.枚举的好处: (1)使代码更易于维护 (2)更易于用户输入值,直接用.的方式就可以获取值 (3)使代码更清晰&a…

分布式数据访问服务之1—华山论剑篇

业界主流的互联网架构中,分布式服务框架、分布式数据访问服务、消息队列服务、服务网关(API)、分布式事务等都是核心的组件和框架。 当我们的系统规模越来越大,从几台服务器扩展到几十台、几百台、上千台,传统的烟囱式的、大集中式系统架构&…

Android中异步任务AsyncTask的使用

1、当程序启动的时候,Android同时会启动一个对应的线程,【主线程、UI线程】主要负责处理与UI相关的线程 2、UI线程不允许访问网络进行耗时操作 3、子线程不允许更新UI。 由于Android中主线程不能访问网络、子线程不能更新UI,需要线程间通讯 完…

漫画:什么是快速排序?(完整版)

转载自 漫画:什么是快速排序?(完整版) 同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。 不同的是,冒泡排序在每一轮只把一个元素冒泡到数列的一端&a…

测试——《微服务设计》读书笔记

一.测试象限(Brain Marick) 二.测试金字塔(Mike Cohn) 1.单元测试 通常只测试一个函数或方法调用,通过TDD或者基于属性而写的测试就属于这一类,在UnitTest中,我们不会启动服务,对且对…

React功能界面的组件化编码流程

功能界面的组件化编码流程(通用) 1.拆分组件: 拆分界面,抽取组件 2.实现静态组件: 使用组件实现静态页面效果 3.实现动态组件 3.1 动态显示初始化数据 3.1.1 数据类型 3.1.2 数据名称 3.1.2 保存在哪个组件? 3.2 交互(从绑定事件监听开始)

Java 多文件上传

转载自 Java 多文件上传 前台代码很简单&#xff1a; <input type"file" accept".zip" class"file-load" multiple"multiple" name"files"/> 后台代码&#xff1a; public boolean uploadFlow(RequestParam Mult…

MyKtv点歌系统前台主要功能实现,内附数据库脚本,可以直接运行

C#开发工具&#xff1a;Visual Studio 2012 数据库&#xff1a;Sql Server Windows版本&#xff1a;Win10 分辨率&#xff1a;1366*768 文章的最后有KTV点歌系统的前后台源码下载链接。 在正式写代码之前先看一下运行效果图&#xff0c;如果觉得这个是你需要的&#xff0c;那么…

Hibernate使用最新的MySQL8.+版本出现的问题!

目前所出现的问题 1、驱动包更新为 mysql-connector-java-8.0.12.jar 2、hibernate的配置文件hibernate.cfg.xml中使用 <property name"connection.driver_class">com.mysql.cj.jdbc.Driver</property>取代之前的 <property name"connection.d…

支持断线重连、永久watcher、递归操作 ZooKeeper 客户端

项目介绍 ZooKeeper本质上是一个分布式的小文件存储系统。原本是Apache Hadoop的一个组件&#xff0c;现在被拆分为一个Hadoop的独立子项目。 Zookeeper 作为一个分布式的服务框架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题&#xff0c;它能提供基于类似于文…

mongdb总结

#清屏 cls --windows #操作数据库 show dbs --查看所有数据库 use dbName --使用已有的dbName数据库&#xff0c;或者创建新的数据库dbName&#xff0c;如果一个数据库没有表就不存在 db --显示数据库名称 #操作集合 show collections …

JavaScript操作BOM简单案例

需要两个页面index.html和Test.html&#xff0c;可以直接运行&#xff0c;每个功能都已经注释完整&#xff0c;index.html页面的代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head…

Java中“/”,“.”所代表的文件路径

转载自 Java中“/”&#xff0c;“.”所代表的文件路径 我们在开发的过程中&#xff0c;经常会去读、写文件。在读写文件的时候&#xff0c;就不得不写文件的路径&#xff0c;使用相对路径的方式有两种&#xff1a;”/”和 “.” 。在写文件的路径的时候&#xff0c;需要了解一…

Hibernate框架(1)

1.Hibernate框架简述 Hibernate的核心组件 在基于MVC设计模式的JAVA WEB应用中&#xff0c;Hibernate可以作为模型层/数据访问层。它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中…