Java Web 技術棧宣講
隨著公司技術線路轉(zhuǎn)型工作的不斷深入,Java Web技術棧也已經(jīng)基本確定,本次培訓將針對關鍵技術點進行講解和說明,讓大家對未來使用的語言、框架和工具有個初步的認識,便于后期快速入手,早日實現(xiàn)
從入門到放棄。
首先來看一張大圖總結(jié)圖:

1. 語言
1.1. Java
首先祭出Java之父(他那锃[zèng]亮的腦門是不是非常符合你對程序員的認知):

在上個世紀九十年代,單片機的編程悄然興起,這引起了自動化控制人員的廣泛興趣。因為可以很大幅度的提高硬件的“智能程度”,所以被廣泛應用。正所謂無利不起早,在當時SUN公司也看中了這塊市場。于是在1991年成立了開發(fā)小組,準備進入這一市場。但是在開發(fā)的過程中,小組的成員發(fā)現(xiàn)使用C++開發(fā)相關程序十分繁瑣,于是發(fā)現(xiàn)了一門新的語言,這就是Java的前身Oak。
但是Oak的發(fā)展并不順利,它存在很多的缺陷,于是經(jīng)過多次的磋商和協(xié)調(diào),Java語言應運而生。
并且在1996年的SUN公司發(fā)布了Java開發(fā)工具包JDK1.0,并且Java開發(fā)工具包的發(fā)展一直持續(xù)至今。
JDK結(jié)構(gòu)體系
-
Java和環(huán)境關系
JVM層次.png JDK內(nèi)部組成圖

JDK(Java Development ToolKit),包含了Java運行環(huán)境(JRE)和開發(fā)工具(編譯器,調(diào)試器,javadoc等)。我們就是依靠JDK來開發(fā)和運行Java程序的。
JDK的編譯器Javac[.exe],會將Java代碼編譯成字節(jié)碼(.class文件)。編譯出的字節(jié)碼在任何平臺上都一樣的內(nèi)容,所以我們說Java語言是門跨平臺語言。Write once, run anywhere。
JRE(Java Runtime Environment),它為Java提供了運行環(huán)境,其中重要的一環(huán)就是通過JVM將字節(jié)碼解釋成可執(zhí)行的機器碼。
JRE由JVM,Java運行時類庫,動態(tài)鏈接庫等組成。
JVM(Java Virtual Machine),Java虛擬機,可以看做是一臺抽象化的計算機,它有一套完整的體系架構(gòu),包括處理器、堆棧 、寄存器等。
在運行時環(huán)境,JVM會將Java字節(jié)碼解釋成機器碼。機器碼和平臺相關的(不同硬件環(huán)境、不同操作系統(tǒng),產(chǎn)生的機器碼不同),所以JVM在不同平臺有不同的實現(xiàn)。
目前JDK默認使用的實現(xiàn)是Hotspot VM。具體可以和.Net Framework做對等比較
- 安裝目錄主要組成

-
典型工具
JVM工具.png
Java流行領域
- Tiobe發(fā)布2019年3月編程語言排行榜

- Java應用領域

JDK版本歷史,Java8的選擇
- JDK官方版本的歷史
| JDK版本 | 發(fā)布日期 |
|---|---|
| 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市場應用調(diào)查

-
jdk1.8特點
Lambda表達式
Stream函數(shù)式操作流元素集合
接口新增:默認方法與靜態(tài)方法
方法引用,與Lambda表達式聯(lián)合使用
引入重復注解
類型注解
最新的Date/Time API (JSR 310)
新增base64加解密API
數(shù)組并行(parallel)操作
JVM的PermGen空間被移除:取代它的是Metaspace(JEP 122)元空間
1.2. ES6

