‘壹’ J2EE涓镄勫瑰櫒閮藉寘𨰾鍝浜冲java瀹瑰櫒閮芥湁鍝浜
J2EE涓瀹瑰櫒鍏呭綋涓闂翠欢镄勮掕壊銆备富瑕佺殑瀹瑰櫒鍖呮嫭锛
銆怶EB瀹瑰櫒銆戯细缁椤勪簬鍏朵腑镄勫簲鐢ㄧ▼搴忕粍浠讹纸JSP锛孲ERVLET锛夋彁渚涗竴涓鐜澧冿纴浣縅SP,SERVLET鐩存帴镟村瑰櫒涓镄勭幆澧冨彉閲忔帴鍙d氦浜掞纴涓嶅繀鍏虫敞鍏跺畠绯荤粺闂棰樸备富瑕佹湁WEB链嶅姟鍣ㄦ潵瀹炵幇銆备緥濡傦细TOMCAT,WEBLOGIC,WEBSPHERE绛夈傝ュ瑰櫒鎻愪緵镄勬帴鍙d弗镙奸伒瀹圝2EE瑙勮寖涓镄刉EBAPPLICATION镙囧嗳銆傛垜浠鎶婇伒瀹堜互涓婃爣鍑嗙殑WEB链嶅姟鍣ㄥ氨鍙锅钦2EE涓镄刉EB瀹瑰櫒銆
銆怑JB瀹瑰櫒銆戯细Enterprisejavabean瀹瑰櫒銆傛洿鍏锋湁琛屼笟棰嗗烟鐗硅壊銆备粬鎻愪緵缁栾繍琛屽湪鍏朵腑镄勭粍浠禘JB钖勭岖$悊锷熻兘銆傚彧瑕佹弧瓒矹2EE瑙勮寖镄凟JB鏀惧叆璇ュ瑰櫒锛岄┈涓婂氨浼氲瀹瑰櫒杩涜岄珮鏁堢巼镄勭$悊銆傚苟涓斿彲浠ラ氲繃鐜版垚镄勬帴鍙f潵銮峰缑绯荤粺绾у埆镄勬湇锷°备緥濡傞偖浠舵湇锷°佷簨锷$$悊銆俉EB瀹瑰櫒鍜孍JB瀹瑰櫒鍦ㄥ师鐞嗕笂鏄澶т綋鐩稿悓镄勶纴镟村氱殑鍖哄埆鏄琚闅旂荤殑澶栫晫鐜澧冦俉EB瀹瑰櫒镟村氱殑鏄璺熷熀浜嶩TTP镄勮锋眰镓扑氦阆撱傝孍JB瀹瑰櫒涓嶆槸銆傚畠鏄镟村氱殑璺熸暟鎹搴撱佸叾瀹冩湇锷℃墦浜ら亾銆备絾浠栦滑閮芥槸鎶娄笌澶栫晫镄勪氦浜掑疄鐜颁粠钥屽噺杞诲簲鐢ㄧ▼搴忕殑璐熸媴銆备緥濡係ERVLET涓岖敤鍏冲绩HTTP镄勭粏鑺傦纴鐩存帴寮旷敤鐜澧冨彉閲弑ession,request,response灏辫屻丒JB涓岖敤鍏冲绩鏁版嵁搴撹繛鎺ラ熷害銆佸悇绉崭簨锷℃带鍒讹纴鐩存帴鐢卞瑰櫒𨱒ュ畬鎴愩
瀹瑰櫒灏辨槸浣犵殑绋嫔簭杩愯屾椂闇瑕佺殑鐜澧
1锛孴omcat鏄疭ervlet镄勮繍琛岀幆澧冿纴鍗充竴涓猄ervlet瀹瑰櫒銆
2锛孲ervlet瀹瑰櫒镄勪綔鐢ㄦ槸璐熻矗澶勭悊瀹㈡埛璇锋眰锛屽綋瀹㈡埛璇锋眰𨱒ュ埌镞讹纴Servlet瀹瑰櫒銮峰彇璇锋眰锛岀劧钖庤皟鐢ㄦ煇涓猄ervlet锛屽苟鎶奡ervlet镄勬墽琛岀粨鏋滆繑锲炵粰瀹㈡埛銆
3锛孲ervlet瀹瑰櫒镄勫伐浣滆繃绋嬫槸锛氩綋瀹㈡埛璇锋眰镆愪釜璧勬簮镞讹纴Servlet瀹瑰櫒浣跨敤瀵硅薄鎶婂㈡埛镄勮锋眰淇℃伅灏佽呰捣𨱒ワ纴铹跺悗璋幂敤javaServletAPI涓瀹氢箟镄凷ervlet镄勪竴浜涚敓锻藉懆链熸柟娉曪纴瀹屾垚Servlet镄勬墽琛岋纴鎺ョ潃鎶奡ervlet镓ц岀殑瑕佽繑锲炵粰瀹㈡埛镄勭粨鏋滃皝瑁呭埌瀵硅薄涓锛屾渶钖岙ervlet瀹瑰櫒鎶婂㈡埛镄勮锋眰鍙戦佺粰瀹㈡埛锛屽畬鎴愪负瀹㈡埛镄勪竴娆℃湇锷¤繃绋嬨傛疮涓涓猄ervlet镄勭被閮芥墽琛宨nit锛堬级銆乻ervice锛堬级銆乨estory锛堬级涓変釜鍑芥暟镄勮嚜锷ㄨ皟鐢锛屽湪钖锷ㄦ椂璋幂敤涓娆init锛堬级鍑芥暟鐢ㄤ互杩涜屽弬鏁扮殑鍒濆嫔寲锛屽湪链嶅姟链熼棿姣忓綋鎺ユ敹鍒板硅Servlet镄勮锋眰镞堕兘浼氲皟鐢⊿ervice锛堬级鍑芥暟镓ц岃Servlet镄勬湇锷℃搷浣滐纴褰揿瑰櫒阌姣佹椂璋幂敤涓娆destory锛堬级鍑芥暟銆
4锛屽吀鍨嬬殑Servlet搴旂敤鏄鐩戝惉鍣ㄣ佽繃婊ゅ櫒镄勫疄鐜般
‘贰’ 程序开发中常用的组件是什么
组件就是自包含的、可编程的、可重用的、与语言无关的软件单元,软件组件可以很容易被用于组装应用程序中。
Python 解释器可以从多种源获得输入:作为标准输入或程序参数传入的脚本,以交互方式键入的语句,导入的模块源文件等等。 这一章将给出在这些情况下所用的语法。
9.1. 完整的 Python 程序
虽然语言规范描述不必规定如兄轿启何发起调用语言解释器,但对完整的 Python 程序加以说明还是很有用的。 一个完整的 Python 程序会在最小初始化环境中被执行:所有内置和标准模块均为可用,但均处于未初始化状态,只有 sys (各种系统服务), builtins (内置函数、异常以及 None) 和 __main__ 除外。 最后一个模块用于为完整程序的执行提供局部和全局命名空间。
适用于一个完整 Python 程序的语法即下节所描述的文件输入。
解释器也可以通过交互模式被发起调用;在此情况下,它并不读取和执行一个完整程序,而是每次读取和执行一条语句(可能为复合语句)。 此时的初始环境与一个完整程序的相同;每条语句会在 __main__ 的命名空间中被执行。
一个完整程序可通过三种形式被传递给解释器:使用 -c 字符串 命令行选项,使用一个文件作为第一个命令行参数,或者使用标准输入。 如果文件或标准输入是一个 tty 设置,解释器会进入交互模式;否则的话,它会将文件当作一个完整程序来执行。
Python 解释器可以从多种源获得输入:作为标准输入或程序参数传入的脚本,以交互方式键入的语句,导入的模块源文件等等。 这一章将给出在这些情况下所用的语法。
9.1. 完整的 Python 程序
虽然语言规范描述不必规定如何发起调用语言解释器,但对完整的 Python 程序加以说明还是很有用的。 一个完整的 Python 程序会在最小初始化环境中被执行:所有内置和标准模块均为可用,但均处于未初始化状态,只有 sys (各种系统服务), builtins (内置函数、异常以及 None) 和帆衫 __main__ 除外。 最后一个模块用于为完整程序的执行提供局部和全局命名空间。
适用于一个完整 Python 程序的语法即下节所描述的文件输入。
解释器也可以通过交互模式被发起调用;在此情况下,它并不读取和执行一个完整程序,而是每次读取和执行一条语句(可能为复合语句)。 此时的初始环境与一个完整程序的相同;每条语句会在 __main__ 的命名空间中被执行。
一个完整程序可通过三种形式被传递给解释器:使用 -c 字符串 命令行选项,使用一个文件作为第一个命令行参数,或者使用标准输入。 如果文件或标准输入是一个 tty 设置,解释器会进入交互模式;否则的话,它会将文件当作一个完整羡如程序来执行。
‘叁’ 百战程序员:编程里有一个术语叫做容器,它是什么意思
容器,我们常规的说就是一个器皿,比如,杯子,它可以装水
程序中的容器也是一样,指的就是程序中的器皿,它可以存放数据,
但是程序中的数据是多种多样的,所以容器也就慧多种多样。
但是也有很多万能的容器,比如object,ArrayList,哈西表等等。
‘肆’ 微服务架构之“ 容器技术 ”
现在一聊到容器技术,大家就默认是指 Docker 了。但事实上,在 Docker 出现之前,PaaS社区早就有容器技术了,以 Cloud Foundry、OpenShift 为代表的就是当时的主流。
那为啥最终还是 Docker 火起来了呢?
因为传统的PaaS技术虽然也可以一键将本地应用部署到云上,并且也是采用隔离环境(容器)的形式去部署,但是其兼容性非常的不好。因为其主要原理就是将本地应用程序和启停脚本一同打包,然后上传到云服务器上,然后再在云服务器里通过脚本启动这个应用程序。
这样的做法,看起来很理想。但是在实际情况下,由于本地与云端的环境差异,导致上传到云端的应用经常各种报错、运行不起来,需要各种修改配置和参数来做兼容。甚至在项目迭代过程中不同的版本代码都需要重新去做适配,非常耗费精力。
然而 Docker 却通过一个小创新完美的解决了这个问题。在 Docker 的方案中,它不仅打包了本地应用程序,而且还将本地环境(操作系统的一部分)也打包了,组成一个叫做“ Docker镜像 ”的文件包。所以这个“ Docker镜像 ”就包含了应用运行所需的全部依赖,我们可以直接基于这个“ Docker镜像 ”在本地进行开发与测试,完成之后,再直接将这个“ Docker镜像 ”一键上传到云端运行即可。
Docker 实现了本地与云端的环境完全一致,做到了真正的一次开发随处运行。
一、容器到底是什么?
容器到底是什么呢?也许对于容器不太了解,但我们对虚拟机熟悉啊,那么我们就先来看一下容器与虚拟机的对比区别:
上图的左侧是虚拟机的原理,右侧是Docker容器的原理。
虚拟机是在宿主机上基于 Hypervisor 软件虚拟出一套操作系统所需的硬件设备,再在这些虚拟硬件上安装操作系统 Guest OS,然后不同的应用程序就可以运行在不同的 Guest OS 上,应用之间也就相互独立、资源隔离了,但是由于需要 Hypervisor 来创建虚拟机,且每个虚拟机里需要完整的运行一套操作系统 Guest OS,因此这个方式会带来很多额外资源的开销。
而 Docker容器 中却没有 Hypervisor 这一层,虽然它需要在宿主机中运行 Docker Engine,但它的原理却完全不同于 Hypervisor,它并没有虚拟出硬件设备,更没有独立部署全套的操作系统 Guest OS。
Docker容器没有那么复杂的实现原理,它其实就是一个普通进程而已,只不过它是一种经过特殊处理过的普通进程。
我们启动容器的时候(docker run …),Docker Engine 只不过是启动了一个进程,这个进程就运行着我们容器里的应用。但 Docker Engine 对这个进程做了一些特殊处理,通过这些特殊处理之后,这个进程所看到的外部环境就不再是宿主机的那个环境了(它看不到宿主机中的其它进程了,以为自己是当前操作系统唯一一个进程),并且 Docker Engine 还对这个进程所使用得资源进行了限制,防止它对宿主机资源的无限使用。
那 Docker Engine 具体是做了哪些特殊处理才有这么神奇的效果呢?
二、容器是如何做到资源隔离和限制的?
Docker容器对这个进程的隔离主要采用2个技术点:
弄清楚了这两个技术点对理解容器的原理非常重要,它们是容器技术的核心。
下面来详细解释一下:
三、容器的镜像是什么?
一个基础的容器镜像其实就是一个 rootfs,它包含操作系统的文件系统(文件和目录),但并不包含操作系统的内核。
rootfs 是在容器里根目录上挂载的一个全新的文件系统,此文件系统与宿主机的文件系统无关,是一个完全独立的,用于给容器进行提供环境的文件系统。
对于一个Docker容器而言,需要基于 pivot_root 指令,将容器内的系统根目录切换到rootfs上,这样,有了这个 rootfs,容器就能够为进程构建出一个完整的文件系统,且实现了与宿主机的环境隔离,也正是有了rootfs,才能实现基于容器的本地应用与云端应用运行环境的一致。
另外,为了方便镜像的复用,Docker 在镜像中引入了层(Layer)的概念,可以将不同的镜像一层一层的迭在一起。这样,如果我们要做一个新的镜像,就可以基于之前已经做好的某个镜像的基础上继续做。
如上图,这个例子中最底层是操作系统引导,往上一层就是基础镜像层(Linux的文件系统),再往上就是我们需要的各种应用镜像,Docker 会把这些镜像联合挂载在一个挂载点上,这些镜像层都是只读的。只有最上面的容器层是可读可写的。
这种分层的方案其实是基于 联合文件系统UnionFS(Union File System)的技术实现的。它可以将不同的目录全部挂载在同一个目录下。举个例子,假如有文件夹 test1 和 test2 ,这两个文件夹里面的文件 有相同的,也有不同的。然后我们可以采用联合挂载的方式,将这两个文件夹挂载到 test3 上,那么 test3 目录里就有了 test1 和 test2 的所有文件(相同的文件有去重,不同的文件都保留)。
这个原理应用在Docker镜像中,比如有2个同学,同学A已经做好了一个基于Linux的Java环境的镜像,同学S想搭建一个Java Web环境,那么他就不必再去做Java环境的镜像了,可以直接基于同学A的镜像在上面增加Tomcat后生成新镜像即可。
以上,就是对微服务架构之“ 容器技术 ”的一些思考。
码字不易啊,喜欢的话不妨转发朋友,或点击文章右下角的“在看”吧。