1、Java中間件,分布式系統、分布式緩存、消息隊列
JAVA中間件:包括服務框架中間件:解決集群間的訪問通信問題。消息中間件:解決應用之間的消息傳遞、解耦、異步的問題。數據訪問中間件:解決應用訪問資料庫的共性問題。
分布式系統:一定是有多個節點組成的系統,一般一個節點就是一臺伺服器,節點之間是相互連通協作的,這些連通的節點上部署了我們的組件,共同服務於一個大型系統。比如淘寶網,在對瀏覽器發送請求的背後,是一個大型的分布式系統為我們服務,整個系統有的負責請求處理,有的負責存儲,有的負責計算,最終通過相互的協作把請求的結果返回給瀏覽器,並呈現給我們。
分布式緩存:就是把數據存放在不同的物理機器上,利用分布式緩存中間件進行處理數據。Redis和memcached緩存系統都是以key-value的形式存儲和訪問數據,在內存中維護一張巨大的HashTable。但是redis比memcached支持的數據類型更多,有五種數據類型:String、Hash、List、Set、ZSet(有序集合)。注意:分布式緩存系統需要用到一致哈希算法,它的的好處在於節點個數發生變化(減少或增加)時無需重新計算哈希值,避免大量key的重新映射,保證數據儲存或讀取時可以正確、快速地找到對應的節點。
消息隊列(中間件):負責消息的收發管理,利用高效可靠的異步消息傳遞機制集成到分布式系統。五大優點:解耦、異步、橫向擴展、安全可靠、順序保證。常見的有activeMQ(支持多語言,實現jms1.1),RabbitMQ(支持更多語言,基於AMQP規範),kafka(高吞吐量,分布式,分區,O(1)磁碟順序提供消息持久化)
2、常用的開源項目框架理解
Spring
Spring是輕量級的IoC和AOP的容器框架,是進行對象管理、對象關聯、解耦的一個中間層框架。是面向Bean的編程,實現了組件的解耦。
IoC(DI)依賴注入實現的技術:反射機制、工廠模式。其中pring的BeanFactory主要實現步驟如下,
解析配置文件(bean.xml)
使用反射機制動態加載每個class節點中配置的類
為每個class節點中配置的類實例化一個對象
使用反射機制調用各個對象的seter方法,將配置文件中的屬性值設置進對應的對象
將這些對象放在一個存儲空間(beanMap)中
使用getBean方法從存儲空間(beanMap)中取出指定的JavaBean
AOP實現的技術: JDK動態代理技術 和 CGLIB技術(動態字節碼增強技術) 。儘管實現技術不一樣,但都是基於代理模式 , 都是生成一個代理對象 。
JDK動態代理技術:主要使用到 InvocationHandler 接口和 java.lang.reflect.Proxy類的newProxyInstance() 方法。通過使用接口,使系統鬆耦合。
CGLIB(動態字節碼增強)技術:是繼承被代理對象,然後Override需要被代理的方法。使用繼承,代碼寫起來更簡單。
Struts2
Struts2是基於servlet、MVC設計模式的Web應用框架,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。
Struts2框架採用Filter(StrutsPrepareAndExecuteFilter)作為核心控制器實現。是類級別的攔截,每次請求對應實例一個新的Action,然後調用setter getter方法把request中的數據注入。一個Action對象對應一個request上下文。
Struts2流程分析:
①當在瀏覽器中輸入相應網址,會加載web.xml中的核心控制器
②核心控制器會攔截所有請求,加載struts.xml的配置文件,找到和請求名字相同的action
③創建Class屬性指定類的對象
④執行method屬性指定的方法,返回一個字符串結果
⑤找Name等於此字符串的result,轉到相應頁面或action
⑥在頁面中執行相關代碼:通過EL表達式或者OGNL表達式取當前類屬性的值
SpringMVC
SpringMVC是基於Servlet 、MVC設計模式的一個鬆耦合的web應用框架,使用前端控制器模式來進行設計,再根據請求映射規則分發給相應的後端控制器進行處理。
SpringMVC框架採用Servlet作為核心控制器實現。是方法級別的攔截,攔截到方法後根據參數上的註解,把request數據注入進去。一個方法對應一個Request上下文,所以方法直接基本上是獨立的,獨享request,response數據。、
開發效率對比:
由於SpringMVC基於方法的攔截,有加載一次單例模式bean注入。而Struts2是類級別的攔截,每次請求對應實例一個新的Action,需要加載所有的屬性值注入,所以,SpringMVC開發效率和性能高於Struts2
SpringMVC的工作流程如下:
用戶發送請求至前端控制器(DispatcherServlet)
DispatcherServlet收到請求調用處理器映射器(HandlerMapping)
處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器對象一併返回給DispatcherServlet
DispatcherServlet通過處理器適配器(HandlerAdapter)調用具體的處理器(Controller)
處理器即後端控制器(Controller)執行具體的業務操作,完成後返回ModelAndView
HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
ViewReslover解析後返回具體View
DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)
DispatcherServlet響應用戶
MyBatis
MyBatis 是一個基於 Java 的 持久層 框架, MyBatis 消除了幾乎所有的 JDBC 代碼和參數的手工設置以及結果集的檢索。 把實體類和SQL語句之間建立了映射關係,是一種半自動化的ORM實現。
MyBatis的特點:
基於SQL語法,SQL語句封裝在配置文件中,便於統一管理與維護。
自動化程度低、手工映射SQL,靈活程度高。
Hibernate
Hibernate是優秀的Java 持久化層解決方案、對象-關係映射(ORM)工具、簡化了JDBC 繁瑣的編碼。
Hibernate特點:
Hibernate對象-關係映射能力強,資料庫無關性好,對於關係模型要求高的軟體(例如需求固定的定製化軟體)如果用hibernate開發可以節省很多代碼,提高效率。
編寫程序的時候,HQL語句操作,以面向對象的方式處理數據。而保存數據的時候,卻以關係型資料庫的方式存儲。
SpringBoot
SpringBoot是基於Spring4.0的一套快速搭建Spring框架的整合包。方便對各種框架的整合,讓他們集成在一起更加簡單,簡化了我們在集成過程中的模板化配置。遵循」約定大於配置」,實現零配置。
特點:
創建獨立的Spring應用程式
嵌入的Tomcat,無需部署WAR文件
簡化Maven配置
自動配置Spring
提供生產就緒型功能,如指標,健康檢查和外部配置
微服務
微服務是一種可以讓軟體職責單一、鬆耦合、自包含、可以獨立運行和部署的架構思想。微服務架構是讓微服務與微服務之間在結構上「鬆耦合」,而在功能上則表現為一個統一的整體。目的是有效的拆分應用,實現敏捷開發和部署。
關鍵思想就是:拆分、單一、獨立、組件化。把原本一個龐大、複雜的項目按業務邊界拆分一個一個獨立運行的小項目,通過接口的方式組裝成一個大的項目。
Dubbo
首先了解一下ESB(企業數據總線):一般採用集中式轉發請求,適合大量異構系統集成,側重任務的編排,性能問題可通過異構的方式來進行規避,無法支持特別大的並發。
Dubbo(服務註冊管理),採用的是分布式調用,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。其側重服務的治理,將各個服務顆粒化,各個子業務系統在程序邏輯上完成業務的編排。是遠程服務調用的分布式框架(告別Web Service模式中的WSdl,以服務者與消費者的方式在dubbo上註冊)
其核心部分包含:
1. 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及「請求-響應」模式的信息交換方式。
2. 集群容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
3. 自動發現: 基於註冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
服務註冊中心:Zookeeper 服務調用方式: RPC
Spring Cloud
Spring cloud是基於spring boot以及結合Netflix 相關思想和代碼對微服務理念的java實現。提供了一些可以用於快速構建分布式系統通用模式的工具(例如:配置管理、服務註冊與發現、斷路器、智能路由、微代理、控制總線),在本質上是一種分布式的解決方案。
五大核心組件:
服務註冊發現 - Netflix Eureka
配置中心 - spring cloud config
負載均衡-Netflix Ribbon
斷路器 - Netflix Hystrix
路由(網關) - Netflix Zuu
服務註冊中心:Netflix Eureka 服務調用方式:REST API
Zookeeper
ZooKeeper是一種分布式應用程式協調服務,用於管理大型主機。它是集群的管理者,監視著集群中各個節點的狀態,根據節點提交的反饋進行下一步合理操作。最終,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
Zookeeper作用:
1.命名服務 2.配置管理 3.集群管理 4.分布式鎖 5.隊列管理
Zookeeper設計目的:
1.最終一致性:client不論連接到哪個Server,展示給它都是同一個視圖,這是zookeeper最重要的性能。
2.可靠性:具有簡單、健壯、良好的性能,如果消息被到一臺伺服器接受,那麼它將被所有的伺服器接受。
3.實時性:Zookeeper保證客戶端將在一個時間間隔範圍內獲得伺服器的更新信息,或者伺服器失效的信息。但由於網絡延時等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的數據,如果需要最新數據,應該在讀數據之前調用sync()接口。
4.等待無關(wait-free):慢的或者失效的client不得幹預快速的client的請求,使得每個client都能有效的等待。
5.原子性:更新只能成功或者失敗,沒有中間狀態。
6.順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺伺服器上消息a在消息b前發布,則在所有Server上消息a都將在消息b前被發布;偏序是指如果一個消息b在消息a後被同一個發送者發布,a必將排在b前面。
Docker
Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。Docker 將應用程式與該程序的依賴,打包在一個文件裡面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裡運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔心環境問題。
總體來說,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣。
Docker 主要用途。
(1)提供一次性的環境。比如,本地測試他人的軟體、持續集成的時候提供單元測試和構建的環境。
(2)提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。
(3)組建微服務架構。通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。
Redis
Redis 是一個開源的,基於高級的key-value存儲在內存中的數據結構存儲系統,它可以用作資料庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁碟持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。
Redis優點
(1) 速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)
(2) 支持豐富數據類型,支持string,list,set,sorted set,hash
(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除
Memcached
Memcached基於一個存儲鍵/值對的hashmap。Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。
Memcached特徵:
協議簡單
基於libevent的事件處理
內置內存存儲方式
memcached不互相通信的分布式
Memcache與Redis的區別都有哪些?
1)、存儲方式 Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。 Redis有部份存在硬碟上,這樣能保證數據的持久性。
2)、數據支持類型 Memcache對數據類型支持相對簡單。 Redis有複雜的數據類型。
3)、使用底層模型不同 它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。 Redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
3、遠程服務調用 RPC、REST API
RPC即遠程過程調用(Remote Procedure Call Protocol,簡稱RPC),像調用本地服務(方法)一樣調用伺服器的服務(方法)。通常的實現有 XML-RPC , JSON-RPC , 通信方式基本相同, 不同的只是傳輸數據的格式。
RPC架構裡包含如下4個組件:
1、 客戶端(Client):服務調用方
2、 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數打包成網絡消息,再通過網絡發送給服務方
3、 服務端存根(Server Stub):接受客戶端發送過來的消息並解包,再調用本地服務
4、 服務端(Server):真正的服務提供者。
RPC架構目的是把調用、編碼/解碼的過程封裝起來,讓用戶像調用本地服務一樣的調用遠程服務。要做到對客戶端(調用方)透明化服務, RPC框架需要考慮解決如下問題:
服務端提供的服務如何發布,客戶端如何發現服務;
如何對請求對象和返回結果進行序列化和反序列化;
如何更高效進行網絡通信。
最後,對於想要在網際網路行業發展的小夥伴,我總結了一套學習Java的資料與面試題,如果你在技術方面想提升自己的話,可以關注私聊我免費領取。