Ⅰ 為什麼大型網站前端使用 PHP 後台邏輯用 Java
從這幾個方面看
一、運行機制:
Java代碼被編譯成位元組碼後,會在虛擬機里由JIT進行二次編譯成為本地碼,據傳言其執行速度可以和C++相媲美,經過我自己測試,用Java實現一個簡單的Memcache協議的緩存伺服器,在Java 1.6下運行,和memcache本身相比,同樣數據量的存取時間比大概是3:2,雖然有差距,但是比想像的要好很茄舉滲多。Java 1.7在JIT方面做了大量的改進,性能比Java 1.6還要好。
PHP是直接對文本代碼進行解釋執行,即便有opcode緩存技術,仍然有不可逾越的性能鴻溝。PHP的opcode類似於java的class位元組碼,仍是解釋執行。
二、處理並發:
Java在並發處理上採取單進程多線程的方式,web應用會隨著web server的啟動而啟動,而來自web 瀏覽器的請求將被分配給線程池內的閑置線程處理,也就是說當顫脊有請求到達的時候,進程是准備好的,線程是准備好的,Java要做的僅僅是業務邏輯處理了。
PHP在並發處理上時採取多進程的方式,在web server里沒有物理的web應用概念,每個請求都相當於一個獨立的應用,而進程也隨著請求的到達才啟動,而隨著請求的結束而消亡。在Fast CGI環境下,有類似於線程池的進程池技術,對性能提高有很大的幫助。然而一方面web server和Fast cgi通訊仍需要通過socket,多出了一定的IO損耗,另一方面進程池內的進程間也很難進行通訊,所以在並發處理上仍然無法和Java相比。
三、資料庫應用:
Java可以採用資料庫連接池技術,節省下資料庫連接過程帶來的時間損失。
PHP沒有這個好處,原因來自上面的第二條。
在資料庫介面上java有JDBC,PHP有PDO,這兩個很類似。然而Java有非常多的ORM技術框架(如Hibernate)使資料庫操作變得異常簡單,而PHP的運行方式決定了它是ORM的禁區(當然也可以做ORM,只是做到什麼程度是由你對ORM帶來的性能損耗的忍受程度決定的)。
四、緩存技術
Java是單答攔進程,很多緩存可以直接在Java的heap中做,而無需藉助外在的工具,當然也有很好的緩存框架,比如Ehcache,因為沒有網路IO,所以性能非常高。
PHP多進程單線程決定了它只能藉助外來的緩存伺服器,比如Memcache.
五、熱部署
Java的熱部署能力很弱,如果希望修個BUG而不停服是很難做到的。
PHP天然熱部署。
現在明白為什麼後台邏輯用java了吧
Ⅱ 如何搭建大型網站系統
程序員們都希望能通過自己的努力學習,技術提升,拿到更好的收入,技術提升和高收入雖然不是輕易就能實現的,但總是有章可循。
一個成熟的大型網站(如淘寶、京東等)的系統架構並不是開始設計就具備完整的高性能、高可用、安全等特性,它總是隨著用戶量的增加,業務功能的擴展逐漸演變完善的,在這個過程中,開發模式、技術架構、設計思想也發生了很大的變化,就連技術人員也從幾個人發展到一個部門甚至一條產品線。所以成熟的系統架構是隨業務擴展而完善出來的,並不是一蹴而就;不同業務特徵的系統,會有各自的側重點,例如淘寶,要解決海量的商品信息的搜索、下單、支付,例如騰訊,要解決數億的用戶實時消息傳輸,網路它要處理海量的搜索請求,他們都有各自的業務特性,系統架構也有所不同。盡管如此我們也可以從這些不同的網站背景下,找出其中共用的技術,這些技術和手段可以廣泛運行在大型網站系統的架構中,下面就通過介紹大型網站系統的演化過程,來認識這些技術和手段。
一、最開始的網站架構
最初的架構,應散基用程序、資料庫、文件都部署在一台伺服器上,如圖:
二、應用、數據、文件分離
隨著業務的擴展,一台伺服器已經不能滿足性能需求,故將應用程序、資料庫、文件各自部署在獨立的伺服器上,並且根據伺服器的用途配置不同的硬體,達到最佳的性能效果。
三、利用緩存改善網站性能
在硬體優化性能的同時,同時也通過軟體進行性能優化,在大部分的網站系統中,都會利用緩存技術改善系統的性能,使用緩存主要源於熱點數據的存在,大部分網站訪問都遵循28原則(即80%的訪問請求,最終落在20%的數據上),所以我們可以對熱點數據進行緩存,減少這些數據的訪問路徑,提高用戶體驗。
緩存實現常見的方式是本地緩存、分布式緩存。當然還有CDN、反向代理等,這個後面再講。本地緩存,顧名思義是將數據緩存在應用伺服器本地,可以存在內存中,也可以存在文件,OSCache就是常用的本地緩存組件。本地緩存的特點是速度快,但沖薯謹因為本地空間有限所以緩存數據量也有限。分布式緩存的特點是,可以緩存海量的數據,並且擴展非常容易,在門戶類網站中常常被使用,速度按理沒有本地緩存快,常用的分布式緩存是Memcached、Redis。
四、使用集群改善應用伺服器性能
應用伺服器作為網站的入口,會承擔大量的請求,我們往往通過應用伺服器集群來分擔請求數。應用伺服器前面部署負載均衡伺服器調度用戶請求,根據分發策略將請求分發到多個應用伺服器節點。
常用的負載均衡技術硬體的有F5,價格比較貴,軟體的有LVS、Nginx、HAProxy。LVS是四層負載均衡,根據目標地址和埠選擇內部伺服器,Nginx是七層負載均衡和HAProxy支持四層、七層負載均衡,可以根據報文內容選擇內部伺服器,因此LVS分發路徑優於Nginx和HAProxy,性能要高些,而Nginx和HAProxy則更具配置性,如可以用來做動靜分離(根據請求報文特徵,選擇靜態資源伺服器還是應用伺服器)。
五、資料庫讀寫分離和分庫分表
隨著用戶量的增加,資料庫成為最大的瓶頸,改善資料庫性能常用的手段是進行讀寫分離以及分表,讀寫分離顧名思義就是將資料庫分為讀庫和寫庫,通過主備功能實現數據同步。分庫分表則分為水平切分和垂直切分,水平切換則是對一個資料庫特大的表進行拆分,例如用戶表。垂直切分則是根據業務不同來切換,如用戶業務、商品業務相關的表放在不同的資料庫中。
六、使用CDN和反向代理提高網站性能
假如我們的伺服器都部署在成都的機房,對於四川的用戶來說訪問是較快的,而對於北京的用戶訪問是較慢的,這是由於四川和北京分別屬於電信和聯通的不同發達地區,北京用戶訪問需要通過互聯路由器經過較長的路徑才能訪問到成都的伺服器,返迴路徑也一樣,所以數據傳輸時間比較長。對於這種情況,常常使用CDN解決,CDN將數據內容緩存到運營商的機房,用戶訪問時先從最近的運營商獲取數據,這樣大大減少了網路訪問的路徑。比較專業的CDN運營商有藍汛、網宿。
而反向代理,則是部署在網站的機房,當用戶請求達到時首先訪問反向代理伺服器,反向代理伺服器將緩存的數據返回給用戶,如果沒有沒有緩手冊存數據才會繼續走應用伺服器獲取,也減少了獲取數據的成本。反向代理有Squid,Nginx。
七、使用分布式文件系統
用戶一天天增加,業務量越來越大,產生的文件越來越多,單台的文件伺服器已經不能滿足需求。需要分布式的文件系統支撐。常用的分布式文件系統有NFS。
八、使用NoSql和搜索引擎
對於海量數據的查詢,我們使用nosql資料庫加上搜索引擎可以達到更好的性能。並不是所有的數據都要放在關系型數據中。常用的NOSQL有mongodb和redis,搜索引擎有lucene。
九、將應用伺服器進行業務拆分
隨著業務進一步擴展,應用程序變得非常臃腫,這時我們需要將應用程序進行業務拆分,如網路分為新聞、網頁、圖片等業務。每個業務應用負責相對獨立的業務運作。業務之間通過消息進行通信或者同享資料庫來實現。
十、搭建分布式服務
這時我們發現各個業務應用都會使用到一些基本的業務服務,例如用戶服務、訂單服務、支付服務、安全服務,這些服務是支撐各業務應用的基本要素。我們將這些服務抽取出來利用分部式服務框架搭建分布式服務。淘寶的Dubbo是一個不錯的選擇。
大型網站的架構是根據業務需求不斷完善的,根據不同的業務特徵會做特定的設計和考慮,本文只是講述一個常規大型網站會涉及的一些技術和手段。
如果你還有這些疑問,成熟的網站架構師需要學什麼核心技能?Java程序員如何晉升為互聯網架構師?Java語言在架構搭建中扮演什麼角色?怎樣成為年收入幾十萬的架構師?歡迎來電來訪昌平北大青鳥java培訓。
Ⅲ 如何評價「什麼值得買」網站、APP無法訪問可能的原因和影響有哪些
兩個方面去猜測
官方因素:1.App後端伺服器宕機,導致宕機原因有很多種,常見的出現嚴重bug耗光了物理機或雲服務的資源,導致系統崩潰。如死循環,不啟哪釋放io資源的讀寫操作,沒有做好負載均衡導致個別伺服器瞬間壓力過大出現集群的雪崩效應。
2.app後悄基碼端資料庫出現性能問題,導致客戶端或者網頁的遠程請求超時,這樣也會顯示同樣問題,但可以加入數據緩存,資料庫讀寫分離來規避類似問題
3.app後端系統升級,沒有做好熱部署方案。
4.app後端系統的自動擴容設計有問題,無法滿足爆發性的流量導入
5.公司機房集體斷電,且沒有兩地雙活解決方案
非官方:1.dns域名解析被鋒鬧劫持,無法解析正確的伺服器ip地址。大公司一般都會申請自己的域名,以防止雲伺服器ip切換的時,所有服務不可用現象發生
Ⅳ 如何選擇正確的Web編程語言
目前流行的Web編程語言有Java、PHP、Python、C#等,當然做Web開發也離不開Html、CSS和JavaScript,選擇編程語言主要取決於開發場景、開發周期、團隊技術組成、流行趨勢等因素。
曾經有人做過一個形象的比喻,PHP就像小埋飢區附近的便利店,Java就像沃彎卜返爾瑪,C#就像百貨商場,而Python則是網上購物,下面對這幾種Web編程語言做一個描述。
PHP是目前在Web開發領域應用最為廣泛的編程語言之一,從目前占據的開發市場份額來看,PHP要領先於Java和Python。PHP的特點是語法簡單靈活、天然熱部署、Web開發生態健全、有大量的成熟方案,採用PHP開發Web應用在開發周期上也有一定的優勢。目前PHP比較適合於中小型網站的開發,方便快捷。
JavaWeb開發是Java語言主要的應用場景之一,Java語言最大的優勢在於穩定的性能、豐富的組件和清晰的邏輯。Java語言在處理並發訪問上的優勢,使得大型商業互聯網平台往往更傾向於採用Java語言開發。另外,在大數據領域的應用也使得Java在未來的應用前景還是不錯的。雖然Java具有性能上的優勢,但是Java語言自身也偏重,在開發周期上與PHP和Python對比來說還是偏長。
Python語言也是傳統的Web開發語言之一,Python的特點就是簡單,Python語言可以使用很多現成的庫,採用Python開發Web應用往往有較短的開發周期。但是Python開發Web應用的性能還是存在一定的問題,這弊亂也是Python語言固有的問題,但是對於中小型應用來說,Python是一個不錯的選擇。
C#也是Web開發的重要方案之一,C#語言在開發Web方面最大的特點就是有成熟的方案可以套用,C#是廣大外包公司比較喜歡的語言,因為採用C#開發會降低開發風險。
Ⅳ node.js和php哪個簡單
不使用框架的話,PHP簡單些,Node的非阻塞特性,寫起來太別扭了。。使用框架的話,兩者差不多,都是傻瓜級的
但所謂簡單,要看怎麼理解。。。。如果你要做的是一個大型網站,這倆都非常難,反而是用JAVA,C#這些工業級語言簡單一些。。。。飢運所以無論PHP還是NODE,都只是對於小型網站來說,比較簡單而已。
這就像開車和騎自行車的區別。。。。學習騎自行車一定比學開車要簡單。。。如果是去菜市場買菜,當然是騎自行車更容易。。。但如果要遠行,則是開車比較容易。
如果你是隨便學學,應付眼前的工作,其實兩個都可以,但如果你打算當一輩子程序員。。做比較大的項目。。其實最後還是會轉到強類型語言上來。。到時候你也只有JAVA或者C#兩個選項而已。。所有「簡單」的語言,所適合的項目,也同樣「簡單」。。。PHP,NODE,Python,Ruby這類語言的工作崗位,幾乎都是在初創型小公司裡面。。干一兩年可以,但不適合干長期,最後還是要轉行做別的。否則等你老了,連個養老金都沒得領。。當然會有人反對,說網路用了PHP,阿里用的NODE,豆瓣用了Python等等,但那都是以偏概全,每一個大型網站,都不是只靠一種技術就可以構建起來的。。。本人已經工作11年,從C++入門,先後學了PYTHON,PHP,JAVA,C#,以及NODE.JS。。。作為一個老屌絲,說些與話題無關的肺腑之言
相比之下,NODE還沒有經過市場考驗,所以它究竟能走多遠,目前還不好說,但從技術指標上講,它比PHP的性能要好的多。。。實際測試,在大量IO的情況下,比PHP快50倍以上。。所以從這方面來看,它完全是秒殺PHP的。。。
但PHP則是目前的需求比較多,有點像WindowsXP,技術上並沒優勢,但卻有巨大的市場保有量。。而且至少在十年之內,並不會淘汰。。
所以如果你要在近幾年之內找工如氏作,PHP的工作機會多一些,NODE的機會其實幾乎是零。。。而如果你不急著找工作,NODE則更適合學習一些。。畢竟它還算是朝陽渣肢散技術,尤其是結合websocket方面,未來可能會比較有潛力。。。PHP在我看來,已經是該進入淘汰期的夕陽技術了。。只是淘汰技術不會很快而已。。最後還是重復一下之前的建議,如果你想長期搞程序,去學JAVA或C#
Ⅵ android 熱部署是什麼意思
在 Java 開發領域,熱部署一直是一個難以解決的問題,目前的 Java 虛擬機只能實現方法體的修改熱部署,對於整個類的結構修改,仍然需要重啟虛擬機,對類重新載入才能完成更新操作。對於某些大型的應用來說,每次的重啟都需要花費大量的時間成本。雖然 osgi 架構的出現,讓模塊重啟成為可能,但是如果模塊之間有調用關系的話,這樣的操作依然會讓應用出現短暫的功能性休克。本文將探索如何在不破壞 Java 虛擬機現有行為的前提下,實現某個單一類的熱部署,讓系統無需重啟就完成某個類的更新。
類載入的探索
首先談一下何為熱部署(hotswap),熱部署是在不重啟 Java 虛擬機的前提下,能自動偵測到 class 文件的變化,更新運行時 class 的行為。Java 類是通過 Java 虛擬機載入的,某個類的 class 文件在被 classloader 載入後,會生成對應的 Class 對象,之局差巧後就可以創建該類的實例。默認的虛擬機行為只會在啟動時載入類,如果後期有一個類需要更新的話,單純替換編譯的 class 文件,Java 虛擬機是不會更新正在運行的 class。如果要實現熱部署,最根本的方式是修改虛擬機的源代碼,改變 classloader 的載入行為,使虛擬機能監聽 class 文件的更新,重新載入 class 文件,這樣的行為破壞性很大,為後續的 JVM 升級埋下了一個大坑。
另一種友好的方法是創建自己的 classloader 來載入需要監聽的 class,這樣就能控制類載入的時機,從而實現熱部署。本文將具體探索如何實現這個方案。首先需要了解一下 Java 虛擬機現有的載入機制。目前的載入機制,稱為雙親委派,系統在使用一個 classloader 來載入類時,會先詢問當前 classloader 的父類是否有能力載入,如果父類無法實現載入操作,才會將任務下放到該 classloader 來載入。這種自上而下的載入方式的好處是,讓每個 classloader 執行自己的載入任務,不會重復載入類。但是這種方式卻使載入順序非常難改變,讓自定義 classloader 搶先載入需要監聽改變的類成為了一個難題。
不過我們可以換一個思路,雖然無法搶先載入該類,但是仍然可以用自定義 classloader 創建一個功能相同的類,讓每次實例化的對象都指向這個新的類。當這個類的 class 文件發生改變的時候,再次創建一個更新的類,之後如果系統再次發出實例化請求,創建的對象講指向這個全新的類。
下面來簡單列舉一下需要做的工作。
創建自定義的 classloader,載入需要監聽改變的類,在 class 文件發生改變的時候,重新載入該類。
改變創建對象的行為,使他們在創建時使用自定義 classloader 載入的 class。
自定義載入器的實現
自定義載入器仍然慶態需要執行類載入的功能。這里卻存在一個問題,同一個類載入器無法同時載入兩個相同名稱的類,由於不論類的結構如何發生變化,生成的類名不會變,而 classloader 只能在虛擬機停止前銷毀已經載入的類,這樣 classloader 就無法載入更新後的類了。這里有一個小技巧,讓每次載入的類都保存成一個帶有版本信息的 class,比如載入 Test.class 時,保存在內存中的類是 Test_v1.class,當類發生改變時,重新載入的類名是 Test_v2.class。但是真正執行載入 class 文件創建 class 的 defineClass 方法是一個 native 的方法,修改起來又變得很困難。所以面前還剩一條路,那就是直接修改編譯生成的 class 文件。
利用 ASM 修改 class 文件
可以修改位元組碼的框架有很多,比如 ASM,CGLIB。本文使用的是 ASM。先來介紹一下 class 文件的結構,class 文件包含了以下幾類信息,一個是類的基本信息,包含了訪問許可權信息,類名信息,父類信息,介面信息。第二個是類的變數信息。第三個是方法的信息。桐鍵ASM 會先載入一個 class 文件,然後嚴格順序讀取類的各項信息,用戶可以按照自己的意願定義增強組件修改這些信息,最後輸出成一個新的 class。
首先看一下如何利用 ASM 修改類信息。
清單 1. 利用 ASM 修改位元組碼
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassReader cr = null;
String enhancedClassName = classSource.getEnhancedName();
try {
cr = new ClassReader(new FileInputStream(
classSource.getFile()));
} catch (IOException e) {
e.printStackTrace();
return null;
}
ClassVisitor cv = new EnhancedModifier(cw,
className.replace(".", "/"),
enhancedClassName.replace(".", "/"));
cr.accept(cv, 0);
Ⅶ intellij IDEA如何對靜態資源文件進行熱部署javascript、css、vm文件
你把你的classes生成路徑執行到web-inf/classes裡面去陸則。
然後在配置運行的時候不要制定war包,直接指定為你的網氏虛站目錄就行了早核棚。
Ⅷ java 初級、中級、高級工程師等 如何區分
初級水平(認知理解技術為主):
項目實戰方面:
1.能夠熟裂衫練使用三大框架或者springboot進行基本的業務開發,熟悉MVC架構
2.能寫工作流,熟悉常用的設計模式
java部分:
1.能熟練應用封裝,繼承,多態這三大特性。能熟練使用list,set等collection介面,及map介面。
2.對java的較為復雜的技術能夠靈活使用如:多線程,反射,io流,網路編程和資料庫編程
3.sql能夠熟練掌握,如子查詢,mybatis的復雜查詢
中級水平(利用技術解決復雜業務和理解技術的原理為主):
1.對常用的框架的原理有較清晰的理解,能夠掌握其設計思想和所用到的設計模式。
2.能獨立的完成項目的某些模塊的任務
3.能夠進行性能優化,代碼規范,編程習慣良好無冗餘代碼隱森
4.對緩存,事務管理,日誌,分布式等復雜技術有著深入理解
高級水平(灶源畝技術領導):
1.能對需求進行架構設計,選擇框架以適應最合適的業務,作為某個項目的領導,帶領團隊完成項目。
2.有自己的開源項目,可以寫出自己的組件,對開源的框架能夠進行二次編寫,java核心技術有著非常深入的理解
架構師
能管理多個高級工程師及以下級別,提升工作效率
其發展戰略可以參考下圖:
1、Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多 繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。
2、Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅 的思維方式進行復雜的編程。
3、Java具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態 性等特點。
4、Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。 2018年9 月25日,Java11(18.9 LTS)正式發布,支持期限至2026年9月。
Ⅸ 為什麼我的jboss修改jsp文件時不能熱部署
(1).請檢查自己的網路是否正常連接。
(2).請關閉您的網路防火牆,防火牆有時會影響正常連接到伺服器。
(3).如果您是通過區域網上網,無法連接伺服器,那有可能是局域啟友網伺服器屏蔽了游戲所佔用的埠,請與您的網
管聯系。
(4).提供您上網服務的網路服務營運商的伺服器不能連接到官方的伺服器,請與您的網路服務營運商聯系。
(5).伺服器可能在關閉維護狀態明鎮,請注意官方網站的公告以及官方論壇的消息。悄槐槐