介紹
ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標準,已經(jīng)在 2015 年 6 月正式發(fā)布了。它的目標,是使得 JavaScript 語言可以用來編寫復雜的大型應用程序,成為企業(yè)級開發(fā)語言。
JavaScript 是大家所了解的語言名稱,但是這個語言名稱是商標( Oracle 公司注冊的商標)。因此,JavaScript 的正式名稱是 ECMAScript 。1996年11月,JavaScript 的創(chuàng)造者網(wǎng)景公司將 JS 提交給國際化標準組織 ECMA(European computer manufactures association,歐洲計算機制造聯(lián)合會),希望這種語言能夠成為國際標準,隨后 ECMA 發(fā)布了規(guī)定瀏覽器腳本語言的標準,即 ECMAScript。這也有利于這門語言的開放和中立。
ECMAScript 歷史
ES6 是 ECMAScript 標準十余年來變動最大的一個版本,為其添加了許多新的語法特性。
1997 年 ECMAScript 1.0 誕生。
1998 年 6 月 ECMAScript 2.0 誕生,包含一些小的更改,用于同步獨立的 ISO 國際標準。
1999 年 12 月 ECMAScript 3.0誕生,它是一個巨大的成功,在業(yè)界得到了廣泛的支持,它奠定了 JS 的基本語法,被其后版本完全繼承。直到今天,我們一開始學習 JS ,其實就是在學 3.0 版的語法。
2000 年的 ECMAScript 4.0 是當下 ES6 的前身,但由于這個版本太過激烈,對 ES 3 做了徹底升級,所以暫時被"和諧"了。
2009 年 12 月,ECMAScript 5.0 版正式發(fā)布。ECMA 專家組預計 ECMAScript 的第五個版本會在 2013 年中期到 2018 年作為主流的開發(fā)標準。
2011年6月,ES 5.1 版發(fā)布,并且成為 ISO 國際標準。
2013 年,ES6 草案凍結(jié),不再添加新的功能,新的功能將被放到 ES7 中;
2015年6月, ES6 正式通過,成為國際標準。
特點
塊級作用域:const 與 let 變量
模板字面量
解構(gòu)
對象字面量簡寫法
for...of循環(huán)
展開運算符
剩余參數(shù)(可變參數(shù))
ES6箭頭函數(shù)
默認參數(shù)函數(shù)
模塊化import/export
JavaScript類
開源書籍:《ECMAScript 6 入門》
基于ES6的三駕馬車

官方標準
ECMAScript 6 標準規(guī)范&ECMA-262.pdf

2. 框架
2.1 Spring
Spring框架是由于軟件開發(fā)的復雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務器端的開發(fā)。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應用都可以從Spring中受益。
目的:解決企業(yè)應用開發(fā)的復雜性
功能:使用基本的JavaBean(是一種JAVA語言寫成的可重用組件)代替EJB,并提供了更多的企業(yè)應用功能
范圍:任何Java應用
Spring是一個輕量級控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
七大核心模塊

核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是
BeanFactory,它是工廠模式的實現(xiàn)。BeanFactory使用控制反轉(zhuǎn) (IOC) 模式將應用程序的配置和依賴性規(guī)范與實際的應用程序代碼分開。Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調(diào)度功能。
Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應商拋出的錯誤消息。異常層次結(jié)構(gòu)簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)。
Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結(jié)構(gòu)。
Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>
Spring MVC 框架:MVC 框架是一個全功能的構(gòu)建 Web 應用程序的 MVC 實現(xiàn)。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
| 我們?yōu)樯队肧pring |
|---|
| Java主流框架,穩(wěn)定而且社區(qū)活躍,大企業(yè)都在用,而且是標準 |
| Ioc容器和Spring MVC框架比現(xiàn)在我們用的ABP框架成熟,ABP其實是模仿Spring |
| 我們的業(yè)務系統(tǒng)符合整體平移到Java平臺 |
2.2 Spring Boot
Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進行配置(
習慣大于約定),從而使開發(fā)人員不再需要定義樣板化的配置。用我的話來理解,就是 Spring Boot 其實不是什么新的框架,它默認配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。

