[內(nèi)部]Java Web技術(shù)棧宣講

Java Web 技術(shù)棧宣講

隨著公司技術(shù)線路轉(zhuǎn)型工作的不斷深入边琉,Java Web技術(shù)棧也已經(jīng)基本確定,本次培訓(xùn)將針對關(guān)鍵技術(shù)點進(jìn)行講解和說明记劝,讓大家對未來使用的語言艺骂、框架和工具有個初步的認(rèn)識,便于后期快速入手隆夯,早日實現(xiàn)從入門到放棄钳恕。

首先來看一張大圖總結(jié)圖

Java Web技術(shù).png

1. 語言

1.1. Java

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

java.png

在上個世紀(jì)九十年代,單片機的編程悄然興起蹄衷,這引起了自動化控制人員的廣泛興趣忧额。因為可以很大幅度的提高硬件的“智能程度”,所以被廣泛應(yīng)用愧口。正所謂無利不起早睦番,在當(dāng)時SUN公司也看中了這塊市場。于是在1991年成立了開發(fā)小組耍属,準(zhǔn)備進(jìn)入這一市場托嚣。但是在開發(fā)的過程中,小組的成員發(fā)現(xiàn)使用C++開發(fā)相關(guān)程序十分繁瑣厚骗,于是發(fā)現(xiàn)了一門新的語言示启,這就是Java的前身Oak。

但是Oak的發(fā)展并不順利领舰,它存在很多的缺陷夫嗓,于是經(jīng)過多次的磋商和協(xié)調(diào),Java語言應(yīng)運而生冲秽。

并且在1996年的SUN公司發(fā)布了Java開發(fā)工具包JDK1.0舍咖,并且Java開發(fā)工具包的發(fā)展一直持續(xù)至今。

JDK結(jié)構(gòu)體系

  • Java和環(huán)境關(guān)系


    JVM層次.png
  • JDK內(nèi)部組成圖

Jdk.png

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é)碼解釋成機器碼。機器碼和平臺相關(guān)的(不同硬件環(huán)境毛秘、不同操作系統(tǒng)饭寺,產(chǎn)生的機器碼不同),所以JVM在不同平臺有不同的實現(xiàn)叫挟。
目前JDK默認(rèn)使用的實現(xiàn)是Hotspot VM艰匙。

具體可以和.Net Framework做對等比較

  • 安裝目錄主要組成
jdk-dir.png
  • 典型工具


    JVM工具.png

Java流行領(lǐng)域

  • Tiobe發(fā)布2019年3月編程語言排行榜
排行.png
  • Java應(yīng)用領(lǐng)域
應(yīng)用領(lǐng)域.png

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市場應(yīng)用調(diào)查
where java8.png
  • jdk1.8特點

    Lambda表達(dá)式

    Stream函數(shù)式操作流元素集合

    接口新增:默認(rèn)方法與靜態(tài)方法

    方法引用,與Lambda表達(dá)式聯(lián)合使用

    引入重復(fù)注解

    類型注解

    最新的Date/Time API (JSR 310)

    新增base64加解密API

    數(shù)組并行(parallel)操作

    JVM的PermGen空間被移除:取代它的是Metaspace(JEP 122)元空間

1.2. ES6

es6.png

介紹

ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標(biāo)準(zhǔn)抹恳,已經(jīng)在 2015 年 6 月正式發(fā)布了员凝。它的目標(biāo),是使得 JavaScript 語言可以用來編寫復(fù)雜的大型應(yīng)用程序适秩,成為企業(yè)級開發(fā)語言绊序。

JavaScript 是大家所了解的語言名稱硕舆,但是這個語言名稱是商標(biāo)( Oracle 公司注冊的商標(biāo))秽荞。因此,JavaScript 的正式名稱是 ECMAScript 抚官。1996年11月扬跋,JavaScript 的創(chuàng)造者網(wǎng)景公司將 JS 提交給國際化標(biāo)準(zhǔn)組織 ECMA(European computer manufactures association,歐洲計算機制造聯(lián)合會)凌节,希望這種語言能夠成為國際標(biāo)準(zhǔn)钦听,隨后 ECMA 發(fā)布了規(guī)定瀏覽器腳本語言的標(biāo)準(zhǔn),即 ECMAScript倍奢。這也有利于這門語言的開放和中立朴上。

