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