項目構(gòu)建菜單化

自動配置
理念是約定優(yōu)于配置,它通過實現(xiàn)了自動配置(大多數(shù)用戶平時習慣設置的配置作為默認配置)的功能來為用戶快速構(gòu)建出標準化的應用。
打包式的starters
提供了多個可選擇的”starter”以簡化Maven的依賴管理(也支持Gradle),讓您可以按需加載需要的功能模塊。
actuator(監(jiān)控)
提供了一整套的對應用狀態(tài)的監(jiān)控與管理的功能模塊(通過引入spring-boot-starter-actuator),包括應用的線程信息、內(nèi)存信息、應用是否處于健康狀態(tài)等,為了滿足更多的資源監(jiān)控需求,Spring Cloud中的很多模塊還對其進行了擴展。
| 我們?yōu)樯队肧pring Boot |
|---|
| 在Spring的基礎上的框架,選擇Spring 必選 |
| 簡化使用Spring的配置過程 |
| 業(yè)界成熟,版本持續(xù)更新 |
2.3 Mybatis


ORM選型
? 一個項目中用到的復雜查詢基本沒有,就是最基本的增刪改查,這樣選擇Hibernate的效率就要高些了,因為基本的SQL語句已經(jīng)被封裝好,根本不需要手寫SQL,可以節(jié)省大量時間,但是對于一個大型項目,復雜的查詢語句較多,使用MyBatis就會加快很多,而且SQL語句管理也會很方便。
MyBatis 是一款優(yōu)秀的持久層框架,它支持
定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。
Mybatis-Plus(為簡化開發(fā)而生)
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生。
愿景
我們的愿景是成為 MyBatis 最好的搭檔,就像 魂斗羅 中的 1P、2P,基友搭配,效率翻倍。

- 無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑
- 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/li>
- 強大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強大的條件構(gòu)造器,滿足各類使用需求
- 支持 Lambda 形式調(diào)用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
- 支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種數(shù)據(jù)庫
- 支持主鍵自動生成:支持多達 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
- 支持 XML 熱加載:Mapper 對應的 XML 支持熱加載,對于簡單的 CRUD 操作,甚至可以無 XML 啟動
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
- 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持關鍵詞自動轉(zhuǎn)義:支持數(shù)據(jù)庫關鍵詞(order、key......)自動轉(zhuǎn)義,還可自定義關鍵詞
- 內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
- 內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
- 內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能快速揪出慢查詢
- 內(nèi)置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預防誤操作
- 內(nèi)置 Sql 注入剝離器:支持 Sql 注入剝離,有效預防 Sql 注入攻擊

| 我們?yōu)槭裁催x擇Mybatis+Mybatis-Plus |
|---|
| 類似EF6使用方式,平移技術平滑 |
| 借助Mybatis,簡單CRUD可以零Sql |
| 復雜業(yè)務Sql可以自行優(yōu)化 |
| 代碼生成工具,豐富強大 |
| 互聯(lián)網(wǎng)企業(yè)必選,社區(qū)穩(wěn)定,支持強大 |
2.4 Vue
Vue.js 是一個JavaScript MVVM庫,是一套構(gòu)建用戶界面的漸進式框架。它是以
數(shù)據(jù)驅(qū)動和組件化的思想構(gòu)建的,采用自底向上增量開發(fā)的設計。相比于Angular.js,Vue.js提供了更加簡潔、更易于理解的API,使得我們能夠快速地上手并使用Vue.js;同時比起 React + Redux 相對復雜的架構(gòu),Vue.js 更加輕量級也更加容易上手,是初創(chuàng)項目的首選前端框架。Vue 的核心庫只關注視圖層,它不僅易于上手,還便于與第三方庫或既有項目整合。并且作者是華人的關系,Vue擁有著對華人開發(fā)者最友好的api文檔和官方教程。
MVVM概念

