架构杂谈《七》

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1022560838/article/details/97250399

容器VS虚拟机

一、什么是虚拟机

  虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统

  虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 ,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。虚拟系统和传统的虚拟机(Parallels Desktop ,VmwareVirtualBoxVirtual pc)不同在于:虚拟系统不会降低电脑的性能,启动虚拟系统不需要像启动windows系统那样耗费时间,运行程序更加方便快捷;虚拟系统只能模拟和现有操作系统相同的环境,而虚拟机则可以模拟出其他种类的操作系统;而且虚拟机需要模拟底层的硬件指令,所以在应用程序运行速度上比虚拟系统慢得多。

  流行的虚拟机软件VMware(VMWare ACE)、Virtual BoxVirtual PC,它们都能在Windows系统上虚拟出多个计算机。

 

  以上内容来自 百度百科

  总结下:

  虚拟机用于为用户提供一个完整的系统镜像,常见的虚拟机有VMware、Virtual Box、KVM等。虚拟机技术可以为每个用户分配虚拟化后的CPU、内存和I/O等设备资源,但是为了能运行应用程序,除了需要部署应用程序本身及其依赖外,还需要安装整个操作系统和驱动。

二、什么是容器

  容器是一种轻量级、可移植的为应用程序提供了隔离的运行空间。每个容器内都包含一个独享的完整用户环境,并且一个容器内的环境变动不会影响其他容器的运行环境,可以使应用程序在几乎任何地方以相同的方式运行(如 在开发人员自己的本子上创建并测试好的容器无须任何修改就能在生产环境中的虚拟机、物理服务器或者云上运行)

  在技术方面,容器是通过一系列系统级别的机制来实现的(如:通过Linux Namespaces进行空间隔离,通过文件系统的挂载点来决定容器可以访问哪些文件;通过cgroups 来确定每个容器可以利用多少资源),容器之间通过共享同一个系统内核来提升内存的使用率。

三、容器与虚拟机的区别

  容器是对应用层的抽象,它把应用程序的代码和相关依赖打包在一起执行,多个容器可以在同一台物理机上互不影响地独立运行,并且共享操作系统内核。启动快、占用空间少。而虚拟机是物理硬件层上的虚拟化,系统管理程序使虚拟机能够运行在同一台物理机上,但是每台虚拟机必须包括一整套操作系统、应用程序和各种依赖库等。启动慢、占用空间大。

四、容器主要解决的问题 

  容器有轻量级、可隔离性和可移植等特性,所以应用程序的容器化使得应用程序具备了超强的可移植性。
  在 Web 1.0 时代,信息是单向的,交互只在人与网络之间进行,大多人上网是为了看新闻,因此应用程序相对简单,一般采用 LAMP。 ( Linux-Apache-MySQL-PHP )的三层架构(Presentation 、 Application 、 Data ),只需要部署到有限的几台物理服务器上;在如今的 Web2.0甚至 Web 3.0 时代,互联网连接一切,包括连接人与人、人与物、物与物,系统架构较 10 年前己经变得非常复杂,开发人员通常使用多种服务构建和组装应用,比如分布式消息队列 Kafka、分布式缓存 Redis、分布式文件系统 HDFS 或 Spring Cloud 或 Azure Service Fabric等。复杂应用系统的相应部署环境也变得非常复杂,可能会部署到不同的环境中,比如开发服务器、测试服务器和生产服务器,服务器也可能是虚拟服务器、私有云或公有云等,如下图:

  因为存在各种服务和环境,所以开发人员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台进行各种配置,对于他们双方来说,这些都是艰巨的任务,那么如何让每种服务在所有的部署环境中顺利运行呢?容器就很好地帮我们解决了这个难题。
  我们先联想下几十年前的运输行业,在每一次运输中,货主与承运方都会担心货物因种类不同而受损,比如易碎的东西被错误地压在了最下面。另 一方面,在运输过程中需要使用不同的交通工具,比如货物先被装上卡车运到码头,再被装上船,到岸后又被卸下船,再被装上火车 ,到达目的地再被卸下 。其中的大部分时间都花费在对不同物品的装货、卸货上,而且搬上搬下还容易损坏物品 。幸运的是,集装箱的发明解决了这个难题 : 任何货物,不管是床垫还是机器,都被放在各自的集装箱中,集装箱在整个运输过程中都是密封的,只有到达目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以方便地在卡车、轮船和火车之间移动集装箱,集装箱被誉为运输业与世界贸易的最重要的发明。
  Docker 将集装箱思想运用到对软件的打包上,为代码提供了 一个基于容器的标准化运输系统,可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器,可以运行在几乎所有操作系统上。

