Java Web 技术栈宣讲
随着公司技术线路转型工作的不断深入,Java Web技术栈也已经基本确定,本次培训将针对关键技术点进行讲解和说明,让大家对未来使用的语言、框架和工具有个初步的认识,便于后期快速入手,早日实现
从入门到放弃
。
首先来看一张大图总结图
:
1. 语言
1.1. Java
首先祭出
Java之父(他那锃[zèng]亮的脑门是不是非常符合你对程序员的认知):
在上个世纪九十年代,单片机的编程悄然兴起,这引起了自动化控制人员的广泛兴趣。因为可以很大幅度的提高硬件的“智能程度”,所以被广泛应用。正所谓无利不起早,在当时SUN公司也看中了这块市场。于是在1991年成立了开发小组,准备进入这一市场。但是在开发的过程中,小组的成员发现使用C++开发相关程序十分繁琐,于是发现了一门新的语言,这就是Java的前身Oak。
但是Oak的发展并不顺利,它存在很多的缺陷,于是经过多次的磋商和协调,Java语言应运而生。
并且在1996年的SUN公司发布了Java开发工具包JDK1.0,并且Java开发工具包的发展一直持续至今。
JDK结构体系
-
Java和环境关系
JDK内部组成图
JDK(Java Development ToolKit)
,包含了Java运行环境(JRE)和开发工具(编译器,调试器,javadoc等)。我们就是依靠JDK来开发和运行Java程序的。
JDK的编译器Javac[.exe],会将Java代码编译成字节码(.class文件)。编译出的字节码在任何平台上都一样的内容,所以我们说Java语言是门跨平台语言。Write once, run anywhere。
JRE(Java Runtime Environment)
,它为Java提供了运行环境,其中重要的一环就是通过JVM将字节码解释成可执行的机器码。
JRE由JVM,Java运行时类库,动态链接库等组成。
JVM(Java Virtual Machine)
,Java虚拟机,可以看做是一台抽象化的计算机,它有一套完整的体系架构,包括处理器、堆栈 、寄存器等。
在运行时环境,JVM会将Java字节码解释成机器码。机器码和平台相关的(不同硬件环境、不同操作系统,产生的机器码不同),所以JVM在不同平台有不同的实现。
目前JDK默认使用的实现是Hotspot VM。具体可以和.Net Framework做对等比较
- 安装目录主要组成
-
典型工具
Java流行领域
- Tiobe发布2019年3月编程语言排行榜
- Java应用领域
JDK版本历史,Java8的选择
- JDK官方版本的历史
JDK版本 | 发布日期 |
---|---|
jdk1.4 | 2000年5月 |
jdk1.5 | 2004年9月 |
jdk1.6 | 2005年6月 |
jdk1.7 | 2011年 |
jdk1.8 | 2014年 |
jdk1.9 | 2017年 |
jdk1.10 | 2018年 |
- Jdk1.8市场应用调查
-
jdk1.8特点
Lambda表达式
Stream函数式操作流元素集合
接口新增:默认方法与静态方法
方法引用,与Lambda表达式联合使用
引入重复注解
类型注解
最新的Date/Time API (JSR 310)
新增base64加解密API
数组并行(parallel)操作
JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间
1.2. ES6
介绍
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
JavaScript 是大家所了解的语言名称,但是这个语言名称是商标( Oracle 公司注册的商标)。因此,JavaScript 的正式名称是 ECMAScript 。1996年11月,JavaScript 的创造者网景公司将 JS 提交给国际化标准组织 ECMA(European computer manufactures association,欧洲计算机制造联合会),希望这种语言能够成为国际标准,随后 ECMA 发布了规定浏览器脚本语言的标准,即 ECMAScript。这也有利于这门语言的开放和中立。
ECMAScript 历史
ES6 是 ECMAScript 标准十余年来变动最大的一个版本,为其添加了许多新的语法特性。
1997 年 ECMAScript 1.0 诞生。
1998 年 6 月 ECMAScript 2.0 诞生,包含一些小的更改,用于同步独立的 ISO 国际标准。
1999 年 12 月 ECMAScript 3.0诞生,它是一个巨大的成功,在业界得到了广泛的支持,它奠定了 JS 的基本语法,被其后版本完全继承。直到今天,我们一开始学习 JS ,其实就是在学 3.0 版的语法。
2000 年的 ECMAScript 4.0 是当下 ES6 的前身,但由于这个版本太过激烈,对 ES 3 做了彻底升级,所以暂时被"和谐"了。
2009 年 12 月,ECMAScript 5.0 版正式发布。ECMA 专家组预计 ECMAScript 的第五个版本会在 2013 年中期到 2018 年作为主流的开发标准。
2011年6月,ES 5.1 版发布,并且成为 ISO 国际标准。
2013 年,ES6 草案冻结,不再添加新的功能,新的功能将被放到 ES7 中;
2015年6月, ES6 正式通过,成为国际标准。
特点
块级作用域:const 与 let 变量
模板字面量
解构
对象字面量简写法
for...of循环
展开运算符
剩余参数(可变参数)
ES6箭头函数
默认参数函数
模块化import/export
JavaScript类
开源书籍:《ECMAScript 6 入门》
基于ES6的三驾马车
官方标准
ECMAScript 6 标准规范&ECMA-262.pdf
2. 框架
2.1 Spring
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean(是一种JAVA语言写成的可重用组件)代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
spring-framework
七大核心模块
核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是
BeanFactory
,它是工厂模式的实现。BeanFactory
使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
我们为啥用Spring |
---|
Java主流框架,稳定而且社区活跃,大企业都在用,而且是标准 |
Ioc容器和Spring MVC框架比现在我们用的ABP框架成熟,ABP其实是模仿Spring |
我们的业务系统符合整体平移到Java平台 |
2.2 Spring Boot
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置(
习惯大于约定
),从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
项目构建菜单化
自动配置
理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快速构建出标准化的应用。
打包式的starters
提供了多个可选择的”starter”以简化Maven的依赖管理(也支持Gradle),让您可以按需加载需要的功能模块。
actuator(监控)
提供了一整套的对应用状态的监控与管理的功能模块(通过引入spring-boot-starter-actuator),包括应用的线程信息、内存信息、应用是否处于健康状态等,为了满足更多的资源监控需求,Spring Cloud中的很多模块还对其进行了扩展。
spring boot admin
我们为啥用Spring Boot |
---|
在Spring的基础上的框架,选择Spring 必选 |
简化使用Spring的配置过程 |
业界成熟,版本持续更新 |
2.3 Mybatis
ORM选型
一个项目中用到的复杂查询基本没有,就是最基本的增删改查,这样选择Hibernate的效率就要高些了,因为基本的SQL语句已经被封装好,根本不需要手写SQL,可以节省大量时间,但是对于一个大型项目,复杂的查询语句较多,使用MyBatis就会加快很多,而且SQL语句管理也会很方便。
MyBatis 是一款优秀的持久层框架,它支持
定制化 SQL
、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解
来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
Mybatis-Plus(为简化开发而生)
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
- 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
我们为什么选择Mybatis+Mybatis-Plus |
---|
类似EF6使用方式,平移技术平滑 |
借助Mybatis,简单CRUD可以零Sql |
复杂业务Sql可以自行优化 |
代码生成工具,丰富强大 |
互联网企业必选,社区稳定,支持强大 |
2.4 Vue
Vue.js 是一个JavaScript MVVM库,是一套构建用户界面的渐进式框架。它是以
数据驱动
和组件化
的思想构建的,采用自底向上增量开发的设计。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js;同时比起 React + Redux 相对复杂的架构,Vue.js 更加轻量级也更加容易上手,是初创项目的首选前端框架。Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合。并且作者是华人的关系,Vue拥有着对华人开发者最友好的api文档和官方教程。
MVVM概念
jQuery和Vue区别
jQuery是使用选择器$
选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。比如需要获取label标签的内容:$("lable").val();,它还是依赖DOM元素的值。
$("#id").val("hello world");
Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象
,可以说数据和View是分离的,他们通过Vue对象这个虚拟Dom实现相互的绑定。这就是传说中的MVVM。
Vue文件格式
{{ message }}
作者
基于Vue的UI组件
我们选型Vue.js的原因 |
---|
Vue.js国内比较火 |
UI组件丰富 |
语法比较适合国人习惯,对MVVM的概念比较清晰 |
Vue全家桶(vue-router路由、vuex状态管理、axios) |
UI组件对比
2.5 UI组件
Ant Design Vue
基于蚂蚁金服 Ant Design 的Vue 实现,开发和服务于企业级后台产品。
特性
- 提炼自企业级中后台产品的交互语言和视觉风格。
- 开箱即用的高质量 Vue 组件。
- 共享Ant Design of React设计工具体系。
- 现代浏览器和 IE9 及以上(需要 polyfills)
周边工具
组件内容
3. 工具
3.1 Intellij IDEA
IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。
2018年Java开发IDE调查排行:
旗舰版和社区版功能对比
3.2 STS
spring tool suite (sts)
https://spring.io/tools
其实就是一个被包装过的Eclipse,主要用于快速的开发Spring项目,我们不用再去编辑繁琐的xml配置文件,而是由工具自动生成。
特点:免费
3.3 Maven
Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
Maven提供了开发人员的方式来管理:
Builds
Documentation
Reporting
Dependencies
SCMs
Releases
Distribution
mailing list
概括地说,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。
可以和微软的NuGet
进行对比,但是他包含功能的比nuget多。
仓库结构
流行程度
IDEA内工具
我们用Maven干嘛
- Java项目模板(Pom.xml)
- 依赖公共jar管理(各种Spring\SpringBoot生态圈的jar)
- 公司内部基础类库仓库(目前的公共dll都是手工拷贝传递的)
- 打包发布工具
3.4 Git
Git是目前世界上最先进的
分布式
版本控制系统(没有之一
)。Git有什么特点?简单来说就是:高端大气上档次!
源码管理特点
提交到本地库
提交到远程库
远程库方案选型
3.5 VS Code
史上最优秀的 IDE之一,尤其在
前端
界。
特点
免费开源
微软出品,全部免费使用。而且是开源项目,源码都给你了,你还要什么自行车?
多平台支持
占系统资源少
安装完约 189 MB
内存上, 相对于 eclipse, vscode 占用内存更少. eclipse 约占用 478 MB(1 个进程), vscode 约共占用 200 MB(6 个进程)。
使用简单
找不到比这个使用更简单的 IDE 了, 完全符合程序员的使用习惯, 90% 程序员都会爱上 ta, 还有 10% 后来不写代码了. 各种快捷键满天飞, 自定义快捷键, 自定义功能, 爽到只想安安静静的写代码。
提供丰富的插件
功能强大
你想要的功能, 这里都有. 如果没有, 那应该是你还不会用
界面很赞
界面很程序员, 很专业, 美观大方, 长时间看也不累
3.6 NPM
npm 是 Node.js 官方提供的包管理工具,他已经成了 Node.js 包的标准发布平台,用于 Node.js 包的发布、传播、依赖控制。npm 提供了命令行工具,使你可以方便地下载、安装、升级、删除包,也可以让你作为开发者发布并维护包。
npm 是随同 Node.js 一起安装的包管理工具,能解决 Node.js 代码部署上的很多问题,常见的场景有以下几种:
允许用户从 npm 服务器下载别人编写的第三方包到本地使用。
允许用户从 npm 服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到 npm 服务器供别人使用。
npm 的背后,是基于 couchdb 的一个数据库,详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。它的一个很重要的作用就是:将开发者从繁琐的包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。
3.7 WebPack
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
为什要使用WebPack
现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包。为了简化开发的复杂度,前端社区涌现出了很多好的实践方法
- 模块化,让我们可以把复杂的程序细化为小的文件;
- 类似于TypeScript这种在JavaScript基础上拓展的开发语言:使我们能够实现目前版本的JavaScript不能直接使用的特性,并且之后还能转换为JavaScript文件使浏览器可以识别;
- Scss,less等CSS预处理器
- ...
这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让浏览器识别,而手动处理又是非常繁琐的,这就为WebPack类的工具的出现提供了需求。
什么是Webpack
WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。这个过程帮我们进行了压缩、合并、语法分析、语法转义等等很多操作。
4. 服务器容器
4.1 Tomcat
Web服务器软件,Java Servlet容器,对比IIS
https://tomcat.apache.org/
4.2 Nginx
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
4.3 Node.js
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
用来干嘛
我们主要用它来作为运行npm、webpack等工具的运行环境,以及前端模拟开发(mock)时候的Web服务器(Express)
5. 架构畅想
近两年“微服务架构”被炒的火热,传统软件企业是否能怀抱微服务,从而对软件产品进行一次架构优化升级,似乎一直成为信息系统架构师思考的问题。传统行业对IT效率的变革需求是微服务成长土壤,业务模式创新重塑导致系统更新频繁、应用复杂度急剧升高,传统架构不堪重负。伴随着Spring Cloud开源界各种微服务落地方案的出现和热议,这些企业都积极拥抱了微服务,并在生产环境使用。
5.1 现在架构情况
目前软件产品系统涵盖多个(20个)模块,或者称为应用,每个应用有独立团队进行开发维护,独立技术线路,且独立部署。有一个基础应用:基础服务SIP,主要负责维护基础数据、认证授权、配置等基础服务,并对各个独立应用提供服务访问,各个业务只负责业务范畴的功能。各个应用之间也存在相互之间的服务依赖和调用,这种调用一般以webservice的形式存在,且服务地址配置往往记录在应用本身。系统外存在移动应用,其部分数据依托于该软件产品,且调用方式为直接发起对目标App的请求。
所以,伴随着系统规模继续扩大,或者需求迭代继续,当前架构似乎的确存在一些问题:
1、模块之间直接依赖,且服务地址零散配置,形成网状
2、模块服务接口版本任意,版本迭代困难,服务调用方式多样,不便于管理
4、各个App对服务依赖是单线的,服务进行App级别的负载均衡困难
5、移动和第三方应用直接对各个App进行访问,穿透产品边界,且无权限控制
6、配置信息不集中,无有效管理
7、各个App服务状态未知,且容易引起单点
8、服务调用没有可追踪记录,发现问题困难
9、跨服务更新,无事务
10、跨团队接口调用沟通频繁
5.2 微服务时代畅享
分析了现阶段架构的痛点,那么借助微服务架构特点,我们可以怎样进行升级或者思考呢,还是直接画图阐述:
改造点:
1、单App技术线路统一
2、引入网关层,进行路由和负载均衡
3、引入注册中心,对各个App对内提供的服务进行注册和发现
4、引入配置中心,抽取公共配置,便于统一管理
5、引入基础服务层,支撑多基础服务方集成支持
6、引入日志和监控平台,进行服务调用最终,甚至可以进行容错性熔断
7、高并发下,可以进一步采用7层或者4层LB,对网关进行负载均衡
8、个别应用间可引入分布式事务,进行数据一致性保障
9、App应用可独立部署,便于Paas平台运行
畅想架构难点
这种改造的优点,显然对各个应用进行了更好的治理,但是同时也带来了很多难点:
1、"应用外服务设施"变多,对软件产品整体部署和运维带来困难
2、需要更多基础技术架构团队的技术支撑
3、基础服务层,需多种平台的实现(Supos\BAP)
4、团队技术能力提升
典型变化
5.3 Spring Cloud
Spring Cloud 是基于Spring Boot 的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,跟spring boot 框架一起使用的话,会让你开发微服务架构的云服务非常好的方便。
微服务落地组件
Spring Cloud作为一个微服务架构标准,落地的实现方案有Spring Cloud Netflix
,Spring Cloud Alibaba
Spring Cloud Netflix
Spring Cloud Aalibaba
6. 容器化和Pass平台部署
docker容器
传统虚拟机
每个虚拟机都包括应用程序、必要的二进制文件和库以及一个完整的客户操作系统(Guest OS),尽管它们被分离,它们共享并利用主机的硬件资源,将近需要十几个 GB 的大小。
容器
容器包括应用程序及其所有的依赖,但与其他容器共享内核。它们以独立的用户空间进程形式运行在主机操作系统上。他们也不依赖于任何特定的基础设施,Docker 容器可以运行在任何计算机上,任何基础设施和任何云上。
Docker 的容器利用了 LXC(linux container),管理利用了namespaces
来做权限的控制和隔离,cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率,而这些技术都不是 Docker 独创。
LXC 与虚拟机的不同之处在于,它是一个操作系统级别的虚拟化环境,而不是硬件虚拟化环境。他们都做同样的事情,但 LXC 是操作系统级别的虚拟化环境,虚拟环境有它自己的进程和网络空间,而不是创建一个完整成熟的虚拟机。因此,一个 LXC 虚拟操作系统具有最小的资源需求,并启动只需几秒钟。
dockerfile
FROM anapsix/alpine-java:8_server-jre_unlimited
MAINTAINER [email protected]
RUN mkdir -p /blade/user
WORKDIR /blade/user
EXPOSE 8102
ADD ./target/blade-user.jar ./app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
CMD ["--spring.profiles.active=test"]
运行容器截图
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq management ac01c753758c 4 weeks ago 213MB
openzipkin/zipkin latest 7ee685d20e4d 4 weeks ago 260MB
sentinel 1.5.1 bff6901e5563 4 weeks ago 126MB
nacos/nacos-server latest fbf2aa0a0435 4 weeks ago 697MB
openjdk 8-jdk-alpine 3675b9f543c5 5 weeks ago 105MB
openjdk 8-jre d55d64383c12 6 weeks ago 443MB
redis 4.0 14433f4e77ab 7 weeks ago 83.4MB
mysql 5.7 98455b9624a9 7 weeks ago 372MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
------------------------------------------------------------------------------------
c831d8b81fcb openzipkin/zipkin "/busybox/sh run.sh" 4 weeks ago Up 3 minutes 9410/tcp, 0.0.0.0:9411->9411/tcp brave_ptolemy
------------------------------------------------------------------------------------
7ea9ac5dd2de rabbitmq:management "docker-entrypoint.s…" 4 weeks ago Exited (0) 2 seconds ago rabbit
------------------------------------------------------------------------------------
046539f02d48 sentinel:1.5.1 "java -Dserver.port=…" 4 weeks ago Up 3 minutes 0.0.0.0:8181->8181/tcp sentinel
------------------------------------------------------------------------------------
ce4562c06439 redis:4.0 "docker-entrypoint.s…" 4 weeks ago Up 3 minutes 0.0.0.0:6379->6379/tcp sleepy_kowalevski
------------------------------------------------------------------------------------
1e3982017c57 mysql:5.7 "docker-entrypoint.s…" 4 weeks ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-5.7
------------------------------------------------------------------------------------
5b0ee37cc479 nacos/nacos-server:latest "bin/docker-startup.…" 4 weeks ago Up 3 minutes 0.0.0.0:8848->8848/tcp nacos-standalone
镜像仓库
Pass平台
Paas则提供了基础架构,软件开发者可以在这个基础架构之上建设新的应用,或者扩展已有的应用,同时却不必购买开发、质量控制或生产服务器。而应用的部署方式往往是docker镜像的形式。
典型--阿里云飞天开发平台
supOS工业操作系统
容器治理 kubernetes
是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
基于Docker和Kubernetes的最佳架构实践
未来展望关键字
Cloud Native云原生
服务网格(Service Mesh)