jQuery和Vue區(qū)別
jQuery是使用選擇器$選取DOM對象,對其進行賦值、取值、事件綁定等操作,其實和原生的HTML的區(qū)別只在于可以更方便的選取和操作DOM對象,而數(shù)據(jù)和界面是在一起的。比如需要獲取label標簽的內(nèi)容:$("lable").val();,它還是依賴DOM元素的值。
$("#id").val("hello world");
Vue則是通過Vue對象將數(shù)據(jù)和View完全分離開來了。對數(shù)據(jù)進行操作不再需要引用相應的DOM對象,可以說數(shù)據(jù)和View是分離的,他們通過Vue對象這個虛擬Dom實現(xiàn)相互的綁定。這就是傳說中的MVVM。
Vue文件格式
<template>
<div class="about">
<h1>{{ message }}</h1>
<HelloWorld></HelloWorld>
</div>
</template>
<script>
import HelloWorld from "@/components/HelloWorld.vue";
export default {
name: "home",
data: {
message: 'Hello Vue!'
}
components: {
HelloWorld
}
};
</script>
<style lang="less">
#about {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
</style>
作者

基于Vue的UI組件

| 我們選型Vue.js的原因 |
|---|
| Vue.js國內(nèi)比較火 |
| UI組件豐富 |
| 語法比較適合國人習慣,對MVVM的概念比較清晰 |
| Vue全家桶(vue-router路由、vuex狀態(tài)管理、axios) |
UI組件對比

2.5 UI組件
Ant Design Vue
基于螞蟻金服 Ant Design 的Vue 實現(xiàn),開發(fā)和服務于企業(yè)級后臺產(chǎn)品。
特性
- 提煉自企業(yè)級中后臺產(chǎn)品的交互語言和視覺風格。
- 開箱即用的高質(zhì)量 Vue 組件。
- 共享Ant Design of React設計工具體系。
- 現(xiàn)代瀏覽器和 IE9 及以上(需要 polyfills)
周邊工具

組件內(nèi)容


3. 工具
3.1 Intellij IDEA
IntelliJ在業(yè)界被公認為最好的java開發(fā)工具之一,尤其在智能代碼助手、代碼自動提示、重構(gòu)、J2EE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設計等方面的功能可以說是超常的。IDEA是JetBrains公司的產(chǎn)品,這家公司總部位于捷克共和國的首都布拉格,開發(fā)人員以嚴謹著稱的東歐程序員為主。

2018年Java開發(fā)IDE調(diào)查排行:

旗艦版和社區(qū)版功能對比

3.2 STS
spring tool suite (sts)
其實就是一個被包裝過的Eclipse,主要用于快速的開發(fā)Spring項目,我們不用再去編輯繁瑣的xml配置文件,而是由工具自動生成。
特點:免費
3.3 Maven

? Maven是一個項目管理和綜合工具。Maven提供了開發(fā)人員構(gòu)建一個完整的生命周期框架。開發(fā)團隊可以自動完成項目的基礎工具建設,Maven使用標準的目錄結(jié)構(gòu)和默認構(gòu)建生命周期。
在多個開發(fā)團隊環(huán)境時,Maven可以設置按標準在非常短的時間里完成配置工作。由于大部分項目的設置都很簡單,并且可重復使用,Maven讓開發(fā)人員的工作更輕松,同時創(chuàng)建報表,檢查,構(gòu)建和測試自動化設置。
Maven提供了開發(fā)人員的方式來管理:
BuildsDocumentationReportingDependenciesSCMsReleasesDistributionmailing list概括地說,Maven簡化和標準化項目建設過程。處理編譯,分配,文檔,團隊協(xié)作和其他任務的無縫連接。 Maven增加可重用性并負責建立相關的任務。
可以和微軟的NuGet進行對比,但是他包含功能的比nuget多。
倉庫結(jié)構(gòu)

流行程度

IDEA內(nèi)工具