ECMAScript 歷史

ES6 是 ECMAScript 標(biāo)準(zhǔn)十余年來變動最大的一個版本,為其添加了許多新的語法特性卒煞。

1997 年 ECMAScript 1.0 誕生痪宰。

1998 年 6 月 ECMAScript 2.0 誕生,包含一些小的更改,用于同步獨立的 ISO 國際標(biāo)準(zhǔn)衣撬。

1999 年 12 月 ECMAScript 3.0誕生乖订,它是一個巨大的成功,在業(yè)界得到了廣泛的支持具练,它奠定了 JS 的基本語法乍构,被其后版本完全繼承。直到今天扛点,我們一開始學(xué)習(xí) JS 哥遮,其實就是在學(xué) 3.0 版的語法。

2000 年的 ECMAScript 4.0 是當(dāng)下 ES6 的前身陵究,但由于這個版本太過激烈昔善,對 ES 3 做了徹底升級,所以暫時被"和諧"了畔乙。

2009 年 12 月君仆,ECMAScript 5.0 版正式發(fā)布。ECMA 專家組預(yù)計 ECMAScript 的第五個版本會在 2013 年中期到 2018 年作為主流的開發(fā)標(biāo)準(zhǔn)牲距。

2011年6月翻擒,ES 5.1 版發(fā)布勘天,并且成為 ISO 國際標(biāo)準(zhǔn)。

2013 年,ES6 草案凍結(jié)瘩绒,不再添加新的功能,新的功能將被放到 ES7 中妻往;

2015年6月胀茵, ES6 正式通過,成為國際標(biāo)準(zhǔn)胁后。

特點

  • 塊級作用域:const 與 let 變量

  • 模板字面量

  • 解構(gòu)

  • 對象字面量簡寫法

  • for...of循環(huán)

  • 展開運算符

  • 剩余參數(shù)(可變參數(shù))

  • ES6箭頭函數(shù)

  • 默認(rèn)參數(shù)函數(shù)

  • 模塊化import/export

  • JavaScript類

開源書籍:《ECMAScript 6 入門》

基于ES6的三駕馬車

三駕馬車.png

官方標(biāo)準(zhǔn)

ECMAScript 6 標(biāo)準(zhǔn)規(guī)范&ECMA-262.pdf

ecma6 s.png

2. 框架

2.1 Spring

Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的店读。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而攀芯,Spring的用途不僅僅限于服務(wù)器端的開發(fā)屯断。從簡單性、可測試性和松耦合性角度而言侣诺,絕大部分Java應(yīng)用都可以從Spring中受益殖演。

  • 目的:解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性

  • 功能:使用基本的JavaBean(是一種JAVA語言寫成的可重用組件)代替EJB,并提供了更多的企業(yè)應(yīng)用功能

  • 范圍:任何Java應(yīng)用

Spring是一個輕量級控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架年鸳。

spring-framework

七大核心模塊
spring_framework.gif
  • 核心容器:核心容器提供 Spring 框架的基本功能趴久。核心容器的主要組件是 BeanFactory,它是工廠模式的實現(xiàn)搔确。BeanFactory 使用控制反轉(zhuǎn) (IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實際的應(yīng)用程序代碼分開彼棍。

  • Spring 上下文:Spring 上下文是一個配置文件已添,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù)滥酥,例如 JNDI更舞、EJB、電子郵件坎吻、國際化缆蝉、校驗和調(diào)度功能。

  • Spring AOP:通過配置管理特性瘦真,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中刊头。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP诸尽。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)原杂。通過使用 Spring AOP,不用依賴 EJB 組件您机,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中穿肄。

  • Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯誤消息际看。異常層次結(jié)構(gòu)簡化了錯誤處理咸产,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)仲闽。

  • Spring ORM:Spring 框架插入了若干個 ORM 框架脑溢,從而提供了 ORM 的對象關(guān)系工具,其中包括 JDO赖欣、Hibernate 和 iBatis SQL Map屑彻。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。

  • Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上顶吮,為基于 Web 的應(yīng)用程序提供了上下文社牲。所以,Spring 框架支持與 Jakarta Struts 的集成云矫。Web 模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>

  • Spring MVC 框架:MVC 框架是一個全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實現(xiàn)膳沽。通過策略接口,MVC 框架變成為高度可配置的让禀,MVC 容納了大量視圖技術(shù),其中包括 JSP陨界、Velocity巡揍、Tiles、iText 和 POI菌瘪。

