WEB技术
HTTP协议和B/S 结构
操作系统有进程子系统,使用多进程就可以充分利用硬件资源。进程中可以多个线程,每一个线程可以被CPU调度执行,这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。
客户端和服务端往往处在不同的物理主机上,它们分属不同的进程,这些进程间需要通信。跨主机的进程间通信需要使用网络编程。最常见的网络编程接口是Socket。
Socket称为套接字,本意是插座。也就是说网络通讯需要两端,如果一端被动的接收另一端请求并提供计算和数据的称为服务器端,另一端往往只是发起计算或数据请求,称为客户端
这种编程模式称为Client/Server编程模式,简称C/S编程。开发的程序也称为C/S程序。C/S编程往往使用传输层协议(TCP/UDP),较为底层,比如:QQ,迅雷, 云音乐, 云盘, foxmail,xshell等
1990年HTTP协议和浏览器诞生。在应用层使用文本跨网络在不同进程间传输数据,最后在浏览器中将服务器端返回的HTML渲染出来。由此,诞生了网页开发。
网页是存储在WEB服务器端的文本文件,浏览器发起HTTP请求后,到达WEB服务程序后,服务程序根据URL读取对应的HTML文件,并封装成HTTP响应报文返回给浏览器端。
起初网页开发主要指的是HTML、CSS等文件制作,目的就是显示文字或图片,通过超级链接跳转到另一个HTML并显示其内容。 后来,网景公司意识到让网页动起来很重要,傍着SUN的Java的名气发布了JavaScript语言,可以在浏览器中使用JS引擎执行的脚本语言,可以让网页元素动态变化,网页动起来了。为了让网页动起来,微软使用ActiveX技术、SUN的Applet都可以在浏览器中执行代码,但都有安全性问 题。能不能直接把内容直接在WEB服务器端组织成HTML,然后把HTML返回给浏览器渲染呢?
最早出现了CGI(Common Gateway Interface)通用网关接口,通过浏览器中输入URL直接映射到一个服务器端的脚本程序执行,这个脚本可以查询数据库并返回结果给浏览器端。这种将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术,这些技术的使用不同语言编写的程序都运行在服务器端,所以称为WEB后端编程。有一部分程序员还是要编写HTML、CSS、 JavaScript,这些代码运行在浏览器端,称为WEB前端编程。合起来称为Browser/Server编程,即B/S编程
前端三大核心技术
HTML
HTML(HyperText Markup Language)超文本标记语言,它不同于一般的编程语言。超文本即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使用图片、音频、视频等非文本内容。 HTML由一个个的标签(标记)组成,这些标签各司其职,有的提供网页信息,有的负责文字,有的负 责图片,有的负责网页布局,所以一个HTML文件,是由格式标签和数据组成
超文本需要显示,就得有软件能够呈现超文本定义的排版格式,例如显示:图片、表格,显示字体的大小、颜色,这个软件就是浏览器。 超文本的诞生是为了解决纯文本不能格式显示的问题,是为了好看,但是只有通过网络才能分享超文本的内容,所以制定了HTTP协议
CSS(Cascading Style Sheets)层叠样式表
HTML本身为了格式化显示文本,但是当网页呈现大家面前的时候,需求HTML提供更多样式能力。这使得HTML变得越来越臃肿。这促使了CSS的诞生。 1994年,W3C成立,CSS设计小组所有成员加入W3C,并努力研发CSS的标准,微软最终加入。 1996年12月发布CSS 1.0。 1998年5月发布CSS 2.0。 CSS 3采用了模块化思想,每个模块都在CSS 2基础上分别增强功能。所以,这些模块是陆续发布的。 不同厂家的浏览器使用的引擎,对CSS的支持不一样,导致网页布局、样式在不同浏览器不一样。因 此,想要保证不同用户使用不同浏览器看到的网页效果一直非常困难。
JavaScript
Javascript简称JS,是一种动态的弱类型脚本解释性语言,和HTML、CSS并称三大WEB核心技术,得到了几乎主流浏览器支持。 1994年,网景Netscape公司成立并发布了Netscape Navigator浏览器,占据了很大的市场份额,网景意识到WEB需要动态,需要一种技术来实现。
1995年9月网景浏览器2发布测试版本发布了LiveScript,随即在12月的测试版就更名为JavaScript。同时期,微软推出IE并支持JScript、VBScript,与之抗衡。 1997年,网景、微软、SUN、Borland公司和其他组织在ECMA(European Computer Manufacturers Association 欧洲计算机制造商协会)确定了ECMAScript的本程序设计语言的标准。JavaScript和JScript 都成为ECMAScript标准的实现。 2008年后随着chrome浏览器的V8引擎发布。 V8 JS引擎不是解释执行,而是本地编译,在V8引擎做了很多优化,JS程序在其上运行堪比本地二进制程 序。V8引擎使用C++开发,可以嵌入到任何C++程序中。基于V8引擎,2009年基于服务器javascript的运行环境Node.js诞生,创建了第一版npm (Node.js包管理器和开源库生态系统), 提供了大量的库供程序员使用。从此,便可以在服务器端真正大规模使用JavaScript编程了。也就是说 JavaScript 也可以真正称为服务器端编程语言了,成为目前唯一的前,后端通用的语言。
同步
交互式网页,用户提交了请求,就是想看到查询的结果。服务器响应到来后是一个全新的页面内容,哪 怕URL不变,整个网页都需要重新渲染。例如,用户填写注册信息,只是2次密码不一致,提交后,整个 注册页面重新刷新,所有填写项目重新填写(当然有办法让用户减少重填)。这种交互非常不友好。从代价 的角度看,就是为了注册的一点点信息,结果返回了整个网页内容,不但浪费了网络带宽,还需要浏览 器重新渲染网页,太浪费资源了,影响了用户体验和感受。上面这些请求的过程,就是同步过程,用户 发起请求,页面整个刷新,直到服务器端响应的数据到来并重新渲染。
异步
1996年微软实现了iframe标签,可以在一个网页使用iframe标签局部异步加载内容。1999年微软推出异步数据传输的ActiveX插件技术,太笨重了,但是也火了很多年。有一个组件XMLHttpRequest被大多数浏览器支持。 传统的网页如果需要更新内容,必需重载整个网页面。Ajax的出现,改变这一切,同时极大的促进了 Javascript的发展。Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,最早起源于1998年微软的Outlook Web Access开发团队。Ajax 通过在后台与服务器进行少量数据交换, 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。Javascript 通过调用浏览器内置的WEB API中的 XMLHttpRequest 对象实现Ajax 技术。早期Ajax结合数据格式XML,目前更多的使用JSON。利用AJAX 可实现前后端开发的彻底分离,改变了传统的开发模式。 AJAX是一种技术的组合,技术的重新发现,而不是发明,但是它深远的影响了整个WEB开发。 参考资料: https://www.w3school.com.cn/ajax/index.asp
java 基础
WEB架构
Web资源和访问
PC 端或移动端浏览器访问
从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上,从图片服务器请求图片资源显示,从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端。
手机 App 访问
内置了HTML和JS文件,不需要从静态WEB服务器下载 JS 或 HTML。为的就是减少文件的发送,现代前端开发使用的JS文件太多或太大了,有必要就从图片服务器请求图片,从业务服务器请求动态数据,客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。
后台应用架构
单体架构
传统架构(单机系统),一个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统一部署,一个进程 all in one的架构方式,把所有的功能单元放在一个应用里。然后把整个应用部署到一台服务器上。如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。Java实现:JSP、Servlet,打包成一个jar、war文件部署,易于开发和测试;也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停掉整个服务,重新整体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不适合当今互联网业务功能的快速迭代。 特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用里面,我们如何维护、如何分工 合作都是问题。如果项目庞大,管理难度大。 web应用服务器:开源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss
微服务
https://www.martinfowler.com/microservices/
In short, the microservice architectural style is an approach to developing a
single application as a suite of small services, each running in its own process
and communicating with lightweight mechanisms, often an HTTP resource API. These
services are built around business capabilities and independently deployable by
fully automated deployment machinery. There is a bare minimum of centralized
management of these services, which may be written in different programming
languages and use different data storage technologies.
简而言之,微服务架构风格是一种将单个应用程序开发为一组小服务的方法,每个小服务都在自己的进程中运
行,并与轻量级机制(通常是 HTTP 资源 API)进行通信。 这些服务是围绕业务能力构建的,并且可以通过
完全自动化的部署机制独立部署。 这些服务的集中管理极少,可以用不同的编程语言编写并使用不同的数据存
储技术。-- James Lewis and Martin Fowler (2014)
属于SOA(Service Oriented Architecture)的子集,SOA可以认为面向服务的1.0版本,微服务可以认为是面向服务的2.0版本,SOA的服务之间通过ESB(Enterprise Service Bus)进行通信,则ESB的单点依赖和商业ESB的费用问题反而成为了所有服务的瓶颈。
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。从技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁。微服务架构(分布式系统),各个模块/服务,各自独立出来,“让专业的人干专业的事”,独立部署。分布式系统中,不同的服务可以使用各自独立的数据库。 服务之间采用轻量级的通信机制(通常是基于HTTP的RESTful API)。 微服务设计的思想改变了原有的企业研发团队组织架构。传统的研发组织架构是水平架构,前端、 后端、DBA、测试分别有自己对应的团队,属于水平团队组织架构。而微服务的设计思想对团队的划分有着一定的影响,使得团队组织架构的划分更倾向于垂直架构,比如用户业务是一个团队来负责,支付业务是一个团队来负责。但实际上在企业中并不会把团队组织架构拆分得这么绝对,垂直架构只是一种理想的架构。微服务的实现框架有多种,不同的应用架构,部署方式也有不同
java
Java原指的是印度尼西亚的爪哇岛,人口众多,盛产咖啡、橡胶等。 Java语言最早是在SUN公司1991年开始设计的,最初叫Oak项目,它初衷是跑在不同机顶盒设备中的。 1993年网景公司成立。Oak项目组很快他们发现了浏览器和动态网页技术这个巨大的市场,转向WEB方向。并首先发布了可以让网页动起来的Applet技术(浏览器中嵌入运行Java字节码的技术)。在1995年,一杯爪哇岛咖啡成就了Java这个名字。 Sun公司第一个Java公开版本1.0发布于1996年。口号是"一次编写,到处运行"(Write once,Run anywhere),跨平台运行。1999年,SUN公司发布了第二代Java平台(Java2)。 2009年4月20日,Oracle甲骨文公司宣布将以每股9.50美元,总计74亿美金收购SUN(计算机系统)公司。2010年1月成功收购。 2010年,Java创始人之一的 James Gosling 离开了Oracle,去了Google
java 组成
Java 包含下面部分: 语言、语法规范。关键字,如: if、for、class等 源代码 source code 依赖库,标准库(基础)、第三方库(针对某些应用)。底层代码太难使用且开发效率低,封装成现成的库 JVM虚拟机。将源代码编译为中间码即字节码后,再运行在JVM之上
由于各种操作系统ABI不一样,采用编译方式,需要为不同操作系统编译成相应格式的二进制程序才能运行。1995年,Java发布Applet技术,Java程序在后台编译成字节码,发送到浏览器端,在浏览器中运行一个 Applet程序,这段程序是运行在另外一个JVM进程中的。但是这种在客户端运行Java代码的技术,会有很大的安全问题。1997年CGI技术发展起来,动态网页技术开始向后端开发转移,在后端将动态内容组织好,拼成HTML发回到浏览器端
Java动态网页技术
servlet
本质就是一段 java 程序
public class HelloWorld extends HttpServlet {private String message;public void init() throws ServletException{message = "Hello World";}public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{response.setContentType("text/html"); //响应报文内容类型PrintWriter out = response.getWriter(); //构建响应报文内容out.println("<h1>" + message + "</h1>");out.println("<p><a href=http://www.caoge.org>曹哥</a>欢迎你</p>");}public void destroy(){}
}
在Servlet中最大的问题是,HTML输出和Java代码混在一起,如果网页布局要调整,Java源代码就需要随之进行调整,对于开发人员来说就是个噩梦。
jsp(Java Server Pages)
JSP本质是提供一个HTML模板,也就是在网页中预留以后填充的空,后续将Java程序运行生成的数据对HTML进行填空就可以了。如果网页布局需要调整,JAVA源代码不需要很大的调整
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>jsp例子</title>
</head>
<body>
本行后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
JSP是基于Servlet实现,JSP将表现和逻辑分离,这样页面开发人员更好的注重页面表现力更好服务客户。 不过最终 JSP 还需要先转换为 Servlet的源代码.java文件(Tomcat中使用Jasper转换),只不过这个转换过程无需人工完成,是通过工具自动实现的,然后再编译成.class文件,最后才可以在JVM中运行。比如: 浏览器第一次请求test.jsp时, Tomcat服务器会自动将test.jsp转化成test.jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求。如果以后访问test.jsp就不再重新编译。jsp文件了,直接调用class文件来响应浏览器。后续如果Tomcat检测到JSP页面改动了的话, 会重新编译 JSP类似于PHP和ASP,前端代码和后端JAVA代码混写在一起,需要前端和后端工程师在一起协作才能完成, 无法做到真正的前后端分离开发,在web早期的开发中,通常采用的分为两层,视图层和模型层。
优点:架构简单,比较适合小型项目开发
缺点:JSP职责不单一,职责过重,不便于维护
mvc
如果过度使用jsp技术,jsp中既写有大量的java代码,也有html,甚至还有javascript等,造成难以维护,难以实现前后端分工协作,后来java 的web开发借鉴了MVC(Model View Controller )开发模式, MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、 数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。 MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。 Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao)和服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。 View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。可通过 JSP实现 Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。最终表现为Servlet。最典型的MVC就是JSP + servlet + javabean的模式
职责分析:
Controller:控制器
取得表单数据
调用业务逻辑
转向指定的页面
Model:模型
业务逻辑
保存数据的状态
View:视图
显示页面
处理流程:1. 用户发请求 2. Servlet接收请求数据,并调用对应的业务逻辑方法 3. 业务处理完毕,返回更新后的数据给servlet 4. servlet转向到JSP,由JSP来渲染页面 5. 响应给前端更新后的页面
MVC模式也有以下不足: 每次请求必须经过"控制器->模型->视图"这个流程,用户才能看到最终的展现界面,这个过程似乎有些复杂,实际上视图是依赖于模型的,换句话说,如果没有模型,视图也无法呈现出最终的效果,渲染视图过程是在服务端来完成的,最终呈现给浏览器的是带有模型的视图页面,性能无法得到很好的优化
REST
为了使数据展现过程更加直接,并且提供更好的用户体验,对MVC模式进行改进。首先从浏览器发送 AJAX( Asynchronous JavaScript and XML 异步的 JavaScript 和 XML)请求,然后服务端接受该请求并返回JSON数据返回给浏览器,最后在浏览器中进行界面渲染。改进后的MVC模式如下图所示
也就是说,我们输入的是AJAX请求,输出的是JSON数据,REST技术实现这样的功能。 REST(Representational State Transfer表述性状态转移,全称是 Resource Representational State Transfer 即资源在网络中以某种表现形式进行状态转移。 分解开来:Resource:资源,即数据 Representational:某种表现形式,比如用JSON,XML,JPEG等 State Transfer:状态变化。通过HTTP动词实现,它是Roy Fielding博士在2000年写的一篇关于软件架构风格的论文,后来国内外许多知名互联网公司纷纷开始采用这种轻量级的Web服务,大家习惯将其称为RESTful Web Services,或简称REST服务。 如果将浏览器这一端视为前端,而服务器那一端视为后端的话,可以将以上改进后的MVC模式简化为以下前后端分离模式,如下图所示:
可见,采用REST风格的架构可以使得前端关注界面展现,后端关注业务逻辑,分工明确,职责清晰。在设计web接口的时候,REST主要是用于定义接口名,接口名一般是用名次写,不用动词,那怎么表达“获取”或者“删除”或者“更新”这样的操作呢——用请求类型来区分。比如,我们有一个friends接口,对于“朋友”我们有增删改查四种操作,怎么定义REST接口?
增加一个朋友,uri: generalcode.cn/v1/friends 接口类型:POST
删除一个朋友,uri: generalcode.cn/va/friends 接口类型:DELETE
修改一个朋友,uri: generalcode.cn/va/friends 接口类型:PUT
查找朋友,uri: generalcode.cn/va/friends 接口类型:GET
上面我们定义的四个接口就是符合REST协议的,请注意,这几个接口都没有动词,只有名词friends,都是通过Http请求的接口类型来判断是什么业务操作。 REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以, 以JSON格式编写的REST风格的API具有简单、易读、易用的特点。 编写API有什么好处呢?由于API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。前端拿到数据只负责展示和渲染,不对数据做任何处理。后端处理数据并以JSON格式传输出去,定义这样一套统一的接口,在web,ios,android三端都可以用相同的接口,通过客户端访问API,就可以完成通过浏览器页面提供的功能,而后端代码基本无需改动