我們用Maven干嘛
- Java項目模板(Pom.xml)
- 依賴公共jar管理(各種Spring\SpringBoot生態(tài)圈的jar)
- 公司內(nèi)部基礎類庫倉庫(目前的公共dll都是手工拷貝傳遞的)
- 打包發(fā)布工具
3.4 Git

Git是目前世界上最先進的
分布式版本控制系統(tǒng)(沒有之一)。Git有什么特點?簡單來說就是:高端大氣上檔次!
源碼管理特點

提交到本地庫

提交到遠程庫

遠程庫方案選型

3.5 VS Code

史上最優(yōu)秀的 IDE之一,尤其在
前端界。
特點
免費開源
微軟出品,全部免費使用。而且是開源項目,源碼都給你了,你還要什么自行車?
多平臺支持

占系統(tǒng)資源少
安裝完約 189 MB
內(nèi)存上, 相對于 eclipse, vscode 占用內(nèi)存更少. eclipse 約占用 478 MB(1 個進程), vscode 約共占用 200 MB(6 個進程)。

使用簡單
找不到比這個使用更簡單的 IDE 了, 完全符合程序員的使用習慣, 90% 程序員都會愛上 ta, 還有 10% 后來不寫代碼了. 各種快捷鍵滿天飛, 自定義快捷鍵, 自定義功能, 爽到只想安安靜靜的寫代碼。
提供豐富的插件

功能強大
你想要的功能, 這里都有. 如果沒有, 那應該是你還不會用
界面很贊
界面很程序員, 很專業(yè), 美觀大方, 長時間看也不累
3.6 NPM

npm 是 Node.js 官方提供的包管理工具,他已經(jīng)成了 Node.js 包的標準發(fā)布平臺,用于 Node.js 包的發(fā)布、傳播、依賴控制。npm 提供了命令行工具,使你可以方便地下載、安裝、升級、刪除包,也可以讓你作為開發(fā)者發(fā)布并維護包。
npm 是隨同 Node.js 一起安裝的包管理工具,能解決 Node.js 代碼部署上的很多問題,常見的場景有以下幾種:
允許用戶從 npm 服務器下載別人編寫的第三方包到本地使用。
允許用戶從 npm 服務器下載并安裝別人編寫的命令行程序到本地使用。
允許用戶將自己編寫的包或命令行程序上傳到 npm 服務器供別人使用。
npm 的背后,是基于 couchdb 的一個數(shù)據(jù)庫,詳細記錄了每個包的信息,包括作者、版本、依賴、授權(quán)信息等。它的一個很重要的作用就是:將開發(fā)者從繁瑣的包管理工作(版本、依賴等)中解放出來,更加專注于功能的開發(fā)。
3.7 WebPack
本質(zhì)上,webpack 是一個現(xiàn)代 JavaScript 應用程序的靜態(tài)模塊打包器(module bundler)。當 webpack 處理應用程序時,它會遞歸地構(gòu)建一個依賴關系圖(dependency graph),其中包含應用程序需要的每個模塊,然后將所有這些模塊打包成一個或多個 bundle。
為什要使用WebPack
現(xiàn)今的很多網(wǎng)頁其實可以看做是功能豐富的應用,它們擁有著復雜的JavaScript代碼和一大堆依賴包。為了簡化開發(fā)的復雜度,前端社區(qū)涌現(xiàn)出了很多好的實踐方法
- 模塊化,讓我們可以把復雜的程序細化為小的文件;
- 類似于TypeScript這種在JavaScript基礎上拓展的開發(fā)語言:使我們能夠?qū)崿F(xiàn)目前版本的JavaScript不能直接使用的特性,并且之后還能轉(zhuǎn)換為JavaScript文件使瀏覽器可以識別;
- Scss,less等CSS預處理器
- ...
這些改進確實大大的提高了我們的開發(fā)效率,但是利用它們開發(fā)的文件往往需要進行額外的處理才能讓瀏覽器識別,而手動處理又是非常繁瑣的,這就為WebPack類的工具的出現(xiàn)提供了需求。
什么是Webpack
WebPack可以看做是模塊打包機:它做的事情是,分析你的項目結(jié)構(gòu),找到JavaScript模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript等),并將其轉(zhuǎn)換和打包為合適的格式供瀏覽器使用。這個過程幫我們進行了壓縮、合并、語法分析、語法轉(zhuǎn)義等等很多操作。