五、Docker的优势

  1)、Docker 在开发方面的优势

  每个人的开发环境都不一样,由于在开发过程中会不断地切换项目工程,所以每次都要不断的重复修改和设置开发环境,而Docker可以使这一过程变得自动化,让开发人员更加关注软件开发(比如:开发人员使用Docker后就不需要单独安装和配置数据库,也不需要担心不同版本的冲突问题),容器化的应用更容易构建、分享和运行,如果团队有新的同事加入,也不需要花费好几个小时讲解如何搭建环境及安装软件和相关的配置,只需要花费几分钟安装Docker就能编译和调试程序了。

  2)、Docker 在运维方面的优势

  Docker 使软件的发布更加高效,不管是更新版本还是修复 Bug,都能快速发布完成,并且能瞬间伸缩扩展。Docker 能够实现自动化的编译、打包、测试和部署,运维人员不再需要WiKi 、 README 、 CleckList 文档,因为 Docker 在开发、测试和生产环境中都使用了相同的镜像,所以更新时不会出现不一致的问题。

  3)、Docker 在容器和虚拟机方面的优势

  Docker 使容器和虚拟机相结合( Docker Machine 实现了容器和虚拟机的有效结合),使部署和管理应用变得更加灵活 。我们可以在虚拟机中启动一个容器,这里的虚拟机并不是由 Docker控制的,而是通过现有的虚拟化管理设施来控制的 。一旦系统实例启动,就可以通过安装 Docker来运行容器并进行其他特殊设置。同时由于不同的容器运行在不同的虚拟机上,容器之间也能有很好的隔离。

说明:

  1、参考书籍:《分布式服务架构:原理、设计与实战》

  2、如有不合适的地方请反馈。综合后更改。

展开阅读全文

Java杂谈(七)--接口& 组件、容器

10-31