我們?yōu)樯队肧pring
Java主流框架腮敌,穩(wěn)定而且社區(qū)活躍阱当,大企業(yè)都在用,而且是標(biāo)準(zhǔn)
Ioc容器和Spring MVC框架比現(xiàn)在我們用的ABP框架成熟糜工,ABP其實是模仿Spring
我們的業(yè)務(wù)系統(tǒng)符合整體平移到Java平臺

2.2 Spring Boot

Spring Boot 是由 Pivotal 團(tuán)隊提供的全新框架弊添,其設(shè)計目的是用來簡化新 Spring 應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置(習(xí)慣大于約定)捌木,從而使開發(fā)人員不再需要定義樣板化的配置油坝。用我的話來理解,就是 Spring Boot 其實不是什么新的框架刨裆,它默認(rèn)配置了很多框架的使用方式澈圈,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架帆啃。

sp.jpg

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

new project.png

自動配置

理念是約定優(yōu)于配置瞬女,它通過實現(xiàn)了自動配置(大多數(shù)用戶平時習(xí)慣設(shè)置的配置作為默認(rèn)配置)的功能來為用戶快速構(gòu)建出標(biāo)準(zhǔn)化的應(yīng)用。

打包式的starters

提供了多個可選擇的”starter”以簡化Maven的依賴管理(也支持Gradle)努潘,讓您可以按需加載需要的功能模塊诽偷。

actuator(監(jiān)控)

提供了一整套的對應(yīng)用狀態(tài)的監(jiān)控與管理的功能模塊(通過引入spring-boot-starter-actuator),包括應(yīng)用的線程信息疯坤、內(nèi)存信息渤刃、應(yīng)用是否處于健康狀態(tài)等,為了滿足更多的資源監(jiān)控需求贴膘,Spring Cloud中的很多模塊還對其進(jìn)行了擴展卖子。

spring boot admin

我們?yōu)樯队肧pring Boot
在Spring的基礎(chǔ)上的框架,選擇Spring 必選
簡化使用Spring的配置過程
業(yè)界成熟刑峡,版本持續(xù)更新

2.3 Mybatis

MyBatis.png
MyBatis-1.png

ORM選型

? 一個項目中用到的復(fù)雜查詢基本沒有洋闽,就是最基本的增刪改查,這樣選擇Hibernate的效率就要高些了突梦,因為基本的SQL語句已經(jīng)被封裝好诫舅,根本不需要手寫SQL,可以節(jié)省大量時間宫患,但是對于一個大型項目刊懈,復(fù)雜的查詢語句較多,使用MyBatis就會加快很多娃闲,而且SQL語句管理也會很方便虚汛。

MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL皇帮、存儲過程以及高級映射卷哩。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型属拾、接口和 Java 的 POJO(Plain Old Java Objects将谊,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄冷溶。

Mybatis-Plus(為簡化開發(fā)而生)

MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎(chǔ)上只做增強不做改變尊浓,為簡化開發(fā)逞频、提高效率而生。

愿景

我們的愿景是成為 MyBatis 最好的搭檔栋齿,就像 魂斗羅 中的 1P苗胀、2P,基友搭配褒颈,效率翻倍柒巫。

MyBatis-plus.png
  • 無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響谷丸,如絲般順滑
  • 損耗小:啟動即會自動注入基本 CURD堡掏,性能基本無損耗,直接面向?qū)ο蟛僮?/li>
  • 強大的 CRUD 操作:內(nèi)置通用 Mapper刨疼、通用 Service泉唁,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強大的條件構(gòu)造器揩慕,滿足各類使用需求
  • 支持 Lambda 形式調(diào)用:通過 Lambda 表達(dá)式亭畜,方便的編寫各類查詢條件,無需再擔(dān)心字段寫錯
  • 支持多種數(shù)據(jù)庫:支持 MySQL迎卤、MariaDB拴鸵、Oracle、DB2蜗搔、H2劲藐、HSQL、SQLite樟凄、Postgre聘芜、SQLServer2005、SQLServer 等多種數(shù)據(jù)庫
  • 支持主鍵自動生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence)缝龄,可自由配置汰现,完美解決主鍵問題
  • 支持 XML 熱加載:Mapper 對應(yīng)的 XML 支持熱加載,對于簡單的 CRUD 操作叔壤,甚至可以無 XML 啟動
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用瞎饲,實體類只需繼承 Model 類即可進(jìn)行強大的 CRUD 操作
  • 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 支持關(guān)鍵詞自動轉(zhuǎn)義:支持?jǐn)?shù)據(jù)庫關(guān)鍵詞(order、key......)自動轉(zhuǎn)義百新,還可自定義關(guān)鍵詞
  • 內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 企软、 Model 、 Service 饭望、 Controller 層代碼仗哨,支持模板引擎,更有超多自定義配置等您來使用
  • 內(nèi)置分頁插件:基于 MyBatis 物理分頁铅辞,開發(fā)者無需關(guān)心具體操作厌漂,配置好插件之后,寫分頁等同于普通 List 查詢
  • 內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時間斟珊,建議開發(fā)測試時啟用該功能苇倡,能快速揪出慢查詢
  • 內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷囤踩,也可自定義攔截規(guī)則旨椒,預(yù)防誤操作
  • 內(nèi)置 Sql 注入剝離器:支持 Sql 注入剝離,有效預(yù)防 Sql 注入攻擊
mybatis-plus-framework.jpg
我們?yōu)槭裁催x擇Mybatis+Mybatis-Plus
類似EF6使用方式堵漱,平移技術(shù)平滑
借助Mybatis综慎,簡單CRUD可以零Sql
復(fù)雜業(yè)務(wù)Sql可以自行優(yōu)化
代碼生成工具,豐富強大
互聯(lián)網(wǎng)企業(yè)必選勤庐,社區(qū)穩(wěn)定示惊,支持強大

2.4 Vue

Vue.js 是一個JavaScript MVVM庫,是一套構(gòu)建用戶界面的漸進(jìn)式框架愉镰。它是以數(shù)據(jù)驅(qū)動組件化的思想構(gòu)建的米罚,采用自底向上增量開發(fā)的設(shè)計。相比于Angular.js丈探,Vue.js提供了更加簡潔录择、更易于理解的API,使得我們能夠快速地上手并使用Vue.js碗降;同時比起 React + Redux 相對復(fù)雜的架構(gòu)隘竭,Vue.js 更加輕量級也更加容易上手,是初創(chuàng)項目的首選前端框架遗锣。Vue 的核心庫只關(guān)注視圖層货裹,它不僅易于上手,還便于與第三方庫或既有項目整合精偿。并且作者是華人的關(guān)系弧圆,Vue擁有著對華人開發(fā)者最友好的api文檔和官方教程。

MVVM概念

mvvm.jpg
jQuery和Vue區(qū)別

jQuery是使用選擇器$選取DOM對象笔咽,對其進(jìn)行賦值搔预、取值、事件綁定等操作叶组,其實和原生的HTML的區(qū)別只在于可以更方便的選取和操作DOM對象拯田,而數(shù)據(jù)和界面是在一起的。比如需要獲取label標(biāo)簽的內(nèi)容:$("lable").val();,它還是依賴DOM元素的值甩十。

$("#id").val("hello world");

Vue則是通過Vue對象將數(shù)據(jù)和View完全分離開來了船庇。對數(shù)據(jù)進(jìn)行操作不再需要引用相應(yīng)的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-yyx.png
基于Vue的UI組件
UI組件.png
我們選型Vue.js的原因
Vue.js國內(nèi)比較火
UI組件豐富
語法比較適合國人習(xí)慣,對MVVM的概念比較清晰
Vue全家桶(vue-router路由窃爷、vuex狀態(tài)管理邑蒋、axios)
UI組件對比
UI.png

2.5 UI組件

Ant Design Vue

基于螞蟻金服 Ant Design 的Vue 實現(xiàn),開發(fā)和服務(wù)于企業(yè)級后臺產(chǎn)品按厘。