4. 服務器容器
4.1 Tomcat

Web服務器軟件,Java Servlet容器,對比IIS
4.2 Nginx

Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;Nginx可以作為一個HTTP服務器進行網(wǎng)站的發(fā)布處理,另外Nginx可以作為反向代理進行負載均衡的實現(xiàn)。
4.3 Node.js
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。
Node.js 使用了一個事件驅(qū)動、非阻塞式 I/O 的模型,使其輕量又高效。
用來干嘛
我們主要用它來作為運行npm、webpack等工具的運行環(huán)境,以及前端模擬開發(fā)(mock)時候的Web服務器(Express)
5. 架構(gòu)暢想
近兩年“微服務架構(gòu)”被炒的火熱,傳統(tǒng)軟件企業(yè)是否能懷抱微服務,從而對軟件產(chǎn)品進行一次架構(gòu)優(yōu)化升級,似乎一直成為信息系統(tǒng)架構(gòu)師思考的問題。傳統(tǒng)行業(yè)對IT效率的變革需求是微服務成長土壤,業(yè)務模式創(chuàng)新重塑導致系統(tǒng)更新頻繁、應用復雜度急劇升高,傳統(tǒng)架構(gòu)不堪重負。伴隨著Spring Cloud開源界各種微服務落地方案的出現(xiàn)和熱議,這些企業(yè)都積極擁抱了微服務,并在生產(chǎn)環(huán)境使用。
5.1 現(xiàn)在架構(gòu)情況


目前軟件產(chǎn)品系統(tǒng)涵蓋多個(20個)模塊,或者稱為應用,每個應用有獨立團隊進行開發(fā)維護,獨立技術線路,且獨立部署。有一個基礎應用:基礎服務SIP,主要負責維護基礎數(shù)據(jù)、認證授權(quán)、配置等基礎服務,并對各個獨立應用提供服務訪問,各個業(yè)務只負責業(yè)務范疇的功能。各個應用之間也存在相互之間的服務依賴和調(diào)用,這種調(diào)用一般以webservice的形式存在,且服務地址配置往往記錄在應用本身。系統(tǒng)外存在移動應用,其部分數(shù)據(jù)依托于該軟件產(chǎn)品,且調(diào)用方式為直接發(fā)起對目標App的請求。

所以,伴隨著系統(tǒng)規(guī)模繼續(xù)擴大,或者需求迭代繼續(xù),當前架構(gòu)似乎的確存在一些問題:
1、模塊之間直接依賴,且服務地址零散配置,形成網(wǎng)狀
2、模塊服務接口版本任意,版本迭代困難,服務調(diào)用方式多樣,不便于管理
4、各個App對服務依賴是單線的,服務進行App級別的負載均衡困難
5、移動和第三方應用直接對各個App進行訪問,穿透產(chǎn)品邊界,且無權(quán)限控制
6、配置信息不集中,無有效管理
7、各個App服務狀態(tài)未知,且容易引起單點
8、服務調(diào)用沒有可追蹤記錄,發(fā)現(xiàn)問題困難
9、跨服務更新,無事務
10、跨團隊接口調(diào)用溝通頻繁
5.2 微服務時代暢享
分析了現(xiàn)階段架構(gòu)的痛點,那么借助微服務架構(gòu)特點,我們可以怎樣進行升級或者思考呢,還是直接畫圖闡述:

