Java后端从入门到放弃
1.JavaSE
1.1 Java帝国的诞生
1)C&C++
①1972年C诞生:
贴近硬件,运行极快,效率极高
操作系统,编译器,数据库,网络系统等
指针和内存管理
②1982年C++诞生:面向对象 兼容C 网络系统等
③建立了新的语言Java:语法有点像C、没有指针、没有内存管理、真正的可移植性、编写一次,到处运行、面向对象、类型安全、质量高的类库······
2)Java初生
1995年的网页简单而粗糙,缺乏互动性。
图形界面的程序(Applet)
Java 2 标准版(J2SE):去占领桌面
Java 2 移动版(J2ME):去占领手机
Java 2 企业版(J2EE):去占领服务器
2)Java发展
基于Java开发居多的平台系统
①构建工具:Ant,Maven,Jekins
②应用服务器:Tomcat,Jetty,Jboss,Websphere,weblogic
③Web开发:Struts,Spring,Hibernate,myBatis
④开发工具:Eclipse,Netbean,intellij idea,Jbuilder
······
2006:Hadoop(大数据领域) 2008:Android(手机端)
1.2 Java的特性和优势
简单性、面对对象(万物皆对象)、可移植性、高性能、分布式、动态性、多线程、安全性、健壮性
1.3 Java的三大版本
跨平台(Write Once、Run Anywhere)
JavaSE:标准版(桌面程序,控制台开发······)
JavaME:嵌入式开发(手机,小家电,······)
JavaEE:E企业家开发(web端,服务器开发······)
1.4 JDK、JRE、JVM
JDK:Java Development Kit
JRE:Java Runtime Environment
JVM:Java Virtual Machine
环境搭建、语法学习、流程控制、方法、数组、面向对象、异常、常用类、集合、IO流、多线程、网络编程、GUI、注解与反射、JUC并发、JVM,当学习完上述这些板块后,才是真正的掌握了JavaSE的部分。
2.前端基础
- HTML(结构层):超文本标记语言(Hyper Text MarkUp Language),决定网页的结构和内容。
- CSS(表现层):层叠样式表(Cascading Style Sheets),设定网页的表现样式。
- JavaScript(行为层):是一种弱类型的脚本语言,其源代码不需经过编译,而是由浏览器解释运行。
1.1 HTML(结构层)
超文本标记语言,缩写为HTML,标准通用标记语言下的一个应用。HTML是一种标记语言,是网页制作所必备的工具。
1.2 CSS(表现层)
CSS层叠样式表是一门标记语言,并不是编程语言,因此不可以自定义变量,不可以引用等。换句话说,就是不具备任何语法支持。
缺点:
①语法不够强大,比如无法嵌套书写,导致模块化开发中需要书写很多重复的选择器。
②没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量的形式重复输出,难以维护。
为了解决上述缺点,前端开发人员使用一种称之为CSS预处理器的工具,提供CSS缺失的样式层复用机制、减少冗余代码,提高样式代码的可维护性。大大提高了前端在样式上的开发效率。
CSS预处理器
CSS预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,任何开发者就只要使用这种语言进行CSS的编码工作。转化成通俗易懂的话来说就是,用一种专门的编程语言,进行Web页面样式设计,再通过编译器转化为正常的CSS文件,以供项目使用。
常用的CSS预处理器:
- SASS:基于Ruby,通过服务端处理,功能强大。解析效率高,上手难度高于LESS。
- LESS:基于NodeJS,通过客户端处理,使用简单。功能比SASS简单,解析效率也低于SASS,但实际开发中足够了,所以后台人员需要使用的话,建议使用LESS。
1.3 JavaScript(行为层)
JavaScript一门弱类型脚本语言,其源代码在发往客户端运行之前不需经过编译,而是将文本格式的字符代码发送给浏览器由浏览器解析运行。
-
Native原生JS开发
原生JS开发,也就是按照ECMAScript标准的开发方式,简称是ES,特点是所有浏览器都支持。ES标准已发展到如下版本:ES3、ES4(内部,未正式发布)、ES5(全浏览器支持)、ES6(常用,当前主流版本,可用webpack打包成为ES5支持)、ES7、ES8、ES9、ES10、ES11,这些版本逐步增加新特性。 -
TypeScript微软的标准
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基本类的面向对象编程。
该语言的特点就是除了具备ES的特性之外还纳入了许多不在标准范围内的新特性,所以会导致很多浏览器不能直接支持TypeScript语法,需要编译后(编译成JS)才能被浏览器正确执行。
JavaScript框架
- jQuery:常用的JavaScript框架,优点是简化了DOM操作,缺点是DOM操作太频繁,影响前端性能。
- Angular:Google收购的前端框架,由一群Java程序员开发,其特点是是将后台的MVC模式搬到了前端并增加了模块化开发的理念,与微软合作,采用TypeScript语法开发。对后端程序员友好,对前端程序员不太友好。最大的缺点是版本迭代不合理,不同版本完全不相同。
- React:Facebook出品,一款高性能的JS前端框架,特点是提出了新概念——虚拟DOM,用于减少真实的DOM操作,在内存中虚拟DOM操作,有效的提升了前端渲染效率。缺点是使用复杂,需要额外掌握JSX语言。
- Vue:一款渐进式JavaScript框架,所谓渐进式就是逐步实现新特性的意思,如实现模块化开发、路由、状态管理等新特性。其特点是综合了Angular(模块化)和React(虚拟DOM)的优点。
- Axios:前端通信框架。因为Vue的边界很明确,就是为了处理DOM,所以并不具备通信能力,此时就需要额外使用一个通信框架与服务器交互,当然也可以直接选择使用jQuery提供的AJAX通信功能。
JavaScript构建工具
- Babel:JS编译工具,注意用于浏览器不支持的ES新特性,比如用于编译TypeScript。
- WebPack:模块大宝漆,主要作用通过是打包、压缩、合并及按需加载。
3.MySQL
3.1为什么要学习数据库
①岗位需求
②现在的世界是大数据时代,得数据者得天下。
③被迫需求:存数据。
④数据库是所有软件体系中最核心得存在。相应岗位:DBA数据库管理员。
3.2 什么是数据库
数据库(DB,DateBase)
概念:数据仓库,是个软件,安装在操作系统(linux,windows,mac···)之上。用SQL语句执行,可以储存大量的数据。500万条以下的数据可以直接存储,500万条以上需要进行索引的优化。
作用:存储数据、管理数据。
3.3 数据库分类
1)关系型数据库:SQL
主要有MySQL、Oracle、Sql Server、DB2、SQLlite
通过表和表之间,行和列之间的关系进行数据存储。
2)非关系型数据库:NoSQL(Not Only)
主要有:Redis,MongoDB
以对象存储,通过对象的自身属性来决定。
3)DBMS(数据库管理系统)
数据库的管理软件,科学有效的管理数据,维护和获取数据。
MySQL,数据库管理系统!
3.4 MySQL简介
MySQL是一个关系型数据库管理系统。
前身:属于瑞典的MySQL AB公司,如今:属于Oracle旗下产品。
MySQL是最好的RDBMS(Relational Database Management System,关系型数据库管理系统)应用软件之一。
是开源的数据库软件,具有体积小,速度快,总体拥有成本低的特点。
适用于中小型或大型网站,可以做集群。
官网:https://www.mysql.com 版本:5.7(稳定)、8.0
官网下载地址:https://dev.mysql.com/downloads/mysql/
安装建议:Ⅰ尽量不要使用.exe安装,会往注册表里走,不好卸载
Ⅱ尽可能使用压缩包安装
注意:如果掌握了MySQL,还可以学习Oracle、MongoDB等数据库。
4.JavaWeb
4.1 基本概念
4.1.1 前言
Web开发:Web就是网页,可以从网上拿到一定的资源。
1)静态Web
由HTML+CSS组成。
提供给所有人看的数据不会发生变化。
2)动态Web
目前几乎所有的网页都是动态的。
提供给所有人看的数据都会发生变化,且每个人在不同的时间、不同的地点看到的信息各不相同。
技术栈:ASP、PHP、JSP/Servlet
在Java中动态Web资源开发的技术统称为JavaWeb。
4.1.2 Web应用程序
Web应用程序是可以提供浏览器访问的程序。
a.html、b.html……多个Web资源,这些Web资源可以被外界访问,对外界提供服务。
能访问到的任何一个页面或者资源,都存在于这个世界某个角落的计算机上。
URL统一资源定位符,通过它来进行访问。
这个统一的Web资源会被放在同一个文件夹下,Web应用程序——>Tomcat服务器。
一个Web应用由多部分组成(静态Web、动态Web):
①HTML+CSS+JS
②JSP/Servlet
③Java程序
④jar包
⑤配置文件(Properties)
Web应用程序编写完毕后,若想提供给外界访问,需要一个服务器来统一管理。
4.1.3 静态Web
*.htm、 *html,这些都是网页的后缀,如果服务器上一直存在这些东西,就可以通过网络直接进行读取。
静态Web有关工作原理
静态Web存在的缺点:
①Web页面无法动态更新,所有用户看到的都是同一个页面。
如轮播图、点击特效都是伪动态,用JavaScript(实际开发中使用最多的)和VBScript来实现。
②它无法和数据库交互(数据无法持久化,用户无法交互)。
4.1.4动态Web
Web的页面展示效果因人而异。
动态Web有关工作原理
①动态Web存在的缺点:加入服务器的动态Web资源出现了错误,需要重新编写后台程序,重新发布(停机维护)。
②动态Web的优化:
ⅠWeb页面可以动态更新,所有用户看到都不是同一个页面。
Ⅱ它可以与数据库交互(数据持久化)。
4.2 Web服务器
4.2.1 技术详解
1)ASP
由微软开发,国内最早流行的就是ASP。
在HTML中嵌入了VB的脚本,ASP+COM。
在ASP开发中,基本一个页面都有几千行的代码,页面及其混乱,维护成本高。
用C#编写,用IIS服务器。
2)PHP
开发速度很快,功能很强大,跨平台,代码很简单。
无法承接大访问量的情况(局限性)。
3)JSP/Servlet
SUN公司主推的B/S架构(浏览器和服务器)。
基于Java语言(目前世界上所有的大公司,或者一些开源的组件,都是用Java写的)。
可以承载三高(高并发、高可用、高性能)问题带来的影响。
语法像ASP,利于学习,由ASP——>JSP,易于加强市场强度。
4.2.2 Web服务器详解
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息。
1)IIS:由微软开发,是Windows中自带的。
2)Tomcat
Tomcat是Apache软件基金会的一个核心项目,最新的JSP和Servlet规范总是能在Tomcat中得到体现,因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下普遍使用,是开发和调试JSP的首选。对于一个Java初学Web的人来说,它是最佳选择。
Tomcat实际上是运行JSP和Servlet。Tomcat最新版本为9.0。
以后可以尝试自己编写Tomcat服务器。
下载完软件必备须知:
Ⅰ安装或者解压它。
Ⅱ了解其配置文件及目录结构。
Ⅲ了解其作用。
5.SSM
5.1 MyBatis
5.1.1 MyBatis简介
①MyBatis是一款优秀的持久层框架。
②它支持定制化 SQL、存储过程以及高级映射。
③MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
④MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
⑤MyBatis本是apache的一个开源项目, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
5.1.2 获得MyBatis
①Maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
②Github:https://github.com/mybatis/mybatis-3/releases
MyBatis中文文档:https://mybatis.org/mybatis-3/zh/index.html
5.1.3 为什么需要MyBatis?
帮助程序员将数据存入到数据库中。
方便
传统的JDBC代码太复杂,为了简化,实现自动化操作。
不用MyBatis也可以,但MyBatis更容易上手。
技术没有高低之分!
MyBatis的优点:
Ⅰ简单易学且灵活。
Ⅱsql和代码的分离,提高了可维护性。
Ⅲ提供映射标签,支持对象与数据库的orm字段关系映射。
Ⅳ提供对象关系映射标签,支持对象关系组建维护。
Ⅴ提供xml标签,支持编写动态sql。
5.2 Spring
5.2.1 简介
Spring的推出推动了软件行业的发展。
2002年,Rod Jahnson首次推出了Spring框架的雏形——interface21框架。
2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。
Rod Jahnson是悉尼大学的博士,然而他的专业不是计算机,是音乐学。
Spring理念:使现有技术更加实用。Spring本身就像是一个大杂烩,整合了现有的框架技术。
官网:http://spring.io/
官方下载地址:https://repo.spring.io/libs-release-local/org/springframework/spring/
Github:https://github.com/spring-projects
- SSH:Struct2 + Spring + Hibernate
- SSM:SpringMVC + Spring + MyBatis
所需导入的依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>
5.2.2 优点
- Spring是一个开源免费的框架(容器)。
- Spring是一个轻量级、非入侵式的框架。
- 控制反转(IoC),面向切面编程(Aop)
- 对事务的支持,对框架的支持。
总结:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
5.2.3 组成
Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式。
官网的Spring架构图
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
Spring框架的架构图
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
- Spring 上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如:JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:通过配置管理特性,Spring AOP模块直接将面向切面的编程功能 , 集成到了Spring框架中。所以,可以很容易地使 Spring 框架管理任何支持AOP的对象。Spring AOP模块为基于Spring 的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
- 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。
5.2.4 扩展
SpringBoot与SpringCloud
SpringBoot是Spring的一套快速配置脚手架,可以基于SpringBoot快速开发单个微服务。
SpringCloud是基于SpringBoot实现的。
SpringBoot专注于快速、方便集成的单个微服务个体,SpringCloud关注全局的服务治理框架。
SpringBoot使用了约束优于配置的理念,很多集成方案已经选择好了,能不配置就不配置。
SpringCloud很大的一部分是基于SpringBoot来实现,SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖的关系。
SpringBoot在SpringCloud中起到了承上启下的作用,如果你要学习SpringCloud必须要学习SpringBoot。
5.3 SpringMVC
5.3.1 简述
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
SpringMVC官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
Spring MVC的特点:
①轻量级,简单易学。
②高效,基于请求响应的MVC框架。
③与Spring兼容性好,无缝结合。
④约定优于配置。
⑤功能强大:RESTful、数据验证、格式化、本地化、主题等。
⑥简洁灵活。
Spring的web框架围绕DispatcherServlet(调度Servlet)设计。
DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解形式进行开发,十分简洁。
正因为SpringMVC、简单、便捷、易学,天生和Spring无缝集成(使用SpringIoC和AOP),使用约定优于配置。能够进行简单的junit测试,支持Restful风格,异常处理、本地化、国际化、数据验证 , 类型转换、拦截器等等。
5.3.2 中心控制器
Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。
Spring MVC框架像许多其他MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求及提供其它功能,DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类)。
Servlet与DispatcherServlet在SpringMVC中的作用
SpringMVC的原理如下图所示:
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
5.3.3 SpringMVC执行原理
SpringMVC的工作流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
简要分析执行流程:
①DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
假设请求的url为:http://localhost:8080/SpringMVC/hello,将url拆分成三部分:http://localhost:8080为服务器域名,SpringMVC部署在服务器上的Web站点,hello表示控制器。通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
②HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
③HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。
④HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
⑤HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
⑥Handler让具体的Controller执行。
⑦Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
⑧HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
⑨DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
⑩视图解析器将解析的逻辑视图名传给DispatcherServlet。
⑪DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
⑫最终视图呈现给用户。
6.大前端进阶(Vue.js)
6.1 Vue简介
Vue.js是一款渐进式的JavaScript框架。
什么是渐进式?
渐进式就是指我们可以由浅入深地、由简单到复杂的这种方式去使用Vue.js。
Vue.js优点
①体积小
压缩后33K。
②更高的运行效率
基于虚拟dom,一种可以预先通过JavaScript进行各种计算,把最终的DOM操作计算出来并优化的技术,由于这个DOM操作属于预处理操作,并没有真实的操作DOM,所以叫做虚拟DOM。
③双向数据绑定
让开发者不用再去操作dom对象,把更多的精力投入到业务逻辑上。
④生态丰富、学习成本低
市场上拥有大量成熟、稳定的基于Vue.js的ui框架、常用组件!拿来即用实现快速开发!
对初学者友好、入门容易、学习资料多。
总体而言,Vue.js是一款我们值得去学习和使用的JavaScript框架。
Vue.js经过几年的发展的被广泛的应用于Web端开发、移动端开发、跨平台应用开发等等场景的开发。应该说Vue.js是前端人员开发的必修技能。
Vue.js招聘市场需求大、前景较好。
6.2 Vue的UI框架
-
iView
iView是一个强大的基于Vue的UI库,有很多实用的基础组件比ElementUI的组件更丰富,主要服务于PC界面的中后台产品。使用单文件的Vue组件化开发模式基于NPM+WebPack+Babel开发,支持ES2015高质量、功能丰富友好的API,自由灵活的使用空间。
备注:属于前端主流框架,选型时可考虑使用,主要特点是移动端支持较多。 -
ElementUI
ElementUI是饿了么前端开源维护的Vue的UI组件库,组件齐全,基本涵盖后台所需的所有组件,文档讲解详细,例子也很丰富。主要用于开发PC端页面,是一个质量比较高的Vue的UI组件库。
备注:属于前端主流框架,选型时可考虑使用,主要特点是桌面端支持较多。 -
ICE
飞冰是阿里巴巴团队基于React/Angular/Vue的中后台应用解决方案,在阿里巴巴内部,已经有270多个来自几乎所有BU的项目在使用。飞冰包含了一条从设计端到开发端的完整链接,帮助用户快速搭建属于自己的中后台应用。
备注:主要组件还是以React,目前已经支持Vue。 -
VantUI
VantUI是有赞前端团队基于有赞统一的规范实现的Vue组件库,提供了一整套UI基础组件和业务组件。通过Vant,可以快速搭建出风格统一的页面,提升开发效率。 -
AtUI
AtUI是一款基于Vue 2.x的前端UI组件库,主要用于快速开发PC网站产品。它提供一套NPM+WebPack+Babel前端开发工作流程,CSS样式独立,即使采用不同的框架实现都能保持统一的UI风格。 -
CubeUI
CubeUI是滴滴团队开发的基于Vue.js实现的精致移动端软件库。支持按需引入和后编译,轻量级灵活,扩展性强,可以方便地基于现有组件实现二次开发。
7.微服务开发
7.1 SpringBoot
7.1.1 什么是Spring
Spring是一个开源框架,2003年兴起的一个轻量级的Java开发框架,作者:Rod Johnson。
Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。
7.1.2 Spring是如何简化Java开发的
为了降低Java开发的复杂性,Spring采用了以下4种关键策略:
- 基于POJO的轻量级和最小侵入性编程,所有东西都是bean
- 通过IOC,依赖注入(DI)和面向接口实现松耦合
- 基于切面(AOP)和惯例进行声明式编程
- 通过切面和模版减少样式代码,RedisTemplate,xxxTemplate
7.1.3 什么是SpringBoot
学过Javaweb的人就知道,开发一个web应用,从最初开始接触Servlet结合Tomcat,跑出一个Hello Wolrld程序,是要经历特别多的步骤。 后来就用了框架Struts,再后来是SpringMVC,到了现在的SpringBoot,过一两年又会有其他Web框架出现。
言归正传,什么是SpringBoot呢,就是一个Javaweb的开发框架,和SpringMVC类似,对比其他Javaweb框架的好处,官方说是简化开发,约定大于配置,能迅速的开发web应用,几行代码开发一个http接口。
所有的技术框架的发展似乎都遵循了一条主线规律:从一个复杂应用场景衍生一种规范框架,人们只需要进行各种配置而不需要自己去实现它,这时候强大的配置功能成了优点。发展到一定程度之后,人们根据实际生产应用情况,选取其中实用功能和设计精华,重构出一些轻量级的框架。之后为了提高开发效率,嫌弃原先的各类配置过于麻烦,于是开始提倡“约定大于配置”,进而衍生出一些一站式的解决方案。
这就是Java企业级应用——>J2EE-——>spring——>springboot的过程。
随着Spring不断的发展,涉及的领域越来越多,项目整合开发需要配合各种各样的文件,慢慢变得不那么易用简单,违背了最初的理念,甚至人称配置地狱。SpringBoot正是在这样的一个背景下被抽象出来的开发框架,目的为了让大家更容易的使用Spring、更容易的集成各种常用的中间件、开源软件。
SpringBoot基于Spring开发,SpirngBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。SpringBoot以约定大于配置的核心思想,默认帮我们进行了很多设置,多数SpringBoot应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如Redis、MongoDB、Jpa、RabbitMQ、Quartz等等),SpringBoot应用中这些第三方库几乎可以零配置的开箱即用。
简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合
了所有的jar包,SpringBoot整合了所有的框架 。
SpringBoot出生名门,从一开始就站在一个比较高的起点,又经过这几年的发展,生态足够完善,SpringBoot已经当之无愧成为Java领域最热门的技术。
SpringBoot的主要优点:
- 为所有Spring开发者更快的入门
- 开箱即用,提供各种默认配置来简化项目配置
- 内嵌式容器简化Web项目
- 没有冗余代码生成和XML配置的要求
7.2 SpringCloud
7.2.1 微服务概述
1)什么是微服务
微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。究竟什么是微服务呢?我们在此引用 ThoughtWorks 公司的首席科学家Martin Fowler于2014年提出的一段话:
原文:https://martinfowler.com/articles/microservices.html
汉化:https://www.cnblogs.com/liuning8023/p/4493156.html
就目前而言,对于微服务,业界并没有一个统一的、标准的定义。
但通常而言,微服务架构是一种架构模式,或者说是一种架构风格, 它提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程内,服务之间互相协调,互相配置,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言,工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。
可能有的人觉得官方的话太过生涩,我们从技术维度来理解下:
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,拥有自己独立的数据库。
2)微服务与微服务架构
微服务
强调的是服务的大小,他关注的是某一个点,是具体解决某一个问题/提供落地对应服务的一个服务应用,狭义的看,可以看做是IDEA中的一个个微服务工程,或者Moudel。
微服务架构
一种新的架构形式,Martin Fowler在2014提出。
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言,工具对其进行构建。
3)微服务优缺点
优点:
- 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求
- 开发简单,开发效率提高,一个服务可能就是专一的只干一件事
- 微服务能够被小团队单独开发,这个小团队是2~5人的开发人员组成
- 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的
- 微服务能使用不同的语言开发
- 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins、Hudson、bamboo
- 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
- 微服务允许你利用融合最新技术。
- 微服务只是业务逻辑的代码,不会和 HTML、CSS或其他界面混合
- 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库
缺点: - 开发人员要处理分布式系统的复杂性
- 多服务运维难度,随着服务的增加,运维的压力也在增大
- 系统部署依赖
- 服务间通信成本
- 数据一致性
- 系统集成测试
- 性能监控
……
4)微服务技术栈有哪些?
微服务条目 | 微服务条目 |
---|---|
服务开发 | SpringBoot、Spring、SpringMVC |
服务配置与管理 | Netflix公司的Archaius、阿里的Diamond等 |
服务注册与发现 | Eureka、Consul、Zookeeper等 |
服务调用 | Rest、RPC、gRPC |
服务熔断器 | Hystrix、Envoy等 |
负载均衡 | Ribbon、Nginx等 |
服务接口调用(客户端调用服务的简 | |
化工具) | Feign等 |
消息队列 | Kafka、RabbitMQ、ActiveMQ等 |
服务配置中心管理 | SpringCloudConfig、Chef等 |
服务路由(API网关) | Zuul等 |
服务监控 | Zabbix、Nagios、Metrics、Specatator等 |
全链路追踪 | Zipkin、Brave、Dapper等 |
服务部署 | Docker、OpenStack、Kubernetes等 |
数据流操作开发包 | SpringCloud Stream(封装与Redis、Rabbit、Kafka等发送接收消息) |
事件消息总线 | SpringCloud Bus |
5)选择SpringCloud作为微服务架构的原因
选型依据:
- 整体解决方案和框架成熟度
- 社区热度
- 可维护性
- 学习曲线
当前各大IT公司用的微服务架构有哪些?
- 阿里:dubbo+HFS
- 京东:JSF
- 新浪:Motan
- 当当网:DubboX
……
各微服务框架对比:
功能点/服务框架 | Netflix/SpringCloud | Motan | gRPC | Thrift | Dubbo/DubboX |
---|---|---|---|---|---|
功能定位 | 完整的微服务框架 | RPC框架,但整合了ZK或Consul,实现集群环境的基本服务注册/发现 | RPC框架 | RPC框架 | 服务框架 |
支持Rest | 是,Ribbon支持多种可插拔的序列化选择 | 否 | 否 | 否 | 否 |
支持RPC | 否 | 是(Hession2) | 是 | 是 | 是 |
支持多语言 | 是(Rest形式)? | 否 | 是 | 是 | 否 |
负载均衡 | 是(服务端zuul+客户端Ribbon),zuul-服务、动态路由、云端负载均衡Eureka(针对中间层服务器) | 是(客户端) | 否 | 否 | 是(客户端) |
配置服务 | Netfix Archaius,Spring Cloud Config Server集中配置 | 是(zookeeper 提供) | 否 | 否 | 否 |
服务调用链监控 | 是(zuul),zuul提供边缘服务,API网关 | 否 | 否 | 否 | 否 |
高可用/容错 | 是(服务端Hystrix+客户 端Ribbon) | 是(客户端) | 否 | 否 | 是(客户端) |
典型应用案例 | Netflix | Sina | |||
社区活跃程度 | 高 | 一般 | 高 | 一般 | 2017年后重新开始维护,之前中断了5年 |
学习难度 | 中断 | 低 | 高 | 高 | 低 |
文档丰富程度 | 高 | 一般 | 一般 | 一般 | 高 |
其它 | Spring Cloud Bus为应用程序带来了更多管理端点 | 支持降级 | Netflix 内部在开发集成gRPC | IDL定义 | 实践的公司比较多 |
7.2.2 SpringCloud简介
1)SpringCloud是什么
Spring官网:https://spring.io/
SpringCloud,基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
SpringCloud利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等,他们都可以用SpringBoot的开发风格做到一键启动和部署。
SpringBoot并没有重复造轮子,它只是将目前各家公司开发的比较成熟,经得起实际考研的服务框架组合起来,通过SpringBoot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂,易部署和易维护的分布式系统开发工具包。
SpringCloud是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称微服务全家桶。
2)SpringCloud和SpringBoot关系
SpringBoot专注于快速方便的开发单个个体微服务。
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁,决策竞选、分布式会话等等集成服务。
SpringBoot可以离开SpringCloud独立使用,开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
SpringBoot专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架。
7.3 MyBatisPlus
需要基础:MyBatis、Spring、SpringMVC
学习MyBatisPlus可以节省大量的时间,所有的CRUD代码它都可以自动化完成。
市面上还有JPA、tk-mapper也可以完成这样的操作。
官网:https://mp.baomidou.com/
官网上有一句话叫为简化开发而生。
MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
愿景:我们的愿景是成为MyBatis最好的搭档,就像魂斗罗中的1P、2P,基友搭配,效率翻倍。
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器-Sequence),可自由配置,完美解决主键问题
- 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作
- 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)
- 内置代码生成器:采用代码或者 Maven 插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
- 分页插件支持多种数据库:支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等多种数据库
- 内置性能分析插件:可输出SQL语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表delete 、update操作智能分析阻断,也可自定义拦截规则,预防误操作
8.运维
8.1 Linux
8.1.1 学习Linux的原因
Linux诞生了这么多年,以前说如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解,而是用户已经习惯了。
用习惯了windows操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办法深入到普通人的生活中,并不意味着Linux就没有用武之地了。在服务器端,在开发领域Linux倒是越来越受欢迎,linux在开源社区的地位依然岿然不动。
尤其是作为一个后端程序员,是必须要掌握Linux的。
8.1.2 Linux简介
Linux内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX(可移植操作系统接口)和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
Linux能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
8.1.3 Linux发行版
Linux的发行版说简单点就是将Linux内核与应用软件做一个打包。
Linux内核
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS等。
Linux发行版
8.1.4 Linux应用领域
今天各种场合都有使用各种Linux发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用LAMP(Linux + Apache + MySQL + PHP)或LNMP(Linux + Nginx+ MySQL + PHP)组合。
目前Linux不仅在家庭与企业中使用,并且在政府中也很受欢迎。
- 巴西联邦政府由于支持Linux而世界闻名。
- 有新闻报道俄罗斯军队自己制造的Linux发布版的,做为G.H.ost项目已经取得成果。
- 印度的 Kerala 联邦计划在向全联邦的高中推广使用Linux。
- 中华人民共和国为取得技术独立,在龙芯处理器中排他性地使用Linux。
- 在西班牙的一些地区开发了自己的Linux发布版,并且在政府与教育领域广泛使用,如Extremadura地区的gnuLinEx和Andalusia地区的Guadalinex。
- 葡萄牙同样使用自己的Linux发布版Caixa Mágica,用于Magalh?es笔记本电脑和e-escola政府软件。
- 法国和德国同样开始逐步采用Linux。
8.1.5 Linux与Windows对比
Linux与Windows对比8.2 Nginx
8.2.1 项目架构和演进
项目架构和演进8.2.2 单体部署
单体架构的两种方式以上的两种方式,无论是用一个机器部署还是三个服务器部署,都属于一种单体架构的模式。
特点:
- 小团队成型即可完成开发测试——上线
- 迭代周期短,速度快
- 打包方便,运维节省时间
面临挑战:
- 单节点宕机造成所有服务不可用
- 耦合度太高(迭代、部署、测试)
- 单节点的并发能力有限
8.2.3 集群
- 计算机以“群体”的方式构成整个系统。它可以通过一组硬件或软件共同协调和连接在一起,高度紧密的去完成任务。它是一个群体,它是由多个计算机节点共同组建而成的。
- 对于用户来讲,它本身来说它是一个透明的,它是一个整体,用户也不知道程序的背后到底有多少台服务器,可能是一台,可能是上万台,对于用户来说它只知道一台。用户发起请求。就必须给予响应。用户只需要感知这些即可。
- 在集群中,每一台计算机我们可以称之为它是一个节点,一个服务器也可以称之为节点。每个计算机节点必须要保证内网ping通,不论是集群,还是后续的分布式,微服务,只要是有相应的计算机节点。都必要要互通,都必要要保证在一个相同的局域网中。因为这样的传输速度是最快的。
- 集群是可以提升单体应用的负载能力,也就所谓的负载均衡。因为每台计算机或者服务器运行的业务都是相同的,共同来协作完成相应的业务。只不过相同的业务部署到了不同的机器上而已。这样可以降低单服务器的压力和极限瓶颈。同样的业务我们可以称之为集群,如果每个计算器服务器运行的业务不同称之为:分布式。
集群:由多个服务器节点共同来完成一个相同业务。
分布式:多个服务器运行的业务是不同,然后共同协助来完成一个整体的服务应用。
集群优势:
- 提供系统性能
- 提供系统的可用性
- 可扩展性高
部署集群的注意事项:
- 用户会话问题(分布式会话)
- 定时任务(独立部署服务)和xxjob
- 内网互通
8.2.4 什么是Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,Nginx 1.0.4发布。底层是用C语言开发。
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
主要功能反向代理、通过配置文件可以实现集群和负载均衡、静态资源虚拟化、限流等。
常见的服务器:
- 微软的IIS asp.net
- Weblogs、Jboss 传统行业、ERP/电信/金融/物流
- Tomcat、Jetty
- Apache http、Nginx 静态服务、反向代理
- Netty 高性能服务器编程 webscoket、webserver、语音聊天室等
8.3 Docker
8.3.1 Docker出现的原因
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员是极大的考验。
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。解决开发人员说的“在我的机器上可正常工作”的问题。
之前在服务器配置一个应用的运行环境,要安装各种软件,就拿一个基本的工程项目的环境来说吧,Java/Tomcat/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在Windows上安装的这些环境,到了Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码文件等(Java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念。通过Docker镜像 ( images ) 将应用程序所需要的系统环境,由下而上打包,达到应用程序跨平台间的无缝接轨运作。
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把它们都运走。
历史及发展:
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。
这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。
后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker。
Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。
正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。
什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。
有的软件是一开始就开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃“百家饭”嘛。
2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。
不开则已,一开惊人。
越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。
Docker的人气迅速攀升,速度之快,令人瞠目结舌。
开源当月,Docker 0.1 版本发布。此后的每一个月,Docker都会发布一个版本。到2014年6月9日,Docker 1.0 版本正式发布。
此时的Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像Google、微软、Amazon、VMware这样的巨头,都对它青睐有加,表示将全力支持。
Docker和容器技术为什么会这么火爆?说白了,就是因为它“轻”。
在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是VMWare和OpenStack。
相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。
在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑”,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。
正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。
Docker理念:
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App , Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在Docker容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
8.3.2 Docker能做什么
1)之前的虚拟机技术
虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
2)容器虚拟化技术
由于前面虚拟机存在这些缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩
写为 LXC)。
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
比较了 Docker 和传统虚拟化方式的不同之处:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
- 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
3)开发/运维(DevOps)
更快速的应用交付和部署:
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更便捷的升级和扩缩容:
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更简单的系统运维:
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用:
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor(管理程序)支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
9.常用中间件
9.1 Redis
与MySQL不同,Redis是是当前最热门的NoSQL数据库之一。
9.1.1 Redis是什么
Redis:REmote DIctionary Server(远程字典服务器)是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器Redis。
与其他key-value缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
9.1.2 Redis可以做什么
内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。
取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面。
发布、订阅消息系统、地图信息分析、定时器、计数器……
9.1.3 特性
- 数据类型、基本操作和配置
- 持久化和复制,RDB、AOF
- 事务的控制
9.2 ElasticSearch
Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。
9.2.1 ElasticSearch的由来
多年前,一个叫做Shay Banon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。
直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。他发布了他的第一个开源项目,叫做“Compass”。
后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。
第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功能,不过Elasticsearch将永远开源且对所有人可用。
Shay的妻子依旧等待着她的食谱搜索……
9.2 使用场景
- 维基百科,类似百度百科,全文检索,高亮,搜索推荐/2
- The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
- Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
- GitHub(开源代码管理),搜索上千亿行代码
- 电商网站,检索商品
- 日志数据分析,logstash采集日志,ES进行复杂的数据分析,ELK技术,elasticsearch+logstash+kibana
- 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买
- BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化
- 国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)