特性
  • 提煉自企業(yè)級中后臺產(chǎn)品的交互語言和視覺風(fēng)格医吊。
  • 開箱即用的高質(zhì)量 Vue 組件。
  • 共享Ant Design of React設(shè)計工具體系逮京。
  • 現(xiàn)代瀏覽器和 IE9 及以上(需要 polyfills
周邊工具
Ant Desgin tools.png
組件內(nèi)容
ant Desgin c1.png
ant Desgin c2.png

3. 工具

3.1 Intellij IDEA

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

idea2.png

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

IDEA.png

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

idea3.png

3.2 STS

spring tool suite (sts)

https://spring.io/tools

其實就是一個被包裝過的Eclipse狐肢,主要用于快速的開發(fā)Spring項目玛瘸,我們不用再去編輯繁瑣的xml配置文件脯颜,而是由工具自動生成奄薇。

特點:免費

3.3 Maven

maven2.png

? Maven是一個項目管理和綜合工具租副。Maven提供了開發(fā)人員構(gòu)建一個完整的生命周期框架。開發(fā)團(tuán)隊可以自動完成項目的基礎(chǔ)工具建設(shè)僵腺,Maven使用標(biāo)準(zhǔn)的目錄結(jié)構(gòu)和默認(rèn)構(gòu)建生命周期鲤孵。

在多個開發(fā)團(tuán)隊環(huán)境時,Maven可以設(shè)置按標(biāo)準(zhǔn)在非常短的時間里完成配置工作辰如。由于大部分項目的設(shè)置都很簡單普监,并且可重復(fù)使用,Maven讓開發(fā)人員的工作更輕松,同時創(chuàng)建報表凯正,檢查毙玻,構(gòu)建和測試自動化設(shè)置。

Maven提供了開發(fā)人員的方式來管理:

  •         Builds      
    
  •         Documentation       
    
  •         Reporting       
    
  •         Dependencies        
    
  •         SCMs        
    
  •         Releases        
    
  •         Distribution        
    
  •         mailing list        
    

    概括地說漆际,Maven簡化和標(biāo)準(zhǔn)化項目建設(shè)過程淆珊。處理編譯夺饲,分配奸汇,文檔,團(tuán)隊協(xié)作和其他任務(wù)的無縫連接往声。 Maven增加可重用性并負(fù)責(zé)建立相關(guān)的任務(wù)擂找。

可以和微軟的NuGet進(jìn)行對比,但是他包含功能的比nuget多浩销。

倉庫結(jié)構(gòu)

maven3.png

流行程度

maven.png

IDEA內(nèi)工具

maven4.png

我們用Maven干嘛

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

3.4 Git

git.jpg

Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)贯涎。

Git有什么特點?簡單來說就是:高端大氣上檔次慢洋!

源碼管理特點

git2.jpg

提交到本地庫

git3.png

提交到遠(yuǎn)程庫

git4.png

遠(yuǎn)程庫方案選型

git.png

3.5 VS Code

vs code.jpg

史上最優(yōu)秀的 IDE之一塘雳,尤其在前端界。

特點

免費開源

微軟出品普筹,全部免費使用败明。而且是開源項目,源碼都給你了太防,你還要什么自行車妻顶?

多平臺支持
vs code 多平臺支持.png
占系統(tǒng)資源少

安裝完約 189 MB
內(nèi)存上, 相對于 eclipse, vscode 占用內(nèi)存更少. eclipse 約占用 478 MB(1 個進(jìn)程), vscode 約共占用 200 MB(6 個進(jìn)程)。

vs m.png
使用簡單

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

提供豐富的插件
vs plugins.png
功能強大

你想要的功能, 這里都有. 如果沒有, 那應(yīng)該是你還不會用

界面很贊

界面很程序員, 很專業(yè), 美觀大方, 長時間看也不累

3.6 NPM

npm.png

npm 是 Node.js 官方提供的包管理工具讳嘱,他已經(jīng)成了 Node.js 包的標(biāo)準(zhǔn)發(fā)布平臺,用于 Node.js 包的發(fā)布酿愧、傳播沥潭、依賴控制。npm 提供了命令行工具嬉挡,使你可以方便地下載钝鸽、安裝、升級棘伴、刪除包寞埠,也可以讓你作為開發(fā)者發(fā)布并維護(hù)包。

