為一枚Java程序員,需要掌握哪些技術(shù)和工具才能完成一個JavaWeb項(xiàng)目呢?今天羅列一些常用技術(shù)和工具,這些技術(shù)都是我這10年工作中用的比較多的,我知道技術(shù)棧遠(yuǎn)不止這些,本人只列自己熟悉和用的最多的,完成一個項(xiàng)目絕對夠用了。說這么多技術(shù)不是讓大家都要熟悉,有些太老的現(xiàn)在也用的少了甚至不用了,本人主要結(jié)合我這10年開發(fā)經(jīng)驗(yàn)告訴大家JavaWeb的常用技術(shù)棧。
下面這張是技術(shù)棧思維導(dǎo)圖:
什么是技術(shù)棧? 舉個例子: 開發(fā)一個普通管理系統(tǒng),會用到Sprin Boot+MyBatis+Spring+Mysql+Redis+RabbitMq+Nginx+Vue+Shiro+html+等等,這些技術(shù)合起來就可以稱為技術(shù)棧。
我將技術(shù)棧大致分為5大塊:前端、后端、中間件、數(shù)據(jù)庫和工具。
JSP全稱Java Server Pages,是一種動態(tài)網(wǎng)頁開發(fā)技術(shù)。它使用JSP標(biāo)簽在HTML網(wǎng)頁中插入Java代碼。
JSP本質(zhì)上是一個servlet,主要用于實(shí)現(xiàn)Java web應(yīng)用程序的用戶界面部分。
<html>
<head>
<title>第一個 JSP 程序</title>
</head>
<body>
<%
out.println("Hello World!");
%>
</body>
</html>
JSP這種網(wǎng)頁技術(shù)我猜5年以下的程序員基本沒接觸過,10年前我接觸的項(xiàng)目前端基本都是采用的JSP技術(shù),jsp配合各種html+jquery/JavaScript+css完成前端頁面開發(fā)。
DWZ、EasyUI、EXT、BootStrap、KendoUI 都是基于基于 HTML、CSS、JavaScript/jquery的一些富文本客戶端UI框架,在當(dāng)時簡直是后端開發(fā)人員的福音。這些框架最大的特點(diǎn)就是官網(wǎng)上提供了各種組件的使用方法,后端人員只要套到JSP頁面中,進(jìn)行數(shù)據(jù)渲染即可。這些UI框架風(fēng)格基本已經(jīng)固定,更適合開發(fā)一些管理類系統(tǒng),都包括:強(qiáng)大的數(shù)據(jù)源,通用的拖拉(Drag-and-Drop)功能,模板,和UI控件。
是中國人自己開發(fā)的基于jQuery實(shí)現(xiàn)的Ajax RIA開源框架,設(shè)計(jì)目標(biāo)是簡單實(shí)用,快速開發(fā),降低ajax開發(fā)成本。
官網(wǎng):https://jui.org/
easyui是一種基于jQuery的用戶界面插件集合,為創(chuàng)建現(xiàn)代化,互動,JavaScript應(yīng)用程序,提供必要的功能。使用easyui你不需要寫很多代碼,你只需要通過編寫一些簡單HTML標(biāo)記,就可以定義用戶界面,為網(wǎng)頁開發(fā)的時間和規(guī)模。
官網(wǎng);http://www.jeasyui.com/
ExtJS是基于YUI(雅虎用戶界面)的sencha的JavaScript框架和產(chǎn)品,它基本上是具有現(xiàn)代UI的桌面應(yīng)用程序開發(fā)平臺。
中文官網(wǎng):http://extjs-doc-cn.github.io/ext4api/#!/api/Ext
bootstrap是Twitter推出的一個用于前端開發(fā)的開源工具包
中文官網(wǎng):https://www.bootcss.com/
是一套 JavaScript 函式庫,提供抽象化、可自訂主題的 GUI 控制項(xiàng)與動畫效果。基于 jQuery JavaScript 函式庫,可用來建構(gòu)互動式的 Web 應(yīng)用
官網(wǎng):http://www.kendoui.io/
FreeMarker是一個免費(fèi)的模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫的,用來生成HTML Web頁面,特別是基于MVC模式的應(yīng)用程序。通常由Java程序準(zhǔn)備要顯示的數(shù)據(jù),由FreeMarker生成頁面,通過模板顯示準(zhǔn)備的數(shù)據(jù)(如下圖)
FreeMarker不是一個Web應(yīng)用框架,F(xiàn)reeMarker與容器無關(guān),也可以在模板中使用JSP標(biāo)記庫。
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>
上面很多前端框架都是基于html的,需要你有js/jq、css基礎(chǔ),這是所有前端框架的基礎(chǔ)。因?yàn)楣饪蚣苡袝r并不能滿足我們的需求,有時需要對框架無法實(shí)現(xiàn)的功能需要在框架基礎(chǔ)上調(diào)整;還有這個飛速發(fā)展的互聯(lián)網(wǎng)時代,對前端的要求越來越高,原生html得到了快速發(fā)展,基本所有前端效果使用原生時可以實(shí)現(xiàn)的。
vue.js 使用了基于 HTML 的模板語法,允許開發(fā)者聲明式地將 DOM 綁定至底層 Vue 實(shí)例的數(shù)據(jù)。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循規(guī)范的瀏覽器和 HTML 解析器解析。
在底層的實(shí)現(xiàn)上,Vue 將模板編譯成虛擬 DOM 渲染函數(shù)。結(jié)合響應(yīng)系統(tǒng),Vue 能夠智能地計(jì)算出最少需要重新渲染多少組件,并把 DOM 操作次數(shù)減到最少。
VUE+elementUI目前使用最多的,尤其是開發(fā)一些后臺管理系統(tǒng)還是比較簡單便捷的。
servlet是Server Applet的簡稱,翻譯過來就是服務(wù)程序,簡單的講就是是運(yùn)行在服務(wù)器上的一個小程序,用來處理服務(wù)器請求的。我們通過瀏覽器訪問一個應(yīng)用,在這個過程中,我們的瀏覽器發(fā)送訪問請求,服務(wù)器接收請求,并對瀏覽器的請求作出相應(yīng)的處理,這就是我們熟悉的B/S模型(瀏覽器-服務(wù)器模型).而servlet就是對請求作出處理的組件,運(yùn)行于支持Java的應(yīng)用服務(wù)器中。如圖如是:
struts主要是指struts1和struts2,是經(jīng)典的MVC框架,除去一些老項(xiàng)目,現(xiàn)在用的越來越少了。但struts1和struts2還是有區(qū)別的,主要區(qū)別二者本質(zhì)不一樣。
struts1:通過采用Java Servlet/JSP技術(shù),實(shí)現(xiàn)了基于Java EE Web應(yīng)用的Model-View-Controller(MVC)設(shè)計(jì)模式的應(yīng)用框架,是MVC經(jīng)典設(shè)計(jì)模式中的一個經(jīng)典產(chǎn)品。
struts2:以WebWork為核心,采用攔截器的機(jī)制來處理用戶的請求,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產(chǎn)品。
最經(jīng)典的組合strutsMVC+SPring+Hibernate,號稱SSH,當(dāng)年都是面試必問的技術(shù)。
Spring框架是一個開源Java應(yīng)用框架,解決了開發(fā)者在開發(fā)中遇到的許多常見的問題,提供了功能強(qiáng)大IOC、AOP及Web MVC等功能。Spring可以單獨(dú)應(yīng)用于應(yīng)用程序,也可以和Struts、Webwork等眾多Web框架組合使用。Spring框架主要由七部分組成,分別是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
早期項(xiàng)目大部分都是通過對JDBC封裝來操作數(shù)據(jù)庫,實(shí)現(xiàn)增刪改查,對性能考慮也不多,隨時間推移不斷衍生出很多框架,例如:mybatis,hibernate等。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個由Clinton Begin在2001年發(fā)起的開放源代碼項(xiàng)目。最初側(cè)重于密碼軟件的開發(fā),現(xiàn)在是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO),同時還提供一個利用這個框架開發(fā)的JPetStore實(shí)例。
iBATIS 目前提供了三種語言實(shí)現(xiàn)的版本,包括:Java、.NET以及Ruby。
MyBatis 本是apache的一個開源項(xiàng)目iBatis, 2010年這個項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。
Mybatis 增強(qiáng)工具包 - 只做增強(qiáng)不做改變,簡化CRUD操作
JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對象持久化到數(shù)據(jù)庫中。
Sun引入新的JPA ORM規(guī)范出于兩個原因:其一,簡化現(xiàn)有Java EE和Java SE應(yīng)用開發(fā)工作;其二,Sun希望整合ORM技術(shù),實(shí)現(xiàn)天下歸一。
SpringBoot是由Pivotal團(tuán)隊(duì)在2013年開始研發(fā)、2014年4月發(fā)布第一個版本的全新開源的輕量級框架。它基于Spring4.0設(shè)計(jì),不僅繼承了Spring框架原有的優(yōu)秀特性,而且還通過簡化配置來進(jìn)一步簡化了Spring應(yīng)用的整個搭建和開發(fā)過程。另外SpringBoot通過集成大量的框架使得依賴包的版本沖突,以及引用的不穩(wěn)定性等問題得到了很好的解決。
Spring Cloud 為開發(fā)者提供了在分布式系統(tǒng)(如配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、一次性 Token、全局鎖、決策競選、分布式會話和集群狀態(tài))操作的開發(fā)工具。使用 Spring Cloud 開發(fā)者可以快速實(shí)現(xiàn)上述這些模式。
Spring Cloud 的 GitHub 主頁:https://github.com/spring-cloud
Dubbo 是阿里巴巴公司開源的一個高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和 Spring 框架無縫集成。
主要核心部件:
Remoting: 網(wǎng)絡(luò)通信框架,實(shí)現(xiàn)了 sync-over-async 和 request-response 消息機(jī)制
RPC: 一個遠(yuǎn)程過程調(diào)用的抽象,支持負(fù)載均衡、容災(zāi)和集群功能
Registry: 服務(wù)目錄框架用于服務(wù)的注冊和服務(wù)事件發(fā)布和訂閱
Spring Cloud Alibaba 致力于提供分布式應(yīng)用服務(wù)開發(fā)的一站式解決方案。此項(xiàng)目包含開發(fā)分布式應(yīng)用服務(wù)的必需組件,方便開發(fā)者通過 Spring Cloud 編程模型輕松使用這些組件來開發(fā)分布式應(yīng)用服務(wù)。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以將 Spring Cloud 應(yīng)用接入阿里分布式應(yīng)用解決方案,通過阿里中間件來迅速搭建分布式應(yīng)用系統(tǒng)。
Apache Shiro 是 Java 的一個安全框架。目前,使用 Apache Shiro 的人越來越多,因?yàn)樗喈?dāng)簡單,對比 Spring Security,可能沒有 Spring Security 做的功能強(qiáng)大,但是在實(shí)際工作時可能并不需要那么復(fù)雜的東西,所以使用小而簡單的 Shiro 就足夠了。對于它倆到底哪個好,這個不必糾結(jié),能更簡單的解決項(xiàng)目問題就好了。
Spring Security是一個能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉(zhuǎn)Inversion of Control ,DI:Dependency Injection 依賴注入)和AOP(面向切面編程)功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問控制功能,減少了為企業(yè)系統(tǒng)安全控制編寫大量重復(fù)代碼的工作。
OAuth(開放授權(quán))是一個開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用。
OAuth 2.0 是目前比較流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以標(biāo)注為 2.0,是因?yàn)樽畛跤幸粋€1.0協(xié)議,但這個1.0協(xié)議被弄得太復(fù)雜,易用性差,所以沒有得到普及。2.0是一個新的設(shè)計(jì),協(xié)議簡單清晰,但它并不兼容1.0,可以說與1.0沒什么關(guān)系。
Maven 是 Apache 下的一個純 Java 開發(fā)的開源項(xiàng)目。利用一個中央信息片斷能管理一個項(xiàng)目的構(gòu)建、報(bào)告和文檔等步驟。是一個項(xiàng)目管理工具,可以對 Java 項(xiàng)目進(jìn)行構(gòu)建、依賴管理。
ant 是一個將軟件編譯、測試、部署等步驟聯(lián)系在一起加以自動化的一個工具,大多用于Java環(huán)境中的軟件開發(fā)。在實(shí)際軟件開發(fā)中,有很多地方可以用到ant。
Gradle是一個基于Apache Ant和Apache Maven概念的項(xiàng)目自動化構(gòu)建開源工具。它使用一種基于Groovy的特定領(lǐng)域語言(DSL)來聲明項(xiàng)目設(shè)置,目前也增加了基于Kotlin語言的kotlin-based DSL,拋棄了基于XML的各種繁瑣配置。
Tomcat 服務(wù)器是一個免費(fèi)的開放源代碼的Web 應(yīng)用服務(wù)器,屬于輕量級應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選
Apache(阿帕奇)是世界使用排名第一的Web服務(wù)器軟件。它可以運(yùn)行在幾乎所有廣泛使用的計(jì)算機(jī)平臺上,由于其跨平臺和安全性被廣泛使用,是最流行的Web服務(wù)器端軟件之一
Jetty 是一個開源的servlet容器,它為基于Java的web容器,例如JSP和servlet提供運(yùn)行環(huán)境。
WebLogic Server是專門為企業(yè)電子商務(wù)應(yīng)用系統(tǒng)開發(fā)的。企業(yè)電子商務(wù)應(yīng)用系統(tǒng)需要快速開發(fā),并要求服務(wù)器端組件具有良好的靈活性和安全性,同時還要支持關(guān)鍵任務(wù)所必需的擴(kuò)展、性能、和高可用性。WebLogic Server簡化了可移植及可擴(kuò)展的應(yīng)用系統(tǒng)的開發(fā),并為其它應(yīng)用 系統(tǒng)和系統(tǒng)提供了豐富的互操作性。
Nginx是一款輕量級的Web服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng)。
緩存是現(xiàn)在系統(tǒng)中必不可少的模塊,并且已經(jīng)成為了高并發(fā)高性能架構(gòu)的一個關(guān)鍵組件。緩存的主要作用:提升性能和緩解數(shù)據(jù)庫壓力,
Redis是一個開源的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲,用作數(shù)據(jù)庫、緩存和消息代理。提供諸如字符串、哈希、列表、集合、帶范圍查詢的排序集合、位圖、超日志、地理空間索引和流等數(shù)據(jù)結(jié)構(gòu)。具有內(nèi)置的復(fù)制、Lua腳本、LRU逐出、事務(wù)和不同級別的磁盤持久性,并通過Redis Sentinel和Redis Cluster的自動分區(qū)提供高可用性。
MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。
Memcached是一個自由開源的,高性能,分布式內(nèi)存對象緩存系統(tǒng),用來提高Web應(yīng)用擴(kuò)展性的重要因素。是一個基于內(nèi)存的key-value存儲,用來存儲小塊的任意數(shù)據(jù)(字符串、對象)。簡潔而強(qiáng)大,它的簡潔設(shè)計(jì)便于快速開發(fā),減輕開發(fā)難度,解決了大數(shù)據(jù)量緩存的很多問題。一般的使用目的是,通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。
差異性我就不多說了,簡單說下他們的使用場景:
Solr是一個獨(dú)立的企業(yè)級搜索應(yīng)用服務(wù)器,它對外提供類似于Web-service的API接口。用戶可以通過http請求,向搜索引擎服務(wù)器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,并得到XML格式的返回結(jié)果。
Elasticsearch是一個基于Lucene的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口
es基本是開箱即用,非常簡單,Solr略微復(fù)雜。
Solr 支持更多格式的數(shù)據(jù),比如JSON、XML、CSV,而 Elasticsearch 僅支持json文件格式。
Solr 查詢快,但更新索引時慢(即插入刪除慢),ES建立索引快(即查詢慢),即實(shí)時性查詢快。
之所以推薦ELK是因?yàn)槊鎸Ψ植际轿⒎?wù)情況下,會顯示出他的威力,不管是數(shù)據(jù)收集、數(shù)據(jù)處理、還是數(shù)據(jù)分析可以節(jié)約很多時間。ELK是Elasticsearch + Logstash + Kibana三個開源軟件的組合,但是通常為了提高性能需要借助kafka,利用Filebeat進(jìn)行日志收集,下面這個架構(gòu)圖是我做過的一個日志服務(wù)平臺。
說定定時任務(wù)大家可能都接觸過,例如Spring自帶的定時任務(wù)SpringTask,但是SpringTask是存在很多問題的,例如:最致命的一個問題就是一旦定時拋出異常,生命就結(jié)束,下一次不會再執(zhí)行。復(fù)雜業(yè)務(wù)中使用起來是不方便的,這里推薦兩個定時任務(wù)框架Quartz和xx-job,第三方的功能比較強(qiáng)大,好用。
Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域又一個開源項(xiàng)目,完全由Java開發(fā),可以用來執(zhí)行定時任務(wù),類似于java.util.Timer。但是相較于Timer, Quartz增加了很多功能:
XXL-JOB是一個輕量級分布式任務(wù)調(diào)度平臺,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴(kuò)展。現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用。
目前已有多家公司接入xxl-job,包括比較知名的大眾點(diǎn)評,京東,優(yōu)信二手車,北京尚德,360金融 (360),聯(lián)想集團(tuán) (聯(lián)想),易信 (網(wǎng)易)等等.... Quartz作為開源作業(yè)調(diào)度中的佼佼者,是作業(yè)調(diào)度的首選
Quartz在集群環(huán)境下只能通過API的方式對任務(wù)管理,同時,系統(tǒng)侵入性相當(dāng)嚴(yán)重,而XX-JOB可以完美解決集群下任務(wù)額管理。所以,可以根據(jù)自己業(yè)務(wù)情況選擇合適定時任務(wù)框架,
什么是配置中心?
集中將應(yīng)用系統(tǒng)中對配置信息的管理作為一個新的應(yīng)用功能模塊,區(qū)別與傳統(tǒng)的配置信息分散到系統(tǒng)各個角落方式,進(jìn)行集中統(tǒng)一管理,并且提供額外功能。尤其是在微服務(wù)架構(gòu)中,是不可或缺組件,甚至是必要組件之一。
為什么要使用配置中心?
在微服務(wù)體系中,服務(wù)的數(shù)量以及配置信息的日益增多,比如各種服務(wù)器參數(shù)配置、各種數(shù)據(jù)庫訪問參數(shù)配置、各種環(huán)境下應(yīng)用配置信息的不同、配置信息修改之后實(shí)時生效等等,傳統(tǒng)的配置文件方式或者將配置信息存放于數(shù)據(jù)庫中的方式已無法滿足開發(fā)人員對配置管理的要求。常見的配置中心中間件有:SpringCloud Config ,Nacos,apollo等。
2014年9月開源,Spring Cloud 生態(tài)組件,可以和Spring Cloud體系無縫整合,Spring Cloud Config支持通過/bus/refresh端點(diǎn)的destination參數(shù)來指定要更新配置的機(jī)器,不過整個流程不夠自動化和體系化。相對于Apollo和Nacos還是比較弱的。
2018年6月,阿里開源的配置中心,也可以做DNS和RPC的服務(wù)發(fā)現(xiàn)。Nacos使用起來相對比較簡潔,在對性能要求比較高的大規(guī)模場景更適合。此外,Nacos除了提供配置中心的功能,還提供了動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)共享與管理的功能,降低了服務(wù)化改造過程中的難度。
2016年5月,攜程開源的配置管理中心,具備規(guī)范的權(quán)限、流程治理等特性,Apollo可以直接在控制臺上點(diǎn)灰度發(fā)布指定發(fā)布機(jī)器的IP,接著再全量發(fā)布,做得比較體系化。
核心功能: Apollo和Nacos相對于Spring Cloud Config的生態(tài)支持更廣
實(shí)時推送: Nacos和Apollo在配置實(shí)時推送鏈路上是比較簡單高效的,Spring Cloud Config比較復(fù)雜。
高可用部署: Nacos的部署結(jié)構(gòu)比較簡單,運(yùn)維成本較低。Apollo部署組件較多,運(yùn)維成本比Nacos高。Spring Cloud Config生產(chǎn)高可用的成本最高。
服務(wù)器監(jiān)控是實(shí)時掌握服務(wù)器工作狀態(tài),并在需要時可以隨時調(diào)用監(jiān)控記錄進(jìn)行查看。
Spring Boot Admin用來管理和監(jiān)控Spring Boot應(yīng)用程序,通過UI來查看應(yīng)用程序的狀態(tài),例如Spring Beans,系統(tǒng)屬性,線程,http的調(diào)用情況等有限狀態(tài)。
我知道Druid更多的用途就是連接池,其實(shí)他還有一個對SQL監(jiān)控功能。
Skywalking是由國內(nèi)開源愛好者吳晟(原OneAPM工程師,目前在華為)開源并提交到Apache孵化器的產(chǎn)品,它同時吸收了Zipkin/Pinpoint/CAT的設(shè)計(jì)思路,支持非侵入式埋點(diǎn)。是一款基于分布式跟蹤的應(yīng)用程序性能監(jiān)控系統(tǒng)。另外社區(qū)還發(fā)展出了一個叫OpenTracing的組織,旨在推進(jìn)調(diào)用鏈監(jiān)控的一些規(guī)范和標(biāo)準(zhǔn)工作。
把涉及到數(shù)據(jù)庫相關(guān)或者可以作為數(shù)據(jù)倉庫的中間件都?xì)w到一起了。
Mycat是一個開源數(shù)據(jù)庫中間件,是一個實(shí)現(xiàn)了MySQL協(xié)議的的數(shù)據(jù)庫中間件服務(wù)器,我們可以把它看作是一個數(shù)據(jù)庫代理,用MySQL客戶端工具和命令行訪問Mycat,而Mycat再使用用MySQL原生(Native)協(xié)議與多個MySQL服務(wù)器通信,也可以用JDBC協(xié)議與大多數(shù)主流數(shù)據(jù)庫服務(wù)器通信,包括SQL Server、Oracle、DB2、PostgreSQL等主流數(shù)據(jù)庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲;一般地,Mycat主要用于代理MySQL數(shù)據(jù)庫,雖然它也支持去訪問其他類型的數(shù)據(jù)庫;
Mycat官網(wǎng):http://www.mycat.io/
我們先看官網(wǎng)的介紹
canal,譯意為水道/管道/溝渠,主要用途是基于 MySQL 數(shù)據(jù)庫增量日志解析,提供增量數(shù)據(jù)訂閱和消費(fèi)。
這句介紹有幾個關(guān)鍵字:增量日志,增量數(shù)據(jù)訂閱和消費(fèi)。
這里我們可以簡單地把canal理解為一個用來同步增量數(shù)據(jù)的一個工具。
接下來我們看一張官網(wǎng)提供的示意圖:
定位為輕量級Java框架,在Java的JDBC層提供的額外服務(wù)。 它使用客戶端直連數(shù)據(jù)庫,以jar包形式提供服務(wù),無需額外部署和依賴,可理解為增強(qiáng)版的JDBC驅(qū)動,完全兼容JDBC和各種ORM框架。
主要功能
ZooKeeper是Hadoop的正式子項(xiàng)目,它是一個針對大型分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng),提供的功能包括:配置維護(hù)、名字服務(wù)、分布式同步、組服務(wù)等。ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯的關(guān)鍵服務(wù),將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。
這個事務(wù)更多指的是分布式事務(wù)處理插件。
Apache ShardingSphere(Incubator) 是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(規(guī)劃中)這3款相互獨(dú)立,卻又能夠混合部署配合使用的產(chǎn)品組成。它們均提供標(biāo)準(zhǔn)化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫治理功能,可適用于如Java同構(gòu)、異構(gòu)語言、容器、云原生等各種多樣化的應(yīng)用場景。
Seata 是 Simple Extensible Autonomous Transaction Architecture 的簡寫,由 feascar 改名而來。是阿里開源的分布式事務(wù)框架,屬于二階段提交模式。
消息隊(duì)列是一個存放消息的容器,當(dāng)我們需要使用消息的時候可以取出消息供自己使用。消息隊(duì)列是分布式系統(tǒng)中重要的組件,使用消息隊(duì)列主要是為了通過異步處理提高系統(tǒng)性能和削峰、降低系統(tǒng)耦合性。目前使用較多的消息隊(duì)列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。
1.通過異步處理提高系統(tǒng)性能(削峰、減少響應(yīng)所需時間);
2.降低系統(tǒng)耦合性;
Kafka是由Apache軟件基金會開發(fā)的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者在網(wǎng)站中的所有動作流數(shù)據(jù)。這些數(shù)據(jù)通常是由于吞吐量的要求而通過處理日志和日志聚合來解決。 對于像Hadoop一樣的日志數(shù)據(jù)和離線分析系統(tǒng),但又要求實(shí)時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的并行加載機(jī)制來統(tǒng)一線上和離線的消息處理,也是為了通過集群來提供實(shí)時的消息。
AMQP,即Advanced Message Queuing Protocol,高級消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對點(diǎn)和發(fā)布/訂閱)、可靠性、安全。 RabbitMQ是一個開源的AMQP實(shí)現(xiàn),服務(wù)器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。
ActiveMQ是一種開源的基于JMS(Java Message Servie)規(guī)范的一種消息中間件的實(shí)現(xiàn),ActiveMQ的設(shè)計(jì)目標(biāo)是提供標(biāo)準(zhǔn)的,面向消息的,能夠跨越多語言和多系統(tǒng)的應(yīng)用集成消息通信中間件。
特性 ActiveMQ RabbitMQ kafka 開發(fā)語言 java erlang scala 單機(jī)吞吐量 萬級 萬級 10萬級 時效性 ms級 us級 ms級以內(nèi) 可用性 高(主從架構(gòu)) 高(主從架構(gòu)) 非常高(分布式架構(gòu)) 功能特性 成熟的產(chǎn)品,在很多公司得到應(yīng)用;有較多的文檔;各種協(xié)議支持較好 基于erlang開發(fā),所以并發(fā)能力很強(qiáng),性能極其好,延時很低;管理界面較豐富 只支持主要的MQ功能,像一些消息查詢,消息回溯等功能沒有提供,畢竟是為大數(shù)據(jù)準(zhǔn)備的,在大數(shù)據(jù)領(lǐng)域應(yīng)用廣。
該數(shù)據(jù)庫主要是指關(guān)系型數(shù)據(jù)庫,是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫,數(shù)據(jù)庫是存放數(shù)據(jù)的倉庫,是一個系統(tǒng)或者軟件必不可少的一部分。每個數(shù)據(jù)庫都有一個或多個不同的 API 用于創(chuàng)建,訪問,管理,搜索和復(fù)制所保存的數(shù)據(jù)。我們也可以將數(shù)據(jù)存儲在文件中,但是在文件中讀寫數(shù)據(jù)速度相對較慢。
所以,現(xiàn)在我們使用關(guān)系型數(shù)據(jù)庫管理系統(tǒng)來存儲和管理大數(shù)據(jù)量。所謂的關(guān)系型數(shù)據(jù)庫,是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)。
關(guān)系數(shù)據(jù)庫管理系統(tǒng)的特點(diǎn):
常見的數(shù)據(jù)管理系統(tǒng)主要有:oracle、mysql、SQL Server、access、TiDB。
Oracle Database,簡稱 Oracle。Oracle 數(shù)據(jù)庫系統(tǒng)是美國 Oracle 公司(甲骨文)提供的以分布式數(shù)據(jù)庫為核心的一組軟件產(chǎn)品,是目前最流行的客戶/服務(wù)器(client/server)的數(shù)據(jù)庫之一。Oracle 數(shù)據(jù)庫是目前世界上使用最為廣泛的數(shù)據(jù)庫管理系統(tǒng),作為一個通用的數(shù)據(jù)庫系統(tǒng),它具有完整的數(shù)據(jù)管理功能;作為一個關(guān)系型數(shù)據(jù)庫,它是一個完備關(guān)系的產(chǎn)品;作為分布式數(shù)據(jù)庫它實(shí)現(xiàn)了分布式處理功能,但它的所有知識,只要在一種機(jī)型上學(xué)習(xí)了Oracle知識,便能在各種類型的機(jī)器上使用它。
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。目前也是Oracle 公司來托管。
美國Microsoft公司推出的一種關(guān)系型數(shù)據(jù)庫系統(tǒng)。SQL Server是一個可擴(kuò)展的、高性能的、為分布式客戶機(jī)/服務(wù)器計(jì)算所設(shè)計(jì)的數(shù)據(jù)庫管理系統(tǒng),實(shí)現(xiàn)了與WindowsNT的有機(jī)結(jié)合,提供了基于事務(wù)的企業(yè)級信息管理系統(tǒng)方案。
Access是微軟把數(shù)據(jù)庫引擎的圖形用戶界面和軟件開發(fā)工具結(jié)合在一起的一個數(shù)據(jù)庫管理系統(tǒng)。它是微軟OFFICE的一個成員, 在包括專業(yè)版和更高版本的office版本里面被單獨(dú)出售。
TiDB 是 PingCAP 公司自主設(shè)計(jì)、研發(fā)的開源分布式關(guān)系型數(shù)據(jù)庫,是一款同時支持在線事務(wù)處理與在線分析處理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式數(shù)據(jù)庫產(chǎn)品,具備水平擴(kuò)容或者縮容、金融級高可用、實(shí)時 HTAP、云原生的分布式數(shù)據(jù)庫、兼容 MySQL 5.7 協(xié)議和 MySQL 生態(tài)等重要特性。目標(biāo)是為用戶提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解決方案。TiDB 適合高可用、強(qiáng)一致要求較高、數(shù)據(jù)規(guī)模較大等各種應(yīng)用場景。
上面這幾個數(shù)據(jù)庫優(yōu)缺點(diǎn)都比較明顯,不在啰嗦了,大家在工作中可以根據(jù)自己實(shí)際情況選擇合適的數(shù)據(jù)。
IntelliJ在業(yè)界被公認(rèn)為最好的java開發(fā)工具,尤其在智能代碼助手、代碼自動提示、重構(gòu)、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設(shè)計(jì)等方面的功能可以說是超常的。IDEA是JetBrains公司的產(chǎn)品,這家公司總部位于捷克共和國的首都布拉格,開發(fā)人員以嚴(yán)謹(jǐn)著稱的東歐程序員為主。它的旗艦版本還支持HTML,CSS,PHP,MySQL,Python等。免費(fèi)版只支持Java,Kotlin等少數(shù)語言。
Eclipse 是一個開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺, 是 Java 的集成開發(fā)環(huán)境(IDE),當(dāng)然 Eclipse 也可以作為其他開發(fā)語言的集成開發(fā)環(huán)境,如C,C++,PHP,和 Ruby 等。
MyEclipse,是在Eclipse 基礎(chǔ)上加上自己的插件開發(fā)而成的功能強(qiáng)大的企業(yè)級集成開發(fā)環(huán)境,主要用于Java、Java EE以及移動應(yīng)用的開發(fā)。在最新版本的MyEclipse中,配合CodeMix使用支持也十分廣泛,尤其是對各種開源產(chǎn)品和主流開發(fā)框架的支持相當(dāng)不錯。目前已支持PHP、Python、Vue、Angular、React、Java、Java EE等語言和框架開發(fā)。
這三款工具好壞我也不做任何評價(jià),每個工具用戶都不少,我周圍IntelliJ IDEA和MyEclipse都有,我個人比較喜歡用IntelliJ IDEA。
常見的版本空間工具svn和git
TortoiseSVN 是 Subversion 版本控制系統(tǒng)的一個免費(fèi)開源客戶端,可以超越時間的管理文件和目錄。文件保存在中央版本庫,除了能記住文件和目錄的每次修改以外,版本庫非常像普通的文件服務(wù)器。你可以將文件恢復(fù)到過去的版本,并且可以通過檢查歷史知道數(shù)據(jù)做了哪些修改,誰做的修改。這就是為什么許多人將 Subversion 和版本控制系統(tǒng)看作一種“時間機(jī)器”。
Git 是用于Linux內(nèi)核開發(fā)的版本控制工具。與常用的版本控制工具 Subversion 不同,它采用了分布式版本庫的方式,不必服務(wù)器端軟件支持,代碼的發(fā)布和交流極其方便。 Git 的速度很快,這樣的大項(xiàng)目來說自然很重要。 Git 最為出色的是它的合并跟蹤(merge tracing)能力。
SVN的特點(diǎn)是簡單,只是需要一個放代碼的地方時用是OK的。
Git的特點(diǎn)版本控制可以不依賴網(wǎng)絡(luò)做任何事情,對分支和合并有更好的支持(這應(yīng)該算是開發(fā)者最關(guān)心的地方)。
Navicat是一套快速、可靠并價(jià)格相當(dāng)便宜的數(shù)據(jù)庫管理工具,專為簡化數(shù)據(jù)庫的管理及降低系統(tǒng)管理成本而設(shè)。它的設(shè)計(jì)符合數(shù)據(jù)庫管理員、開發(fā)人員及中小企業(yè)的需要。Navicat 是以直覺化的圖形用戶界面而建的,讓你可以以安全并且簡單的方式創(chuàng)建、組織、訪問并共用信息。
PL/SQL Developer是一個集成開發(fā)環(huán)境,專門開發(fā)面向Oracle數(shù)據(jù)庫的應(yīng)用。PL/SQL也是一種程序語言,叫做過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle數(shù)據(jù)庫對SQL語句的擴(kuò)展。在普通SQL語句的使用上增加了編程語言的特點(diǎn),所以PL/SQL把數(shù)據(jù)操作和查詢語句組織在PL/SQL代碼的過程性單元中,通過邏輯判斷、循環(huán)等操作實(shí)現(xiàn)復(fù)雜的功能或者計(jì)算,PL/SQL 只有 Oracle 數(shù)據(jù)庫有。
Redis Desktop Manager是一款windows平臺下的可視化redis數(shù)據(jù)庫桌面管理工具,使用它你可以查看、刪除、修改你的redis數(shù)據(jù)庫數(shù)據(jù)!
XShell是一個強(qiáng)大的安全終端模擬軟件,它支持SSH1,SSH2,以及Microsoft Windows平臺的TELNET協(xié)議。 XShell可以在Windows界面下用來訪問遠(yuǎn)端不同系統(tǒng)下的服務(wù)器,從而比較好的達(dá)到遠(yuǎn)程控制終端的目的。
寶塔面板是一個可以安裝在服務(wù)器上的集成環(huán)境,并配套了web管理面板,可以在瀏覽器上直接控制你的服務(wù)器,非常方便。 可以一鍵創(chuàng)建網(wǎng)站、FTP、數(shù)據(jù)庫、SSL;安全管理,計(jì)劃任務(wù),文件管理,PHP多版本共存及切換;自帶基礎(chǔ)網(wǎng)站環(huán)境,支持windows系統(tǒng)(apache)和linux系統(tǒng)(apache或nginx)。
Secure CRT 是一款SSH客戶端軟件,通過使用內(nèi)含的VCP命令行程序可以進(jìn)行加密文件的傳輸。
Postman一款非常流行的API調(diào)試工具。其實(shí),開發(fā)人員用的更多。因?yàn)闇y試人員做接口測試會有更多選擇,例如Jmeter、soapUI等。不過,對于開發(fā)過程中去調(diào)試接口,Postman確實(shí)足夠的簡單方便,而且功能強(qiáng)大。
Typora+PicGo,最好用的Markdown+最好用的圖床工具!如果寫博客的可以收藏起來。
Notepad++中文版是程序員必備的文本編輯器,Notepad++中文版小巧高效,支持27種編程語言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS 等,Notepad++中文版編輯器可完美地取代微軟的記事本。
Office Visio 是Office軟件系列中的負(fù)責(zé)繪制流程圖和示意圖的軟件,是一款便于IT和商務(wù)人員就復(fù)雜信息、系統(tǒng)和流程進(jìn)行可視化處理、分析和交流的軟件。使用具有專業(yè)外觀的 Office Visio 圖表,可以促進(jìn)對系統(tǒng)和流程的了解,深入了解復(fù)雜信息并利用這些知識做出更好的業(yè)務(wù)決策。常見軟件架構(gòu)、流程圖都可以在里面完成。
ProcessOn是一個在線作圖工具的聚合平臺, 它可以在線畫流程圖、思維導(dǎo)圖、UI原型圖、UML、網(wǎng)絡(luò)拓?fù)鋱D、組織結(jié)構(gòu)圖等等, 您無需擔(dān)心下載和更新的問題,不管Mac還是Windows,一個瀏覽器就可以隨時隨地的發(fā)揮創(chuàng)意,規(guī)劃工作。
官網(wǎng):https://www.processon.com/
owerDesigner是一款非常全面的數(shù)據(jù)庫設(shè)計(jì)工具。使用PowerDesigner可以快速創(chuàng)建表,支持表與表之間建立關(guān)系,界面簡潔,功能強(qiáng)大。同時支持將sql腳本導(dǎo)出,多種導(dǎo)出類型任意挑選,簡單實(shí)用。
XMind 是一個全功能的思維導(dǎo)圖和頭腦風(fēng)暴軟件,為激發(fā)靈感和創(chuàng)意而生。作為一款有效提升工作和生活效率的生產(chǎn)力工具,受到全球百千萬用戶的青睞。
說到 iReport 不得不先介紹 Jasperreport,Jasperreport 是一個報(bào)表制作程序,用戶需要按照它制定的規(guī)則編寫一個 XML 文件,然后得到用戶需要輸出的格式文件。它支持輸出的文件格式包括 PDF,HTML,XML,XLS,CVS 等等。而 iReport 就是一個制作 Jasperreport 的 XML 文件的可視化開發(fā)工具。
Google Chrome是一款由Google公司開發(fā)的網(wǎng)頁瀏覽器,該瀏覽器基于其他開源軟件撰寫,包括WebKit,目標(biāo)是提升穩(wěn)定性、速度和安全性,并創(chuàng)造出簡單且有效率的使用者界面。
搜狗瀏覽器 由搜狗公司開發(fā),基于谷歌chromium內(nèi)核,力求為用戶提供跨終端無縫使用體驗(yàn),讓上網(wǎng)更簡單、網(wǎng)頁閱讀更流暢的瀏覽器。
Mozilla Firefox,中文俗稱“火狐”,是一個由Mozilla開發(fā)的自由及開放源代碼的網(wǎng)頁瀏覽器。其使用Gecko排版引擎,支持多種操作系統(tǒng),如Windows、macOS及GNU/Linux等
Internet Explorer(簡稱:IE)是微軟公司微軟公司推出的一款網(wǎng)頁瀏覽器。原稱Microsoft Internet Explorer(6版本以前)和Windows Internet Explorer(7、8、9、10、11版本)。在IE7以前,中文直譯為“網(wǎng)絡(luò)探路者”,但在IE7以后官方便直接俗稱"IE瀏覽器"。
如果做前端開發(fā),這幾款瀏覽器兼容性都得兼顧。很早之前IE瀏覽器市場是比較大,隨著時間推移,谷歌瀏覽器占據(jù)了比較大的市場。我個人日常開發(fā)中谷歌用的比較多,特殊情況才會使用其它瀏覽器。
JMeter是Apache組織開發(fā)的基于Java的壓力測試工具。用于對軟件做壓力測試,它最初被設(shè)計(jì)用于Web應(yīng)用測試,但后來擴(kuò)展到其他測試領(lǐng)域。 它可以用于測試靜態(tài)和動態(tài)資源,例如靜態(tài)文件、Java 服務(wù)程序、CGI 腳本、Java 對象、數(shù)據(jù)庫, 等等。
apache bench簡稱ab,它是apache自帶的壓力測試工具。ab非常實(shí)用,它不僅可以對apache服務(wù)器進(jìn)行網(wǎng)站訪問壓力測試,也可以對或其它類型的服務(wù)器進(jìn)行壓力測試。
MAT是Java堆內(nèi)存分析工具,可從http://www.eclipse.org/mat/中下載。
你在成為大神的路上都學(xué)習(xí)了哪些技術(shù),歡迎留言交流。
對程序員的有狀態(tài)模型,針對用戶的無狀態(tài)體驗(yàn)
一般的 Web 開發(fā)有時候很有趣,但是通常卻是令人煩惱的。Java Web 開發(fā)人員要花費(fèi)很長時間來提供無狀態(tài)模型,但是產(chǎn)生的性能和部署的簡單性使得這種努力是值得的。在本文中,我將討論一種完全不同的 Web 開發(fā)方式,稱為延續(xù)服務(wù)器(continuation server)。延續(xù)服務(wù)器提供了一個有狀態(tài)的編程模型,同時又沒有舍棄無狀態(tài)所固有的可伸縮性,從而使 Web 應(yīng)用程序開發(fā)更加容易。
Web 的出現(xiàn)
當(dāng) 20 世紀(jì) 90 年代中期整個行業(yè)轉(zhuǎn)向 Web 開發(fā)時,軟件開發(fā)人員們欣喜若狂。與 “終端加主機(jī)” 模式相比,我們現(xiàn)在構(gòu)建的客戶機(jī)-服務(wù)器應(yīng)用程序?qū)τ脩舾押茫且灿袔讉€問題困擾著我們:
客戶機(jī)-服務(wù)器計(jì)算仍然向前發(fā)展。公司常常是根據(jù)比較低的軟件和硬件開銷來做出財(cái)務(wù)決策,但是在進(jìn)入生產(chǎn)階段之后管理開銷會大大增加。到了 1995 年,客戶機(jī)-服務(wù)器模型需要進(jìn)行重大的改進(jìn),而且這種改進(jìn)確實(shí)出現(xiàn)了。
進(jìn)入 Web 開發(fā)
Web 開發(fā)在 20 世紀(jì) 90 年代中期迅速發(fā)展起來。由于 Java 語言的出現(xiàn),開發(fā)人員可以用新功能來構(gòu)建分布式 Web 應(yīng)用程序,同時解決了最嚴(yán)重的客戶機(jī)-服務(wù)器問題。這些新功能包括:
性能、可伸縮性、可管理性和可移植性都大大提高了,互聯(lián)網(wǎng)革命因此進(jìn)入了快車道。但是,您必須面對一些重要的問題。
不是烏托邦
無狀態(tài)(stateless)這個簡單的單詞將沉重的負(fù)擔(dān)從系統(tǒng)轉(zhuǎn)移到了開發(fā)人員身上。其后果是不容質(zhì)疑的:盡管由于不必為每個用戶維護(hù)一個服務(wù)(或 servlet),而獲得了很好的可伸縮性;但是,對狀態(tài)進(jìn)行管理的責(zé)任從編程語言轉(zhuǎn)移到了開發(fā)人員身上。目前,可以將 Web 開發(fā)看成一系列無狀態(tài)的請求,見圖 1:
圖 1. Web 應(yīng)用程序由請求/響應(yīng)對組成
采用這種模型,瀏覽器得到了嚴(yán)格控制。應(yīng)用程序只對瀏覽器發(fā)出的請求進(jìn)行響應(yīng)。如果請求是小型的獨(dú)立請求,那么這個模型是有效的;但不幸的是,對于驅(qū)動有多個應(yīng)用組成部分的 Web 應(yīng)用程序,它是不合適的。最常見的例子是在線購物。點(diǎn)擊 Submit 按鈕兩次,常常會意外地重復(fù)訂購?fù)簧唐贰R院螽?dāng)您發(fā)現(xiàn)購物車中有重復(fù)的商品時會大感意外。
向用戶提供有狀態(tài)體驗(yàn)的方法通常是:將與一次交談相關(guān)的所有數(shù)據(jù)放進(jìn)一個會話中,并用 cookie、隱藏字段或 URL 變量在客戶機(jī)上標(biāo)識用戶會話。對于每個新的請求,必須依次執(zhí)行以下步驟:
我對這個問題說得太輕描淡寫了,因?yàn)槭褂脽o狀態(tài)模型來模擬有狀態(tài)應(yīng)用程序可能造成更嚴(yán)重的問題。最嚴(yán)重的問題從 Web 開發(fā)剛出現(xiàn)時就存在了,就是如何處理 Back 按鈕。
老問題的新答案
在 Web 開發(fā)中,可以利用有狀態(tài)模型為用戶提供無狀態(tài)體驗(yàn)。您聽到這種說法可能會感到震驚。實(shí)際上,在 Hackers and Painters(參見 參考資料)中,Paul Graham 就討論了早在 1995 年在 ViaWeb 中使用的底層方法。這種方法使用一種稱為延續(xù)(continuation) 的編程控制結(jié)構(gòu)。
基本思想是:可以讓編程框架在請求之前裝載應(yīng)用程序的狀態(tài),并在每個請求之后保存應(yīng)用程序的狀態(tài)。我首先介紹一下 Ruby 編程語言中的延續(xù)。
一個 Ruby 示例
如果希望執(zhí)行代碼,請安裝 Ruby 并輸入 irb。通過在 > 字符后面輸入命令,定義一個稱為 loop 的方法,見清單 1:
清單 1. 創(chuàng)建 loop 方法
irb(main):001:0> def loop(interrupt) irb(main):002:1> for i in 1..10 irb(main):003:2> puts "Value of i: #{i}" irb(main):004:2> callcc {|c| return c} if i==interrupt irb(main):005:2> end irb(main):006:1> end=> nil
loop 方法接受一個稱為 interrupt 的參數(shù)。它啟動一個從 1 到 i 的 for 循環(huán),打印 i 的值,然后做一些奇怪的事兒。神秘的 callcc 語句意味著用延續(xù)進(jìn)行調(diào)用。可以把延續(xù)看成在某一時間點(diǎn)上 “凍結(jié)的” 程序狀態(tài)。Ruby 調(diào)用花括號中的代碼塊,同時傳遞一個延續(xù)對象。花括號中的代碼是一個閉包,它僅僅是傳遞給 callcc 的代碼塊。最終結(jié)果是,callcc 捕獲執(zhí)行的狀態(tài)并將結(jié)果存儲在 c 中。現(xiàn)在,可以調(diào)用這個方法并在循環(huán)的任意位置中斷執(zhí)行,這會捕獲程序的狀態(tài)。在以后,可以恢復(fù)狀態(tài)。
現(xiàn)在,執(zhí)行這個方法兩次,見清單 2:
清單 2. 執(zhí)行 loop 方法
irb(main):007:0> cont=loop 5 Value of i: 1 Value of i: 2 Value of i: 3 Value of i: 4 Value of i: 5=> #<Continuation:0x2b5a358> irb(main):008:0> cont.call Value of i: 6 Value of i: 7 Value of i: 8 Value of i: 9 Value of i: 10=> 1 10 irb(main):009:0> cont=loop 8 Value of i: 1 Value of i: 2 Value of i: 3 Value of i: 4 Value of i: 5 Value of i: 6 Value of i: 7 Value of i: 8=> #<Continuation:0x2b562f0> irb(main):010:0> cont.call Value of i: 9 Value of i: 10
每次執(zhí)行調(diào)用時,延續(xù)會獲得執(zhí)行的狀態(tài)。所以,使用延續(xù)的 Web 開發(fā)框架可以在處理每個請求之后捕獲一個延續(xù),并用一個標(biāo)識符將它存儲在會話中。然后,框架可以在處理每個新請求之前從會話中恢復(fù)延續(xù),采用的方法與存儲用戶數(shù)據(jù)一樣。
優(yōu)點(diǎn)和缺點(diǎn)
延續(xù)服務(wù)器方式在許多方面都很出色 —— 有狀態(tài)的編程模型和具有無狀態(tài)性能的用戶體驗(yàn)。這種方式的優(yōu)點(diǎn)如下:
延續(xù)大大簡化了 Web 開發(fā)模型。有了延續(xù),就可以將 Web 應(yīng)用程序看成具有一系列請求的應(yīng)用程序,能夠提供更多的用戶信息。圖 2 給出了修改后的應(yīng)用程序流。在用戶啟動應(yīng)用程序之后,Web 服務(wù)器處于控制之中。應(yīng)用程序不再是應(yīng)付以任意次序到達(dá)的任意請求,而是變成了與一個用戶進(jìn)行統(tǒng)一且直接的交談。
圖 2. 延續(xù)支持更自然的應(yīng)用程序流
與許多高階抽象相似,延續(xù)也有缺點(diǎn)。這些缺點(diǎn)將影響依賴于延續(xù)的整體方式。延續(xù)服務(wù)器必須解決下面這些常見問題:
總的來說,我相信延續(xù)代表著一種重大的技術(shù)進(jìn)步,在不久的將來您可能會看到流行的延續(xù)服務(wù)器實(shí)現(xiàn)。現(xiàn)在我們來看看其他語言中的某些實(shí)現(xiàn),然后我展示一些具體的細(xì)節(jié)。
其他語言中的實(shí)現(xiàn)
有好幾種語言都具有基于延續(xù)的方法(參見 參考資料 中的鏈接以了解關(guān)于它們的更多信息)。最常見的實(shí)現(xiàn)是用 Lisp、Ruby 和 Smalltalk 編寫的。
還有一些沒有在這里列出的延續(xù)服務(wù)器。目前,大多數(shù)延續(xù)服務(wù)器實(shí)現(xiàn)是用支持延續(xù)的語言編寫的,而這些語言不是主流語言。但是,以后的情況可能會不一樣。
Java 語言中的延續(xù)服務(wù)器
Java 開發(fā)人員正在注意到基于延續(xù)的方式對構(gòu)建 Web 框架的好處,但是 Java 語言不支持本機(jī)延續(xù)。如果您的語言不支持延續(xù),那么就只有幾種辦法了:模擬延續(xù)、將延續(xù)添加到現(xiàn)有的語言中或者選用另一種語言。不同的 Java 框架(參見 參考資料)采用了不同的辦法:
模擬本機(jī)延續(xù)
不一定非使用延續(xù)來捕獲執(zhí)行狀態(tài)。暫停的線程和狀態(tài)機(jī)都可以捕獲執(zhí)行狀態(tài)。線程化方式簡單地凍結(jié)并存儲現(xiàn)有的線程。這種方式有一點(diǎn)兒受限制,因?yàn)樗惶峁o狀態(tài)性能 —— 實(shí)際上是為每個用戶使用一個單獨(dú)的線程。
但是,狀態(tài)機(jī)(state machine)是不錯的延續(xù)方式。狀態(tài)機(jī)是一種定義了狀態(tài)之間的轉(zhuǎn)換的程序。到目前為止,具有延續(xù)服務(wù)器特征的最流行的 Java 框架是 Spring 的 Web Flow。Web Flow 采用狀態(tài)機(jī)形式對用戶界面頁面之間的導(dǎo)航進(jìn)行建模。Web Flow 可以將程序流建模成 Java 對象,但是常常使用 XML 來描述程序流。請考慮清單 3 中來自 Web Flow 教程(參見 參考資料)的程序流表示:
清單 3. Web Flow 程序流表示
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webflow PUBLIC "-//SPRING//DTD WEBFLOW//EN" "http://www.springframework.org/dtd/spring-webflow.dtd"> <webflow id="myFlow" start-state="displayForm"> <view-state id="displayForm" view="form"> <entry> <action bean="myFlowAction" method="setupForm"/> </entry> <transition on="submit" to="processSubmit"> <action bean="myFlowAction" method="bindAndValidate"/> </transition> </view-state> <action-state id="processSubmit"> <action bean="myFlowAction"/> <transition on="success" to="finish"/> </action-state> <end-state id="finish" view="success"/> </webflow>
這個流程有三個核心狀態(tài):displayForm、processSubmit 和 finish。這個程序流定義了使機(jī)器從一個狀態(tài)轉(zhuǎn)換到下一個狀態(tài)的動作。例如,submit 將狀態(tài)從 displayForm 轉(zhuǎn)換到 processSubmit。Web Flow 在典型的模型-視圖-控制器級別上操作。可以使用許多不同的視圖技術(shù)來顯示表單。
當(dāng)從一個狀態(tài)轉(zhuǎn)換到下一個狀態(tài)時,框架自動捕獲當(dāng)前狀態(tài),包括所有實(shí)例變量。這樣就可以獲得與其他延續(xù)服務(wù)器一樣的 Back 按鈕支持和有狀態(tài)編程模型。這種方式不使用本機(jī)延續(xù),但是具有延續(xù)服務(wù)器的許多優(yōu)點(diǎn),還有其他一些優(yōu)點(diǎn):
其他語言
Cocoon 使用 Rhino,這是一種插入到 JVM 中的 JavaScript 虛擬機(jī)。Cocoon 控制器使用一個修改過的 Rhino 版本來表達(dá)延續(xù),所以 Cocoon 允許用 Java 或 JavaScript 來表達(dá)控制器邏輯。請考慮清單 4 中來自 Cocoon 教程的應(yīng)用程序(參見 參考資料):
清單 4. 使用 Cocoon
try { if (operator=="plus") cocoon.sendPage("result.html", {result: a + b}); else if (operator=="minus") cocoon.sendPage("result.html", {result: a - b}); else if (operator=="multiply") cocoon.sendPage("result.html", {result: a * b}); else if (operator=="divide") cocoon.sendPage("result.html", {result: a / b}); else cocoon.sendPage("invalidOperator.html", {operator: operator}); } catch (e) { cocoon.sendPage("error.html", {message: "Operation failed: " + e.toString()}); }
注意清單 4 中的 sendPage 方法。這個方法將一個頁面發(fā)送給用戶。這里沒有支持 Back 按鈕或者將用戶數(shù)據(jù)保存到會話中所需的冗長代碼 —— 這些都封裝在 Cocoon 的框架中了。
實(shí)現(xiàn)延續(xù)
RIFE 框架實(shí)現(xiàn)它自己的延續(xù),而 WebWork 框架使用 RIFE 的延續(xù)實(shí)現(xiàn)。Jetty 6 也包含一個用 Java 編寫的延續(xù)實(shí)現(xiàn)。清單 5 給出了一個來自 RIFE 教程的例子,這個例子是一個猜數(shù)字游戲:
清單 5. RIFE 示例
while (mGuess !=answer) { print(template); pause(); guesses++; if (answer < mGuess) { template.setBlock("indication", "lower"); } else if (answer > mGuess).{ template.setBlock("indication", "higher"); } }
在這個例子中,pause() 方法捕獲延續(xù)并將模板發(fā)送回用戶供操作。RIFE 使延續(xù)變得很簡單,一般的 Web 開發(fā)人員也能夠使用延續(xù)。
不遠(yuǎn)的將來
您可以看到,延續(xù)是 Web 開發(fā)框架中一項(xiàng)真正的技術(shù)進(jìn)步。利用這種方式,可以獲得更高的生產(chǎn)效率。另外,因?yàn)椴捎弥庇^的 Java 代碼(而不是數(shù)百個互不相連的 servlet)來表達(dá) Web 應(yīng)用程序,應(yīng)用程序更容易理解和維護(hù)。
Web 開發(fā)方面新的發(fā)展使延續(xù)方式變得越來越重要。Ajax 應(yīng)用程序可以異步地獲得 Web 頁面的一小部分并將結(jié)果編織進(jìn)現(xiàn)有的頁面中,而不是用傳統(tǒng)的請求/響應(yīng)模型來獲得整個 Web 頁面。但是 Ajax 應(yīng)用程序可能會迫使應(yīng)用程序長期維持與用戶的連接,這樣應(yīng)用程序才能進(jìn)行響應(yīng)并使?fàn)顟B(tài)跟蹤代碼比較容易編寫。這種做法破壞了無狀態(tài)編程的優(yōu)勢,因?yàn)樾枰獮槊總€連接的用戶占用一定的資源。有了延續(xù),就可以在延續(xù)中保存狀態(tài)并根據(jù)需要恢復(fù)狀態(tài)。
在不遠(yuǎn)的將來,硬件的改進(jìn)會使延續(xù)所增加的資源消耗變得無足輕重。如果不經(jīng)過徹底的革新,Web 開發(fā)框架仍然會太復(fù)雜。Ajax 會使 Web 開發(fā)更加復(fù)雜。這些因素都會促使人們接受延續(xù)服務(wù)器。在兩年內(nèi),大多數(shù)新的 Web 開發(fā)將會使用某種延續(xù)服務(wù)器或延續(xù)的模擬。
下一次,我將談?wù)勵I(lǐng)域特定的語言以及它們在 Ruby on Rails 中的作用。然后將介紹一些思想,向您說明在 Java 編程中領(lǐng)域特定的語言的影響。
Spring是一個解決了許多在J2EE開發(fā)中常見的問題的強(qiáng)大框架。
Spring提供了管理業(yè)務(wù)對象的一致方法,并且鼓勵了注入對接口編程而不是對類編程的良好習(xí)慣。
WebWork是由OpenSymphony組織開發(fā)的,致力于組件化和代碼重用的拉出式MVC模式J2EE Web框架。
在WebWork2.2中添加了對AJAX的支持,這個支持是構(gòu)建在DWR與Dojo這兩個框架的基礎(chǔ)之上.
Struts是一個基于Sun J2EE平臺的MVC框架。
Struts把Servlet、JSP、自定義標(biāo)簽和信息資源(message resources)整合到一個統(tǒng)一的框架中,開發(fā)人員利用其進(jìn)行開發(fā)時不用再自己編碼實(shí)現(xiàn)全套MVC模式,極大的節(jié)省了時間。
Tapestry是一個開源的基于servlet的應(yīng)用程序框架,它使用組件對象模型來創(chuàng)建動態(tài)的,交互的web應(yīng)用。Tapestry使得java代碼與html完全分離,利用這個框架開發(fā)大型應(yīng)用變得輕而易舉。并且開發(fā)的應(yīng)用很容易維護(hù)和升級。
Tapestry支持本地化,其錯誤報(bào)告也很詳細(xì)。
Tapestry主要利用javabean和xml技術(shù)進(jìn)行開發(fā)。
Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。
Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序?qū)嵱茫部梢栽赟ervlet/JSP的Web應(yīng)用中使用。
Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域又一個開源項(xiàng)目,它可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨(dú)使用。
Quartz可以用來創(chuàng)建簡單或?yàn)檫\(yùn)行十個,百個,甚至是好幾萬個Jobs這樣復(fù)雜的日程序表。
Velocity是一個基于java的模板引擎。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。
當(dāng)Velocity應(yīng)用于web開發(fā)時,界面設(shè)計(jì)人員可以和java程序開發(fā)人員同步開發(fā)一個遵循MVC架構(gòu)的web站點(diǎn)。
使用ibatis 提供的ORM機(jī)制,對業(yè)務(wù)邏輯實(shí)現(xiàn)人員而言,面對的是純粹的Java對象。
相對Hibernate等 “全自動”O(jiān)RM機(jī)制而言,ibatis 以SQL開發(fā)的工作量和數(shù)據(jù)庫移植性上的讓步,為系統(tǒng)設(shè)計(jì)提供了更大的自由空間。
最后
為幫助那些往想互聯(lián)網(wǎng)方向轉(zhuǎn)行想學(xué)習(xí),卻因?yàn)闀r間不夠,資源不足而放棄的人。我搜集整理了一套完整的IT學(xué)習(xí)資料,包括Java、SEO優(yōu)化、Python入門書籍等等等,比自己在網(wǎng)上零散收集的結(jié)構(gòu)性和連貫性更強(qiáng),只為幫助那些想學(xué)習(xí)的人!需要的同學(xué)可私信!私信!回復(fù)“學(xué)習(xí)”
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。