主流java框架理解
小編說一下分散式管理事務
簡單的來說呢,分散式事務其實就是一次大的操作分成了好的小的操作,這些小的操作分別部署在不同的伺服器上,而且屬於不同的應用,分散式的事務其實就是保證這些小的事務要麼都成功,要麼都失敗。
分散式事務出現的場景比如在支付和線上下單都會出現,我瞭解的分散式事務管理解決方法就是二次提交,基於MQ的特性,MQ作為二次提交的中間節點,負責儲存請求資料的,在失敗的情況下可以進行多次嘗試,還有可以基於MQ中的事務回滾操作,可以保證效能,又能保證業務一致性的方案。
請你簡單介紹一下SpringCloud元件分別是什麼,並有什麼用處?
SpringCloud中有五個元件,分別是:
服務發現——Eureka
負載均衡——Ribbon
斷路器——Hystrix
閘道器——Zuul
配置——SpringCloud Config
Eureka是Netflix的一個子模組,也是核心的模組之一,Eureka是一個基於rest的服務,用於定位服務,服務註冊等功能,有了這些功能,只需要使用服務的識別符號,就可以訪問到服務,而不需要呼叫服務的配置檔案了,功能類似於dobbo中的zookerper。
Ribbon主要提供負載均衡演算法,它提供了一系列的配置項,比如連線超時,重試,重試演算法等,他有一些實現策略:簡單輪詢負載均衡,加權響應時間,區域感知輪詢,隨機負載均衡。
Hystrix可以防止個應用程式多次試圖執行一個操作,就是很可能失敗的操作,斷路器模式也可以檢測出故障是不是解決了,如果問題得到了解決,那麼應用程式就可以嘗試呼叫操作。
Zuul閘道器類似於Nginx,反向代理,不過netflix自己增加了一些配合其他元件的特性。
Spring Cloud Config
這個是靜態的,得配合SpringCloudBus實現動態的配置更新。
為什麼eureka可以實現高可用?
在微服務的專案中,我們要考慮到發生故障的情況,所以也要對服務的註冊中心也要進行高可用的部署,那麼eureka就是通過多個例項進行互相註冊,然後修改每個serviceUrl就可以,eurekaServer的高可用其實就是將自己作為服務去其他的註冊中心註冊自己,這樣就可以形成一組互相註冊的註冊中心,就可以實現服務清單的互相同步,這樣就達到了高可用的情況。
Git合併分支的命令是什麼?
檢視分支:git branch
建立分支:git branch
切換分支:git checkout
建立+切換分支:git checkout -b
合併某分支到當前分支:git merge
刪除分支:git branch -d
HashMap和HashTable 的區別?
首先他們兩個的底層都是基於陣列+連結串列實現的,然後hashtable的key和value都不可以為空,他是執行緒安全的,他實現執行緒安全的方法是在修改資料時鎖住整個hashtable,這樣的話效率就會很低。
Hashmap是執行緒非安全的,他可以存空值,我對他印象比較深的就是他的初始size是16,然後每次擴容都是以2的n次冪擴容的。
負載均衡的策略有哪些?
大約有很多種,但我瞭解的有輪詢的方式和最小連線數,輪詢就是很簡單的實現,依次將請求傳送給後端的伺服器,有點就是實現簡單,請求分配均勻,缺點也是在均勻,因為有的伺服器效能好,可以承受更多的請求,但是他都是均勻分配的,所以也是有不合適的地方。最小連線數就是在後端伺服器效能差異較大的話,可以優化lc的效能,高權值的服務可以承載更高的連線負載。
執行緒池是什麼?
執行緒池就是java.util包下的有一個介面,用來建立執行緒池的,加入一個服務完成一項任務需要的時間是建立執行緒的時間,執行執行緒的時間,和銷燬執行緒的時間,如果建立的時間和銷燬的時間大於執行任務的時間,那我們就要採用執行緒池來提高伺服器的效能了,執行緒池包括:執行緒池管理器(就是用來建立並管理執行緒的,也包括銷燬,新增新任務)工作執行緒(執行緒池中的執行緒,在沒有任務處於等待的情況下,可以迴圈的執行任務) 任務介面(每個任務必須實現介面,供工作執行緒的呼叫),任務佇列(用來存放沒有處理的任務,提供一種緩衝的機制) 執行緒池就是關注如何優化建立執行緒時間和銷燬執行緒時間的。
常見的執行緒池有單個的執行緒池,和固定數量的執行緒池,還有就是無數量限制的執行緒池。
熔斷是什麼,用來處理什麼問題的?
熔斷機制就是應對微服務雪崩效應的一種鏈路保護機制,就是當我們某個微服務忽然不可用或者響應時間過長的時候,就會進行服務降級,熔斷該節點的服務呼叫,然後響應錯誤資訊,等到檢測這個應用響應正常的時候,再恢復這個鏈路。SpringCloud中的熔斷是通過Hystrix實現的,它會監測服務的呼叫狀況,
當失敗到達一定閾值的時候,就會啟動熔斷,熔斷機制的註解就是加一個註解,@hystrixCommand。
執行緒間的通訊是什麼,通訊狀態有幾種?
在一個程序中,執行緒一般都不是單獨存在的,而是多個執行緒之間需要進行通訊的。他們的體現就是,當一個執行緒傳輸資料給另一個執行緒,一個執行緒執行完特定的任務後轉到另一個執行緒繼續執行任務。執行緒通訊的方法有perform,還有NSmachport:本地之間的通訊,通過傳遞埠物件變數進行埠間的通訊。他應該是通過代理模式來傳遞訊息的。管道,命名管道,訊號,訊息佇列,共享記憶體
訊息佇列是幹什麼的,舉一個實際應用場景?
訊息佇列MQ就是一個儲存訊息的容器,另外它也是一個高效能的中介軟體。
實際場景的話當我們使用者註冊後要初始化好多操作,比如呼叫郵箱服務發郵件,呼叫促銷活動發優惠券,這時候我們就可以把監聽服務交給MQ,當用戶註冊成功之後,就通知MQ讓其他服務開始操作,確保能保證使用者的效能。
為什麼要做服務降級?
因為當我們的服務壓力劇增的情況下,要根據實際業務以及流量,對一些服務和頁面要有策略的不處理或者換一種簡單的方式處理,從而釋放伺服器資源保證核心交易正常工作或者高效工作。
熔斷和服務降級是用什麼實現的?
Springcloud有服務熔斷和降級的機制是Hystrix,通過Hystrix的註解HystrixCommond實現的。服務降級有幾種實現方法,超時降級,故障降級,限流降級。也可以在配置中心配置
sql的隔離級別有哪些。
未提交讀:事務還沒提交,而別的可以看到他修改資料的後果,就是髒讀。
提交讀:就是一個事務在執行的時候,其他事務看不到他的操作,所以看到的是舊資料,也是無效的資料。
可重複讀:可以保證讀取同一條資料的一致性,卻不能保證沒有插入新的資料。
可序列化:是最高的隔離級別,由於他加上了大量的鎖,所以可能會出現大量的請求超時,效能比較低下。
Localstorge是幹什麼的,sessionstorge是做什麼,sessionstorge和Localstorge的區別
sessionStorage僅在當前瀏覽器關閉之前有效,不在不同的瀏覽器視窗共享,在同源的同窗口可以共享跨頁面重新整理依然存在,存在本地。如果瀏覽器支援,瀏覽器崩潰並重啟之後依然會存在。
localStorage除非主動清除否則始終有效,無論視窗關閉與否,儲存大小達5M,存本地
Spring原理?
內部最核心的就是IOC了,動態注入,讓一個物件的建立不用new了,可以自動的生產,這其實就是利用java裡的反射,反射其實就是在執行時動態的去建立、呼叫物件,Spring就是在執行時,跟xml Spring的配置檔案來動態的建立物件,和呼叫物件裡的方法的 。
Spring還有一個核心就是AOP這個就是面向切面程式設計,可以為某一類物件 進行監督和控制(也就是 在呼叫這類物件的具體方法的前後去呼叫你指定的 模組)從而達到對一個模組擴充的功能。這些都是通過 配置類達到的。
Spring目的:就是讓物件與物件(模組與模組)之間的關係沒有通過程式碼來關聯,都是通過配置類說明管理的(Spring根據這些配置 內部通過反射去動態的組裝物件)
要記住:Spring是一個容器,凡是在容器裡的物件才會有Spring所提供的這些服務和功能。
spring aop? ioc ?
IOC
概念:控制權由物件本身轉向容器;由容器根據配置檔案去建立例項並建立各個例項之間的依賴關係
核心:bean工廠;在Spring中,bean工廠建立的各個例項稱作bean
AOP
1、 代理的兩種方式:
靜態代理:
l 針對每個具體類分別編寫代理類;
l 針對一個介面編寫一個代理類;
動態代理:
針對一個方面編寫一個InvocationHandler,然後借用JDK反射包中的Proxy類為各種介面動態生成相應的代理類
tomcat優化?
優化連線配置,可以修改conf/server.xml檔案,修改連線數,關閉客戶端dns的查詢。
採用叢集
調整執行緒數量
優化tomcat引數
什麼是反射?
Java反射就是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;並且能改變它的屬性
spring攔截器 sturts過濾器有什麼區別?
1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的;
2.攔截器不依賴於servlet容器,而過濾器依賴於servlet容器;
3.攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用;
4.攔截器可以訪問Action上下文、值棧裡的物件,而過濾器不能;
5.在Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次。
6.Springmvc的入口是一個servlet即前端控制器,而Struts2入口是一個filter過慮器
sql優化?
模糊查詢的時候不要在欄位前面加%
多用join少用子查詢
給常用的欄位加索引
Where和having相比較用where
為什麼要加索引?
在一個或者一些欄位需要頻繁操作的時候,建立索引會提高會快的速度,因為會從全盤掃描改為索引掃描,但是索引不是越多越好,太多的索引會佔用很多的索引表空間,而且加上索引之後,執行insert操作會很慢。
Mysql中的mysam和innodb是幹什麼的
Mysam和innodb是mysql中最常見的兩個表型別,各有優缺點,innodb具有事務回滾和崩潰修復的能力,Mysam相對簡單所以效率上要比innodb好,所以在進行讀寫分離的時候,innodb適合做寫的操作,mysam適合做讀的操作
Jvm結構?
方法區,java堆,java棧,本地方法棧,指令計數器以及其他隱含暫存器
Wait和sleep的區別
這兩個方法來自不同的類分別是Thread和Object
最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法(鎖程式碼塊和方法鎖)。
wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用(使用範圍)
sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
Java開發模式都有什麼?
集中式架構
分散式服務
微服務
垂直拆分
服務治理(SOA)
執行緒池
執行緒池就是提前建立若干個執行緒,如果有任務需要處理,執行緒池裡的執行緒就會處理任務,處理完之後執行緒並不會被銷燬,而是等待下一個任務。由於建立和銷燬執行緒都是消耗系統資源的,所以當你想要頻繁的建立和銷燬執行緒的時候就可以考慮使用執行緒池來提升系統的效能
為了讓學習變得輕鬆、高效,今天給大家免費分享一套Java教學資源。幫助大家在成為Java架構師的道路上披荊斬棘。需要資料的歡迎加入學習交流群:9285,05736