npm 是隨同 Node.js 一起安裝的包管理工具焊夸,能解決 Node.js 代碼部署上的很多問題仁连,常見的場景有以下幾種:

  • 允許用戶從 npm 服務(wù)器下載別人編寫的第三方包到本地使用。

  • 允許用戶從 npm 服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。

  • 允許用戶將自己編寫的包或命令行程序上傳到 npm 服務(wù)器供別人使用饭冬。

npm 的背后使鹅,是基于 couchdb 的一個數(shù)據(jù)庫,詳細(xì)記錄了每個包的信息昌抠,包括作者患朱、版本、依賴炊苫、授權(quán)信息等裁厅。它的一個很重要的作用就是:將開發(fā)者從繁瑣的包管理工作(版本、依賴等)中解放出來侨艾,更加專注于功能的開發(fā)执虹。

3.7 WebPack

本質(zhì)上,webpack 是一個現(xiàn)代 JavaScript 應(yīng)用程序的靜態(tài)模塊打包器(module bundler)唠梨。當(dāng) webpack 處理應(yīng)用程序時袋励,它會遞歸地構(gòu)建一個依賴關(guān)系圖(dependency graph),其中包含應(yīng)用程序需要的每個模塊当叭,然后將所有這些模塊打包成一個或多個 bundle茬故。

為什要使用WebPack

現(xiàn)今的很多網(wǎng)頁其實可以看做是功能豐富的應(yīng)用,它們擁有著復(fù)雜的JavaScript代碼和一大堆依賴包蚁鳖。為了簡化開發(fā)的復(fù)雜度磺芭,前端社區(qū)涌現(xiàn)出了很多好的實踐方法

  • 模塊化,讓我們可以把復(fù)雜的程序細(xì)化為小的文件;
  • 類似于TypeScript這種在JavaScript基礎(chǔ)上拓展的開發(fā)語言:使我們能夠?qū)崿F(xiàn)目前版本的JavaScript不能直接使用的特性才睹,并且之后還能轉(zhuǎn)換為JavaScript文件使瀏覽器可以識別徘跪;
  • Scss,less等CSS預(yù)處理器
  • ...

這些改進(jìn)確實大大的提高了我們的開發(fā)效率琅攘,但是利用它們開發(fā)的文件往往需要進(jìn)行額外的處理才能讓瀏覽器識別,而手動處理又是非常繁瑣的垮庐,這就為WebPack類的工具的出現(xiàn)提供了需求。

什么是Webpack

WebPack可以看做是模塊打包機:它做的事情是坞琴,分析你的項目結(jié)構(gòu)哨查,找到JavaScript模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript等)剧辐,并將其轉(zhuǎn)換和打包為合適的格式供瀏覽器使用寒亥。這個過程幫我們進(jìn)行了壓縮、合并荧关、語法分析溉奕、語法轉(zhuǎn)義等等很多操作。

webpack.png

4. 服務(wù)器容器

4.1 Tomcat

tomcat.png

Web服務(wù)器軟件忍啤,Java Servlet容器加勤,對比IIS

https://tomcat.apache.org/

4.2 Nginx

nginx1.jpg