[color=#0000FF][align=center]Java杂谈(七)--接口& 组件、容器[/align]rn 终于又静下来继续写这个主题的续篇,前六篇主要讲了一些J2se方面的经验和感受, 眼下Java应用范围已经被J2ee占据了相当大的一块领域,有些人甚至声称Java被J2ee所取代了。不知道大家如何来理解所谓的J2ee(Java2 Enterprise Edition),也就是Java企业级应用?rn rn 笔者的观点是,技术的发展是顺应世界变化的趋势的,从C/S过渡到B/S模式,从客户端的角度考虑企业级应用或者说电子商务领域不在关心客户端维护问题,这个任务已经交给了任何一台PC都会有的浏览器去维护;从服务器端的角度考虑,以往C/S中的TCP/IP协议实现载体ServerSocket被Web Server Container所取代,例如大家都很熟悉的Tomcat、JBoss、WebLogic等等。总之一切的转变都是为了使得Java技术能更好的为人类生产生活所服务。rn rn 有人会问,直接去学J2ee跳过J2se行否?笔者是肯定不赞成的,实际上确实有人走这条路,但笔者自身体会是正是由于J2se的基础很牢固,才会导致在J2ee学习的道路上顺风顺水,知识点上不会有什么迷惑的地方。举个简单的例子吧:rn rn 笔者曾经跟大学同学讨论下面这两种写法的区别:rn ArrayList list = new ArrayList(); //笔者不说反对,但至少不赞成rn List list = new ArrayList(); //笔者支持rnrn 曾经笔者跟同学争论了几个小时,他非说第一种写法更科学,第二种完全没有必要。我无法完全说服他,但笔者认为良好的习惯和意识是任何时候都应该针对接口编程,以达到解耦合和可扩展性的目的。下面就以接口开始进入J2ee的世界吧:rn rn 1. J2ee与接口rn rn 每一个版本的J2ee都对应着一个确定版本的JDK,J2ee1.4对应Jdk1.4,现在比较新的是JDK5.0,自然也会有J2EE 5.0。其实笔者一直在用的是J2EE1.4,不过没什么关系,大家可以下任何一个版本的J2ee api来稍微浏览一下。笔者想先声明一个概念,J2ee也是源自Java,所以底层的操作依然调用到很多J2se的库,所以才建议大家先牢牢掌握J2se的主流技术。rnrn J2ee api有一个特点,大家比较熟悉的几个包java.jms、javax.servlet.http、javax.ejb等都以interface居多,实现类较少。其实大家真正在用的时候百分之六十以上都在反复的查着javax.servlet.http这个包下面几个实现类的api函数,其他的包很少问津。笔者建议在学习一种技术之前,对整体的框架有一个了解是很有必要的,J2ee旨在通过interface的声明来规范实现的行为,任何第三方的厂商想要提供自己品牌的实现前提也是遵循这些接口定义的规则。如果在从前J2se学习的道路上对接口的理解很好的话,这里的体会将是非常深刻的,举个简单的例子:rn rn public interface Mp3rn public void play();rn public void record();rn public void stop();rn rnrn 如果我定义这个简单的接口,发布出去,规定任何第三方的公司想推出自己的名字为Mp3的产品都必须实现这个接口,也就是至少提供接口中方法的具体实现。这个意义已经远远不止是面向对象的多态了,只有厂商遵循J2ee的接口定义,世界上的J2ee程序员才能针对统一的接口进行程序设计,最终不用改变代码只是因为使用了不同厂商的实现类而有不同的特性罢了,本质上说,无论哪一种厂商实现都完成了职责范围内的工作。这个就是笔者想一直强调的,针对接口编程的思想。rnrn 接口到底有什么好处呢?我们这样设想,现在有AppleMp3、SonyMp3、SamsungMp3都实现了这个Mp3的接口,于是都有了play、record、stop这三个功能。我们将Mp3产品座位一个组件的时候就不需要知道它的具体实现,只要看到接口定义知道这个对象有3个功能就可以使用了。那么类似下面这样的业务就完全可以在任何时间从3个品牌扩展到任意个品牌,开个玩笑的说,项目经理高高在上的写完10个接口里的方法声明,然后就丢给手下的程序员去写里面的细节,由于接口已经统一(即每个方法传入和传出的格式已经统一),经理只需关注全局的业务就可以天天端杯咖啡走来走去了,^_^:rn public Mp3 create();rn public void copy(Mp3 mp3);rn public Mp3 getMp3();rnrn 最后用一个简单的例子说明接口:一个5号电池的手电筒,可以装入任何牌子的5号电池,只要它符合5号电池的规范,装入之后任何看不到是什么牌子,只能感受到手电筒在完成它的功能。那么生产手电筒的厂商和生产5号电池的厂商就可以完全解除依赖关系,可以各自自由开发自己的产品,因为它们都遵守5号电池应有的形状、正负极位置等约定。这下大家能对接口多一点体会了么?rnrn 2. 组件和容器rn 针对接口是笔者特意强调的J2ee学习之路必备的思想,另外一个就是比较常规的组件和容器的概念了。很多教材和专业网站都说J2EE的核心是一组规范与指南,强调J2ee的核心概念就是组件+容器,这确实是无可厚非的。随着越来越多的J2ee框架出现,相应的每种框架都一般有与之对应的容器。rn rn 容器,是用来管理组件行为的一个集合工具,组件的行为包括与外部环境的交互、组件的生命周期、组件之间的合作依赖关系等等。J2ee包含的容器种类大约有Web容器、Application Client容器、EJB容器、Applet客户端容器等。但在笔者看来,现在容器的概念变得有点模糊了,大家耳熟能详是那些功能强大的开源框架,比如Hibernate、Struts2、Spring、JSF等,其中Hibernate就基于JDBC的基础封装了对事务和会话的管理,大大方便了对数据库操作的繁琐代码,从这个意义上来说它已经接近容器的概念了,EJB的实体Bean也逐渐被以Hibernate为代表的持久化框架所取代。rn rn 组件,本意是指可以重用的代码单元,一般代表着一个或者一组可以独立出来的功能模块,在J2ee中组件的种类有很多种,比较常见的是EJB组件、DAO组件、客户端组件或者应用程序组件等,它们有个共同特点是分别会打包成.war,.jar,.jar,.ear,每个组件由特定格式的xml描述符文件进行描述,而且服务器端的组件都需要被部署到应用服务器上面才能够被使用。rnrn 稍微理解完组件和容器,还有一个重要的概念就是分层模型,最著名的当然是MVC三层模型。在一个大的工程或项目中,为了让前台和后台各个模块的编程人员能够同时进行工作提高开发效率,最重要的就是实现层与层之间的耦合关系,许多分层模型的宗旨和开源框架所追求的也就是这样的效果。在笔者看来,一个完整的Web项目大概有以下几个层次:rnrn a) 表示层(Jsp、Html、Javascript、Ajax、Flash等等技术对其支持) rn b) 控制层(Struts、JSF、WebWork等等框架在基于Servlet的基础上支持,负责把具体的请求数据(有时卸载重新装载)导向适合处理它的模型层对象)rn c) 模型层(笔者认为目前最好的框架是Spring,实质就是处理表示层经由控制层转发过来的数据,包含着大量的业务逻辑)rn d) 数据层(Hibernate、JDBC、EJB等,由模型层处理完了持久化到数据库中)rnrn 当然,这仅仅是笔者个人的观点,仅仅是供大家学习做一个参考,如果要实现这些层之间的完全分离,那么一个大的工程,可以仅仅通过增加人手就来完成任务。虽然《人月神话》中已经很明确的阐述了增加人手并不能是效率增加,很大程度上是因为彼此做的工作有顺序上的依赖关系或者说难度和工作量上的巨大差距。当然理想状态在真实世界中是不可能达到的,但我们永远应该朝着这个方向去不断努力。最开始所提倡的针对接口来编程,哪怕是小小的细节,写一条List list= = new ArrayList()语句也能体现着处处皆使用接口的思想在里面。Anyway,这只是个开篇,笔者会就自己用过的J2ee技术和框架再细化谈一些经验。[/color] 论坛

没有更多推荐了,返回首页