改造點:
1、單App技術線路統(tǒng)一
2、引入網(wǎng)關層,進行路由和負載均衡
3、引入注冊中心,對各個App對內(nèi)提供的服務進行注冊和發(fā)現(xiàn)
4、引入配置中心,抽取公共配置,便于統(tǒng)一管理
5、引入基礎服務層,支撐多基礎服務方集成支持
6、引入日志和監(jiān)控平臺,進行服務調(diào)用最終,甚至可以進行容錯性熔斷
7、高并發(fā)下,可以進一步采用7層或者4層LB,對網(wǎng)關進行負載均衡
8、個別應用間可引入分布式事務,進行數(shù)據(jù)一致性保障
9、App應用可獨立部署,便于Paas平臺運行
暢想架構(gòu)難點
這種改造的優(yōu)點,顯然對各個應用進行了更好的治理,但是同時也帶來了很多難點:
1、"應用外服務設施"變多,對軟件產(chǎn)品整體部署和運維帶來困難
2、需要更多基礎技術架構(gòu)團隊的技術支撐
3、基礎服務層,需多種平臺的實現(xiàn)(Supos\BAP)
4、團隊技術能力提升
典型變化

5.3 Spring Cloud
Spring Cloud 是基于Spring Boot 的一整套實現(xiàn)微服務的框架。他提供了微服務開發(fā)所需的配置管理、服務發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話和集群狀態(tài)管理等組件。最重要的是,跟spring boot 框架一起使用的話,會讓你開發(fā)微服務架構(gòu)的云服務非常好的方便。

微服務落地組件
Spring Cloud作為一個微服務架構(gòu)標準,落地的實現(xiàn)方案有Spring Cloud Netflix,Spring Cloud Alibaba
Spring Cloud Netflix

Spring Cloud Aalibaba

6. 容器化和Pass平臺部署
docker容器
傳統(tǒng)虛擬機

每個虛擬機都包括應用程序、必要的二進制文件和庫以及一個完整的客戶操作系統(tǒng)(Guest OS),盡管它們被分離,它們共享并利用主機的硬件資源,將近需要十幾個 GB 的大小。
容器

容器包括應用程序及其所有的依賴,但與其他容器共享內(nèi)核。它們以獨立的用戶空間進程形式運行在主機操作系統(tǒng)上。他們也不依賴于任何特定的基礎設施,Docker 容器可以運行在任何計算機上,任何基礎設施和任何云上。
Docker 的容器利用了 LXC(linux container),管理利用了namespaces 來做權(quán)限的控制和隔離,cgroups 來進行資源的配置,并且還通過 aufs 來進一步提高文件系統(tǒng)的資源利用率,而這些技術都不是 Docker 獨創(chuàng)。
LXC 與虛擬機的不同之處在于,它是一個操作系統(tǒng)級別的虛擬化環(huán)境,而不是硬件虛擬化環(huán)境。他們都做同樣的事情,但 LXC 是操作系統(tǒng)級別的虛擬化環(huán)境,虛擬環(huán)境有它自己的進程和網(wǎng)絡空間,而不是創(chuàng)建一個完整成熟的虛擬機。因此,一個 LXC 虛擬操作系統(tǒng)具有最小的資源需求,并啟動只需幾秒鐘。

dockerfile
FROM anapsix/alpine-java:8_server-jre_unlimited
MAINTAINER XXXXX@163.com
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則提供了基礎架構(gòu),軟件開發(fā)者可以在這個基礎架構(gòu)之上建設新的應用,或者擴展已有的應用,同時卻不必購買開發(fā)、質(zhì)量控制或生產(chǎn)服務器。而應用的部署方式往往是docker鏡像的形式。
典型--阿里云飛天開發(fā)平臺

supOS工業(yè)操作系統(tǒng)




容器治理 kubernetes
是一個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單并且高效(powerful),Kubernetes提供了應用部署,規(guī)劃,更新,維護的一種機制。

基于Docker和Kubernetes的最佳架構(gòu)實踐
未來展望關鍵字
Cloud Native云原生
服務網(wǎng)格(Service Mesh)