Nginx是一款自由的、開源的、高性能的HTTP服務(wù)器和反向代理服務(wù)器鳄梅;同時也是一個IMAP叠国、POP3、SMTP代理服務(wù)器戴尸;Nginx可以作為一個HTTP服務(wù)器進(jìn)行網(wǎng)站的發(fā)布處理粟焊,另外Nginx可以作為反向代理進(jìn)行負(fù)載均衡的實現(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服務(wù)器(Express)

5. 架構(gòu)暢想

近兩年“微服務(wù)架構(gòu)”被炒的火熱浑测,傳統(tǒng)軟件企業(yè)是否能懷抱微服務(wù),從而對軟件產(chǎn)品進(jìn)行一次架構(gòu)優(yōu)化升級歪玲,似乎一直成為信息系統(tǒng)架構(gòu)師思考的問題迁央。傳統(tǒng)行業(yè)對IT效率的變革需求是微服務(wù)成長土壤,業(yè)務(wù)模式創(chuàng)新重塑導(dǎo)致系統(tǒng)更新頻繁、應(yīng)用復(fù)雜度急劇升高滥崩,傳統(tǒng)架構(gòu)不堪重負(fù)岖圈。伴隨著Spring Cloud開源界各種微服務(wù)落地方案的出現(xiàn)和熱議,這些企業(yè)都積極擁抱了微服務(wù)钙皮,并在生產(chǎn)環(huán)境使用蜂科。

5.1 現(xiàn)在架構(gòu)情況

jiagou1.png

Mes.png

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

jiagou2.png

所以汇四,伴隨著系統(tǒng)規(guī)模繼續(xù)擴大接奈,或者需求迭代繼續(xù),當(dāng)前架構(gòu)似乎的確存在一些問題:

1通孽、模塊之間直接依賴序宦,且服務(wù)地址零散配置,形成網(wǎng)狀

2背苦、模塊服務(wù)接口版本任意互捌,版本迭代困難,服務(wù)調(diào)用方式多樣行剂,不便于管理

4秕噪、各個App對服務(wù)依賴是單線的,服務(wù)進(jìn)行App級別的負(fù)載均衡困難

5厚宰、移動和第三方應(yīng)用直接對各個App進(jìn)行訪問腌巾,穿透產(chǎn)品邊界,且無權(quán)限控制

6铲觉、配置信息不集中澈蝙,無有效管理

7、各個App服務(wù)狀態(tài)未知撵幽,且容易引起單點

8灯荧、服務(wù)調(diào)用沒有可追蹤記錄,發(fā)現(xiàn)問題困難

9盐杂、跨服務(wù)更新逗载,無事務(wù)

10、跨團(tuán)隊接口調(diào)用溝通頻繁

5.2 微服務(wù)時代暢享

分析了現(xiàn)階段架構(gòu)的痛點链烈,那么借助微服務(wù)架構(gòu)特點厉斟,我們可以怎樣進(jìn)行升級或者思考呢,還是直接畫圖闡述:

架構(gòu)3.png

改造點:

1测垛、單App技術(shù)線路統(tǒng)一

2捏膨、引入網(wǎng)關(guān)層,進(jìn)行路由和負(fù)載均衡

3食侮、引入注冊中心号涯,對各個App對內(nèi)提供的服務(wù)進(jìn)行注冊和發(fā)現(xiàn)

4、引入配置中心锯七,抽取公共配置链快,便于統(tǒng)一管理

5、引入基礎(chǔ)服務(wù)層眉尸,支撐多基礎(chǔ)服務(wù)方集成支持

6域蜗、引入日志和監(jiān)控平臺巨双,進(jìn)行服務(wù)調(diào)用最終,甚至可以進(jìn)行容錯性熔斷

7霉祸、高并發(fā)下筑累,可以進(jìn)一步采用7層或者4層LB,對網(wǎng)關(guān)進(jìn)行負(fù)載均衡

8丝蹭、個別應(yīng)用間可引入分布式事務(wù)慢宗,進(jìn)行數(shù)據(jù)一致性保障

9、App應(yīng)用可獨立部署奔穿,便于Paas平臺運行

暢想架構(gòu)難點

這種改造的優(yōu)點镜沽,顯然對各個應(yīng)用進(jìn)行了更好的治理,但是同時也帶來了很多難點:

1贱田、"應(yīng)用外服務(wù)設(shè)施"變多缅茉,對軟件產(chǎn)品整體部署和運維帶來困難

2、需要更多基礎(chǔ)技術(shù)架構(gòu)團(tuán)隊的技術(shù)支撐

3男摧、基礎(chǔ)服務(wù)層蔬墩,需多種平臺的實現(xiàn)(Supos\BAP)

4、團(tuán)隊技術(shù)能力提升

典型變化

服務(wù)注冊發(fā)現(xiàn).png

5.3 Spring Cloud

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

Spring Cloud.png

微服務(wù)落地組件

Spring Cloud作為一個微服務(wù)架構(gòu)標(biāo)準(zhǔn),落地的實現(xiàn)方案有Spring Cloud Netflix齿桃,Spring Cloud Alibaba

Spring Cloud Netflix
微服務(wù)架構(gòu)2.png
Spring Cloud Aalibaba
alibaba.png

6. 容器化和Pass平臺部署

docker容器

傳統(tǒng)虛擬機
jm.png

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

容器
lxc.png

容器包括應(yīng)用程序及其所有的依賴香到,但與其他容器共享內(nèi)核鱼冀。它們以獨立的用戶空間進(jìn)程形式運行在主機操作系統(tǒng)上报破。他們也不依賴于任何特定的基礎(chǔ)設(shè)施,Docker 容器可以運行在任何計算機上千绪,任何基礎(chǔ)設(shè)施和任何云上充易。

Docker 的容器利用了 LXC(linux container),管理利用了namespaces 來做權(quán)限的控制和隔離荸型,cgroups 來進(jìn)行資源的配置盹靴,并且還通過 aufs 來進(jìn)一步提高文件系統(tǒng)的資源利用率,而這些技術(shù)都不是 Docker 獨創(chuàng)帆疟。

LXC 與虛擬機的不同之處在于鹉究,它是一個操作系統(tǒng)級別的虛擬化環(huán)境,而不是硬件虛擬化環(huán)境踪宠。他們都做同樣的事情自赔,但 LXC 是操作系統(tǒng)級別的虛擬化環(huán)境,虛擬環(huán)境有它自己的進(jìn)程和網(wǎng)絡(luò)空間柳琢,而不是創(chuàng)建一個完整成熟的虛擬機绍妨。因此,一個 LXC 虛擬操作系統(tǒng)具有最小的資源需求柬脸,并啟動只需幾秒鐘他去。

jar docker.png
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


鏡像倉庫
docker.jpg

Pass平臺

Paas則提供了基礎(chǔ)架構(gòu),軟件開發(fā)者可以在這個基礎(chǔ)架構(gòu)之上建設(shè)新的應(yīng)用倒堕,或者擴展已有的應(yīng)用灾测,同時卻不必購買開發(fā)、質(zhì)量控制或生產(chǎn)服務(wù)器垦巴。而應(yīng)用的部署方式往往是docker鏡像的形式媳搪。

典型--阿里云飛天開發(fā)平臺
飛天.jpg
supOS工業(yè)操作系統(tǒng)
supOS1.png
supos2.png
supos3.png
supos4.png
容器治理 kubernetes

是一個開源的,用于管理云平臺中多個主機上的容器化的應(yīng)用骤宣,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡單并且高效(powerful),Kubernetes提供了應(yīng)用部署秦爆,規(guī)劃,更新憔披,維護(hù)的一種機制等限。

k8s.png

基于Docker和Kubernetes的最佳架構(gòu)實踐

未來展望關(guān)鍵字
  • Cloud Native云原生

  • 服務(wù)網(wǎng)格(Service Mesh)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芬膝,隨后出現(xiàn)的幾起案子望门,更是在濱河造成了極大的恐慌,老刑警劉巖蔗候,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怒允,死亡現(xiàn)場離奇詭異抑党,居然都是意外死亡必尼,警方通過查閱死者的電腦和手機愕撰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門览露,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丽惶,你說我怎么就攤上這事炫七。” “怎么了钾唬?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵万哪,是天一觀的道長。 經(jīng)常有香客問我抡秆,道長奕巍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任儒士,我火速辦了婚禮的止,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘着撩。我一直安慰自己诅福,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布拖叙。 她就那樣靜靜地躺著氓润,像睡著了一般。 火紅的嫁衣襯著肌膚如雪薯鳍。 梳的紋絲不亂的頭發(fā)上咖气,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音挖滤,去河邊找鬼采章。 笑死,一個胖子當(dāng)著我的面吹牛壶辜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播担租,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼砸民,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奋救?” 一聲冷哼從身側(cè)響起岭参,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尝艘,沒想到半個月后演侯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡背亥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年秒际,在試婚紗的時候發(fā)現(xiàn)自己被綠了悬赏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡娄徊,死狀恐怖闽颇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寄锐,我是刑警寧澤兵多,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站橄仆,受9級特大地震影響剩膘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盆顾,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一怠褐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椎扬,春花似錦惫搏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揖铜,卻和暖如春茴丰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背天吓。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工贿肩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龄寞。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓汰规,卻偏偏與公主長得像,于是被迫代替她去往敵國和親物邑。 傳聞我的和親對象是個殘疾皇子溜哮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容