1. 程式人生 > >*Java軟體開發面試知識整理*

*Java軟體開發面試知識整理*

Java軟體開發面試知識整理 圍繞以下幾點回答問題:是什麼、為什麼、什麼時候用、專案實現、解決什麼問題、遇到的困難

  1. 談談你對Java和C的理解? Java: 面向物件、Unicode:可以跨平臺(JVM執行),可以分散式,相對C速度會慢 C語言: 面向過程、ASCII、更底層:移植性、安全性不如Java、沒有GC 特點:速度快(Linux、Nginx)、注重演算法 變數可以不進行初始化

  2. super與this區別 this指當前類的物件 super父類物件,受繼承的約束規則 (例:子類建構函式中預設存在super,當父類沒有無參建構函式或者被私有化,則變異報錯,必須手動新增父類無參構造(預設預設))

  3. public:全域性 protected:子類,同包,類內 預設什麼都不:寫同一包、類內 Privat:類內

  4. java事件委託機制:一個源產生一個事件並把它傳送到一個或多個監聽器哪裡,事件被監聽器接受後進行處理

  5. 垃圾回收機制:將分配給物件但不在使用的記憶體回收或釋放的過程。(比如當一個物件沒有指向它的引用或者為null值)

  6. 什麼是java序列化:將一個物件儲存到一個檔案,並且可以通過流的方式進行傳輸。實現Serializable介面

  7. 一個.java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制? 可以、但是隻允許有一個public類,並且類名必須和檔名一致。

  8. Override和Overload的區別 Override是重寫,子類覆蓋父類方法 Overload是過載,一個類多個方法,方法名相同,引數不同

  9. Final類特點 屬性常量 方法不可被重寫 類不可以被繼承

  10. 一般的排序方式 選擇排序思路:外層從陣列i(0)位開始,內層從j=i開始,i++j++遍歷整個陣列,找到最小值位j,ij通過中間值m換位 i++ For(int i=0;i<a.length;i++){ int m = I; For(int j=I;j<a.length;j++){ If(a[j]<a[m]){m=j} } Int c=a[i]; a[i]=a[m]; a[m]=c; } 插入排序思路:認為i[0]是有序的,外層從i[1]開始,內層從j=i-1開始,i++j–遍歷,相鄰的兩個元素小大排,每遍歷完一個次,i++ For(int i=1;i<a.length;i++){ for(int j=i-1;j>=0;j–){ If(a[j]>a[j+1]){ Int c=a[j] a[j]=a[j+1] a[j+1]=c }else{break} } } 氣泡排序思路:外層從i(0)開始 內層j從末尾開始,i++j-遍歷整個陣列,相鄰的兩個元素小大排,每遍歷完一個次,i++,可以加一個boolean判斷,減少運算 For(int i=1;i<a.length;i++){ boolean flag = false; For(j=a.length-1;j>I;j–){ If(a[j]<a[j-1]) Int c=a[j] a[j]=a[j-1] a[j-1]=c flag=true; } If(!flag){break;} }

  11. 抽象類和介面的區別 介面可以被多實現,抽象類只能被單一繼承 介面只有方法定義,抽象類可以有方法定義和實現 介面的欄位定義是public static final的,抽象類是本包可見

  12. 什麼是類的反射機制 通過類(Class 物件),可以得出當前類的:fields、method、construtor、annotation等,並且進一步的可以實現:例項化類、設定屬性、喚醒方法。 典型應用在Spring框架中。 如何喚醒一個類的方法:1得到類物件2得到該方法+引數3method.invoke(例項,引數)喚醒

  13. Java獲得年月日 Calendar c=Calendar.getInstance(); c.set(Calendar.YEAR,2004); c.set(Calendar.MONTH,0); c.set(Calendar.DAY_OF_MONTH,31); System.out.println(c.get(Calendar.YEAR)+""+(c.get(Calendar.MONTH)+1)+""+c.get(Calendar.DAY_OF_MONTH)); Java獲取毫秒數 Date d = new Date(); Long l = d.getTime();

  14. Java簡單實現編碼轉換 String a = new String(“都是靠技術”.getBytes(“charset”),”charset”);

  15. 簡單介紹一下Java記憶體溢位、記憶體洩漏 記憶體溢位 out of memory 記憶體滿了。死迴圈輸出或大量資料庫讀取或JVM記憶體過小 死迴圈append字串 記憶體洩漏 memory leak 無用物件持續佔記憶體。.close()方法丟失

  16. Java多型實現 靜態實現:OverLoad 動態實現:繼承+實現

  17. 簡述Java垃圾回收機制 動態記憶體:類例項 靜態記憶體:類本身 垃圾收集主要針對的是動態記憶體,一般當記憶體不夠用時會進行垃圾收集。 可以通過System.gc()手動回收,但是不一定執行。

  18. 談談Java的JVM記憶體機制?/談談Java 堆、棧、方法區都是幹什麼的? 堆: 只存放物件本身 棧: 只存放基本型別和物件的引用 Stack.push Stack.pop 方法區:又叫靜態區,包含所有的class類、static變數、常量池(類常量和字串常量1.7以後字串常量池放到了堆中數字常量池(-128-127))。特點唯一

  19. 簡述類載入過程?描述一下JVM載入Class檔案的原理機制? JVM中類的載入是由ClassLoader和他的子類來實現的,類載入器在JVM虛擬機器中 載入(.class二進位制檔案載入到記憶體)-連線(驗證編譯合法、分配記憶體賦給預設值、方法的符號引用變為直接引用)-初始化(賦值)

  20. 談談JVM的優化?

  21. Java如何處理異常? Try-catch-finally Throws 方法或類丟擲異常 Throw 程式碼塊丟擲異常 throw new ServiceException(“”);

  22. 談談對tring StringBuffer StringBuilder的理解? String 長度不可變 +號拼接慢 StringBuffer 拼接字串 特點:快、執行緒安全 StringBuilder 拼接字串 特點:非常快、執行緒不安全

  23. 集合的作用是什麼?談談List、Set、Map。(注意Map跟List,Set不同隸屬於Collection) 集合的一大特點是泛型、存放不同型別 List 有序的可重複 ArraysList陣列儲存,任意位置訪問效率高, LinkedList連結串列儲存,兩端效率高 Set 無序的不重複 區分重複的方法:先比較hashcode 在equals 都相等則相等 Map 鍵值對儲存 一個雜湊桶key對應一個或者多個值value key相同 value相同覆蓋;key相同 value不同連結串列(jdk1.8 長度>8紅黑樹 6轉回成連結串列) HashMap 執行緒不安全、支援null值、初始16*0.75 HashTable 執行緒安全、不支援null值、被淘汰了

  24. List遍歷的方法 For/foer/list.iterator()+while迭代

  25. Collection Collections 的區別。 Collection 是集合的根介面,其下有set及list Collections 是集合的演算法。就像工具類

  26. Int和Integer有什麼區別?談談基本型別和其包裝類? 基本型別 封裝類:多方法和屬性,支援null值:資料庫POJO物件有封裝類

  27. Try-return-catch-return-finall執行順序 正常 try - finally - return 異常 try - catch - finally - return

  28. 用最快的速度算出2*8=? 用移位 2<<3 JAVA基礎類庫(IO、執行緒、Socket)

  29. Java的幾種流 位元組流In/OutputStream、字元流Writer/Reader 橋樑InputStreamReader/OutputStreamWriter 高階流Buffer批量讀取快

  30. 談一談執行緒: 新建一個執行緒的方法: 繼承Thread重寫run方法. 多個執行緒分別完成自己的任務 實現Runnable介面重寫run方法 多個執行緒共同完成一個任務 啟動執行緒用start()方法 執行緒在程序(程序就是應用程式:迅雷、QQ)中執行。 生名週期:開始,執行,掛起(sleep指定休息時間,wait等待喚醒,yield,join),消亡

  31. 同步跟非同步的區別 同步:排隊買票 hashTable、StringBuffer、資料庫寫入鎖庫、鎖表 非同步:不排隊搶票

  32. 什麼是TCP/IP、UDP TCP/IP即傳輸控制協議網間協議 協議簇

  33. 談談Socket和ServerSocket 兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。 實現不同的計算機之間的通訊。主機一般運行了多個服務軟體,同時提供幾種服務。每種服務都開啟一個Socket,並繫結到一個埠上,不同的埠對應於不同的服務。 程序間如何通訊:訊息傳遞、同步、共享資料、遠端呼叫 識別程序:網路層IP地址識別主機,根據協議+埠號識別程序

  34. 當前主流的解析器有哪些?他們有什麼不同?解析Xml的工具? Dom:文件物件模型 特點:可以訪問任意節點,慢,可修改 Sax: 特點:順序讀取,快,只讀 JDBC資料訪問技術

  35. Jdbc如何做事務處理 設定事務自動/手動提交 commit 事務的回滾,批量提交事務,有一個錯誤,返回,不對資料庫做任何操作

  36. 預編譯功能PrepareStatement 正對sql語句,防止sql注入攻擊,原理:sql先經過編譯再填充引數。

  37. Class.forName(“載入驅動”) 載入到JVM 獲得連線Connection 獲得預編譯物件PrepareStatement 執行sql 獲得ResultSet

  38. 資料庫事務/JDBC事務的四大特性:ACID 一系列操作組成的操作單元, 原子性:要麼全都執行,要麼全都不執行 一致性:存取一致 隔離性:併發的事務加鎖 永續性:持久儲存

  39. 資料庫的五大約束 主鍵約束:唯一非空 在所有列定義完之後加逗號, primary key(列名) 唯一約束:唯一,可多空 在所有列定義完之後加逗號, unique(列名) 檢查約束:自定義約束 在所有列定義好了之後加逗號, check(1個或者多個檢查條件) 外來鍵約束: 在所有列定義完之後加逗號, foreign key(子表外來鍵列名) references 父表名(父表主鍵列名)

  40. MySQL 中如何設定事務隔離級別? set session transaction isolation level ‘reapable read’

  41. 開啟資料庫訪問許可權的sql? grant 許可權 on 資料庫名.表名 to ‘使用者名稱’@‘web伺服器的ip地址’ identified by ‘密碼’; 開啟資料庫許可權sql:grant all on . to ‘username’ @ ‘IP地址’ identified by ‘password’;

  42. 資料庫優化策略? a. 優化sql語句 原則:儘量使用主鍵查詢/減少關聯查詢(表設計) b. 建立資料庫索引 c. 使用快取策略(記憶體),mamerchche/Redis0 d. 定期資料轉儲,將舊資料儲存到歷史表 Tb_order tb_history_order e. 分庫分表(2-4伺服器)

  43. 資料庫內外連線的區別? 內連線交集 外連線交集+左右 Http協議

  44. 談談你對http協議的理解? 定義:超文字傳輸協議,網路傳輸協議:基於TCP/IP通訊協議來傳遞資料 TCP/IP是一個協議簇,是由許多協議組成的。一般理解到應用層,傳輸層,網路層,資料鏈路層這幾層即可。 請求: 請求行:method url Protocol 請求頭:多個K : V(Accept-Charset:瀏覽器可接受的字符集。Cookie:快取 這個是重要的請求頭) 空行: 請求資料 響應: 響應行:Protocol 狀態碼 狀態(200成功 404找不到 500 伺服器錯誤 403請求方式拒絕 406資料型別錯誤) 響應頭:多個K : V (Content-Encoding:編碼方法 Content-Length:長度 Content-Type 型別 Date:GMT時間 Allow:伺服器支援的請求方法) 空行: 響應資料:

  45. Cookie的生命週期? Cookie.setMaxAge()>0存活時間秒、=0立即刪除、-1會話刪除 Web/Jsp/Servlet技術

  46. 談談Tomcat的配置 JAVA_HOME 配置JDK環境 CATALINA_HOME 配置tomcat的根目錄 server.xml 配置Tomcat的配置埠號 wabapp下的ROOT檔案對應專案釋出 Maven打war包放這裡啟動Tomcat

  47. 談一談Tomcat的效能優化? 什麼是Tomcat:免費開源的Web輕量級(元件對環境的依賴程度)應用伺服器,Servlet容器,用來開發Servlet和JSP。處理請求、響應請求。 效能優化: 記憶體優化:多分配JVM記憶體 Windows下的catalina.bat Linux下的catalina.sh JAVA_OPTS=’-Xms256m -Xmx512m’(-初始大小 –最大值) 執行緒優化:在servlet.xml中 maxThreads=“X” 表示最多同時處理X個連線 minSpareThreads=“X” 初始化X個連線 maxSpareThreads=“X” 表示如果最多可以有X個執行緒,一旦超過X個,則會關閉不在需要的執行緒 acceptCount=“X” 當同時連線的人數達到maxThreads時,還可以排隊,佇列大小為X.超過X就不處理 IO優化: BIO 比較傳統的,適合連線少且固定的架構,JDK1.4以前的唯一選擇 NIO 多路複用(執行緒複用,不釋放,長連結ping/1s;流,響應式,事件:保證持續:郵箱機制),適合連線多且較短的架構,比如:聊天室,JDK1.4以後開始支援 AIO 適合連線數多且長的架構,比如相簿,JDK1.7開始支援 凶器APR: APR是從作業系統級別來解決非同步的IO問題,,socket排程

  48. 談談JavaWeb三大元件 Servlet 處理請求 init Service destory Filter 攔截放行 init doFilter destroy 登入驗證 Listener

  49. 說一說過濾器Filter? 可以實現使用者請求之前或響應之後,對請求request和響應response進行攔截,做一些相關處理。一個攔截器可以攔截多個資源,一個資源可以配置多個攔截器 比如最典型的:全站亂碼解決、登入控制 實現過濾器: a. 實現Filter介面 接口裡面有哪些方法: init(); 初始化,web應用建立時立即建立Filter立即初始化 doFilter(Request , Response , FilterChain); FilterChain.doFilter(Request,Response);向下傳遞 destroy(); 銷燬,web應用關閉或移除時銷燬 b. web.xml配置過濾,攔截/放行那些資源 例:您是第xxx個訪問本網站的人

  50. 說一說監聽器Listener 監聽java物件(ServletContext、HttpSession、ServletRequest)的變化(數量、建立與銷燬),需要將監聽器註冊到事件源,事件源觸發監聽器,執行監聽器中的方法。例:統計線上人數,統計訪問量

  51. POST提交和GET提交的區別 POST: 引數不出現在位址列,資料量理論沒有上限 GET: 引數出現在位址列,資料量最大在1-4kb

  52. 談談Servlet生命週期 Init方法 只會執行一次,(第一次訪問初始化或者設定伺服器啟動後立刻載入) Service方法 核心週期實際的處理工作都在這裡實現 Destroy方法 只會被呼叫一次,在Servlet物件被銷燬時呼叫

  53. 談談轉發(forward)、重定向(sendRedirect)的區別 轉發:一次請求一次響應,位址列不發生變化,只能在同一個web應用內部跳轉 重定向:兩次請求兩次響應,位址列發生變化,可以在不同的web應用間跳轉

  54. Servlet會話技術 多次請求多次響應 Cookie客戶端技術+Session服務端技術 客戶端向伺服器傳送請求,伺服器獲取需要儲存的資料,並將需要儲存的資料通過Set-Cookie響應頭髮送給瀏覽器,瀏覽器會以Cookie的形式儲存在瀏覽器的內部. 一次會話對應一個session,持續儲存資料 當瀏覽器再去訪問伺服器時,伺服器可以從session中獲取到之前為當前瀏覽器儲存的資料

  55. 談談四大作用域,共同作用:在作用域內共享資料 Page 域: 網頁,只能作用於本網頁 生命週期:jsp請求開始,結束銷燬 作用範圍:整個jsp頁面,四大作用域最小的一個 Request 域: 只要不重定向,請求就會一直帶到下一個頁面。 生命週期:使用者發一個請求開始,請求結束銷燬。 作用範圍:整個請求鏈(包括轉發),注:Request域:在一次請求中,而重定向是兩次請求,會銷燬再建立。 HttpSession域: 只要網頁不關閉,session就不會丟失 生命週期:在第一次呼叫呼叫request.getSession()方法時。銷燬:非正常銷燬,手動銷燬,定時銷燬。 作用範圍:一次會話。 application ServletContext 只要伺服器不關閉,application就不會丟失 生命週期: 伺服器啟動,應用載入時開始,應用移除,伺服器關閉時銷燬。 作用範圍:整個WEB應用。

  56. 談談JSP的理解。Java Servlet Page 動態的web資源技術,本質上就是一個Servlet JSP為了解決Servlet響應時不適合向外輸出頁面的問題。

  57. 常見JSP表示式 JSP表示式 格式: <%= 表示式 %> (就是EL表示式${}) 其中可以書寫常量、變數、表示式。 JSP指令碼片段 格式:<% 若干java語句 %> JSP註釋 格式: <%-- JSP註釋 --%> JSP指令 格式:<%@ 指令名稱 若干屬性宣告… %> 比如language、字符集、異常頁面、import導包 JSP Include指令 實現頁面包含 格式:<%@ include file="" %>

  58. JSP九大隱士 page this 相當於例項化的Servlet類this request ServletRequest 代表請求 response ServletResponse 代表響應 session HttpSession 一次會話的session application ServletContext 伺服器域物件 config ServletConfig 取得伺服器的配置資訊 exception 異常物件 out 等價於response.getWriter() pageContext 通過這個物件可以獲獲得其他八大物件

  59. Jstl標籤庫:JavaWeb開發的一套標準通用的標籤庫 JSTL標籤庫和EL配合使用取代JSP中大部分的Java程式碼. <c:if><c:forEach>

  60. 談談CS跟BS的聯絡與區別? CS是Client/Server:客戶端軟體+伺服器 專網、適應性弱、對作業系統有要求 重視流程、安全機密性高、執行速度一般 集中、重用性差 升級維護麻煩、成本高 BS是Brower/Server:網頁+伺服器 公網、適應性強、任意作業系統 兼顧流程和速度、安全機密性差、執行速度快 分開、重用性好 升級維護容易、成本低 AJAX

  61. 談談你對AJAX的理解? Asynchronous Javascript And XML XMLHttpRequest 是瀏覽器內建的AJAX引擎 open(method,url,async) send(String)POST請求才有String 它使用客戶端指令碼與web 伺服器進行互動資料、解決的是全劇頁面非同步載入的問題。 一般結合JQuery來使用AJAX 基礎語法:$.ajax({k:v,…}) AJAXGET 請求: $.getJSON(“url”,[data], [callback]) AJAXPOST請求: $.post(url,[data],[callback])

  62.  Ajax——三種資料傳輸格式:HTML、XML、JSON
    

若應用程式不需要與其他應用程式共享資料的時候,使用HTML片段 如果資料需要重用,需要共享資料,JSON檔案是個不錯的選擇, 當遠端應用程式未知時,XML文件是首選 Spring框架技術

  1. 為什麼要使用Spring框架?Spring的核心價值在哪?談談對Spring的理解? Why?:解決軟體中的共性問題,整合優秀資源,對外提供統一的服務。 核心特徵(兩大特徵IOC物件管理+AOP功能擴充套件) IOC :控制反轉,把new物件的工作交給Spring來做、有Spring來建立、協調、管理這些物件,使開發更關注業務邏輯本身。 DI :IOC後依賴被注入到物件中的過程,構造注入、set注入、註解/xml注入 AOP :不改變原始碼的情況下給程式動態的新增功能: 例:事務控制、日誌、效能監控、安全控制、異常處理 核心元件: BeanFactory :Bean工廠:Bean的定義、建立、解析 Core 元件 :定義了資源的訪問方式 :提供get和set方法 ApplicationContext :提供框架執行時的環境、儲存物件關係、利用BeanFactory建立Bean物件 ApplicationContext 是Spring在 BeanFactory 基礎容器之上,提供的另一個IoC容器實現。它擁 有許多 BeanFactory 所沒有的特性,包括統一的資源載入策略、國際化資訊支援、容器內事件釋出。 優勢: 統一管理jar包、不用new物件、減少程式碼量、更關注業務邏輯的實現。 節省記憶體,預設單例建立物件。 耦合性降低。 缺點: 複雜,底層用反射,難以理解。 物件結構的可讀性低,對新學者不友好。
  2. ApplicationContext如何實現事件處理 觀察者模式:事件ApplicationEvent 發生改變-通知-ApplicationListener得到事件源ApplicationContextAware呼叫事件源的方法,通知監聽器。
  3. 說幾個Spring常用的配置標籤
  4. 談談單例模式和多例模式?談談SpringBean物件有哪些重要的作用域?其含義是什麼? 單例模式:整個系統中物件只有一份,解決記憶體佔用問題。 多例模式:整個系統中物件只有多份,物件含有可改變的狀態時,解決高併發問題
  5. Spring Bean 物件的構建有哪些方式?(直接構建,靜態方法,例項方法)
  6. Spring兩種事務管理方式 spring事務的本質就是對資料庫事務的支援,例如A-B 200轉賬,保證A-200和B+200在同一個事務當中。 程式設計式事務管理: 通過編碼方式實現事務,缺點:入侵式。 宣告式事務管理: 基於AOP實現的,將具體業務邏輯與事務處理解耦。非入侵式,不會影響業務的實現。 兩種實現方式: a. XML org.springframework.jdbc.datasource.DataSourceTransactionManager b. 註解 @Transactional實現事務管理實現 啟用事務註解、註冊驅動 org.springframework.jdbc.datasource.DataSourceTransactionManager <tx:annotation-driven transaction-manager=“txManager”/> 在類或方法中使用@Transaction註解應用事務。 事物的隔離級別:針對事物的隔離性來說的 SERIALIZABLE最高級別 REPEATABLE_READ(此級別可能會出現幻讀) READ_COMMITTED(此級別可能會出現不可重複讀) READ_UNCOMMITTED (此級別可能會出現髒讀)
  7. 談一談Spring中的動態代理 JDK代理:代理類必須實現介面,Spring預設 CGlib代理:代理類不需要實現介面,生成的代理類是目標子類
  8. Spring常用註解有哪些? @Component 元註解 @Controller 控制層 @Service 業務層 @Reponsitory 資料訪問層 @Autowired 自動注入 @Configuration 配置類 @ComponentScan 掃描指定包下的所有C S D @Aspect 宣告切面 @After 前置通知 @Before 後置通知 @Around 環繞通知 @PointCut 宣告切點 @Transactional 宣告事務 @EnableAspectJAutoProxy 開啟事務支援 @Value Spring EL取值 @ContextConfiguration 配置載入ApplicationContext @EnableWebMvc 開啟MVC的一些預設配置: @RequestMapping 路徑 @ResponseBody 指定返回資料 處理物件一般不亂碼,處理String可能亂碼。 @RequestBody 允許request的引數在request體中 @PathVariable 接受路徑引數 @RestController 組合@Controller和@ResponseBody @ControllerAdvice 全域性異常配置 @ExceptionHandler全域性異常攔截 @WebAppConfiguration 指定web資源位置
  9. Shiro安全框架 認證管理物件,授權管理物件,會話管理物件,快取管理物件,加密管理物件
  1. Subject:與軟體互動的一個特定的實體(使用者、第三方服務等)。
  2. SecurityManager :Shiro 的核心,用來協調管理元件工作。
  3. Authenticator:負責執行認證操作
  4. Authorizer:負責授權檢測
  5. SessionManager:負責建立並管理使用者 Session 生命週期,提供一個強有力的 Session 體驗。
  6. SessionDAO:代表 SessionManager 執行 Session 持久(CRUD)動作,它允許任何儲存的資料掛接到 session 管理基礎上。
  7. CacheManager:提供建立快取例項和管理快取生命週期的功能
  8. Cryptography:提供了加密方式的設計及管理。
  9. Realms:是shiro和你的應用程式安全資料之間的橋樑。 具體流程: 1)系統呼叫subject的login方法將使用者資訊提交給SecurityManager 2)SecurityManager將認證操作委託給認證器物件Authenticator 3)Authenticator將身份資訊傳遞給Realm。 4)Realm訪問資料庫獲取使用者資訊然後對資訊進行封裝並返回。 5)Authenticator 對realm返回的資訊進行身份認證。

SpringMVC

  1. 談一談你對SpringMVC的瞭解? 首先什麼是Spring?答案在上面。 什麼是MVC?/什麼是MVC設計模式? MVC的全名是Model(模型)、View(檢視)、Controller(控制器),是用C把M和V分離開的方式組織程式碼。 資料庫資料M獲取C處理V顯示 優點:前後端分離(MV分離) 缺點:複雜、不適合中小應用程式、資料訪問效能低(mycat讀寫分離+資料庫叢集+redis) 最典型的MVC就是javabean + JSP + servlet的模式。也就是SpringMVC與使用者進行資料互動,頁面跳轉。
  2. 談一談SpringMVC的5大核心元件 DispatcherServlet 前端控制器 處理請求的入口 org.springframework.web.servlet.DispatcherServlet一般在伺服器啟動時就初始化 繼承AbstractAnnotationConfigDispatcherServletInitializer HandlerMapping 對映器 管理url和Controller的對映關係 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping @RequestMapping("/") Interceptors 攔截器 實現請求響應的共性處理 mvc:interceptor 實現HandlerInterceptor介面 Controller 後端控制器 請求控制邏輯 實現 Controller介面 org.springframework.web.servlet.mvc.Controller;+XMLbean配置 @Controller ViewResolver 檢視解析器 解析對應的檢視關係:字首+view+字尾 org.springframework.web.servlet.view.InternalResourceViewResolver 繼承 WebMvcConfigurerAdapter
  3. REST風格的url對映 REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST) 提高程式的可伸縮性(“/msg/{xxx}”)
  4. 談一談你接觸的幾種資料傳輸格式? 二進位制傳輸 txt檔案 需要約定處理字串 xml檔案 標籤靈活dom sax WebService ApacheCXF。廢棄傳輸效能低 Json串 無序的鍵值對集合,可以在串和物件之間相互轉化,httpclient+json, Jackson,fastjson。
  5. 說一說SpringMVC裡的攔截器? 可以實現實現請求響應的共性處理:身份認證、系統監控、日誌記錄… 實現方法: a. 實現HandlerInterceptor介面或者繼承實現類HandlerInterceptorAdapter 業務業務處理時間 preHandle()資料處理時間postHandle()檢視渲染時間afterCompletion() b. 在Spring配置檔案中配置mvc:interceptors 攔截器鏈的實現:繼承HandlerInterceptorAdapter加@Component註解
  6. SpringMVC攔截器和Servlet的過濾器有什麼區別?

①攔截器是基於java的反射機制的,而過濾器是基於函式回撥。   ②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。   ③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。   ④攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。   ⑤在action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次。 ⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裡注入一個service,可以呼叫業務邏輯。 7. SpringMVC異常處理? 提高系統容錯、使用者體驗、 定義一個全域性異常配置 類加@ControllerAdvice 方法加@ExceptionHandler (value=Exception.class)註解 8. Spring中的單例模式是什麼?你知道幾種單例模式? 系統中一個類,只有一個例項物件。 實現思路:私有化構造、私有化靜態物件、對外提供獲取這個物件的方法 a. 懶漢式:呼叫才初始化,執行緒安全 public class Singleton { private volatile static Singleton instance; //私有化靜態物件,instance = new Singleton()並非一個原子操作需要volatile 禁止指令重排序優化 private Singleton (){}//私有化構造 public static synchronized Singleton getInstance() {//提供對外方法,加鎖防止多執行緒並行呼叫此方法 if (instance == null) { synchronized (Singleton.class) {instance = new Singleton();}//加鎖防止多執行緒並行呼叫 } return instance; } } 關於instance = new Singleton()並非一個原子操作需要volatile 禁止指令重排序優化的解釋: instance = new Singleton()這句,這並非是一個原子操作,事實上在 JVM 中這句話大概做了下面 3 件事情。

  1. 給 instance 分配記憶體
  2. 呼叫 Singleton 的建構函式來初始化成員變數
  3. 將instance物件指向分配的記憶體空間(執行完這步 instance 就為非 null 了) 但是在 JVM 的即時編譯器中存在指令重排序的優化。也就是說上面的第二步和第三步的順序是不能保證的,最終的執行順序可能是 1-2-3 也可能是 1-3-2。如果是後者,則在 3 執行完畢、2 未執行之前,被執行緒二搶佔了,這時 instance 已經是非 null 了(但卻沒有初始化),所以執行緒二會直接返回 instance,然後使用,然後順理成章地報錯。 b. 餓漢式:載入就初始化,執行緒安全,不是懶載入 public class Singleton{ private static final Singleton instance = new Singleton(); private Singleton(){}; public static Singleton getInstance(){ return instance; } } c. 靜態內部類:把餓漢式包了起來且實現了懶載入 public class Singleton{ private static class SingletonHolder{ private static final Singleton INSTANCE = new Singleton(); } private Singleton(){}; public static final Singleton getInstance(){ return SingletonHolder.INSTANCE; } } d. 列舉Enum:通過EasySingleton.INSTANCE來訪問例項、執行緒安全、防止反序列化導致重新建立新的物件 public enum EasySingleton{ INSTANCE; } SpringAOP
  4. 談一談SpringAOP?Spring是什麼?AOP可以做那些事那些事?簡單說一下AOP的實現原理? 面向切面程式設計:宣告式事務處理基於AOP實現 在OCP(開閉原則)基礎上,在物件執行時動態織入一些功能。 OCP是:完成的程式碼需要增加新功能時,擴充套件>修改程式碼 AOP實際應用場景:日誌、事務處理、許可權處理、快取處理(沒有Redis) AOP底層實現:基於代理機制實現功能擴充套件 目標實現介面:底層JDK動態代理,目標類和代理類會實現共同介面 目標未實現介面:底層採用CGLIB實現代理,代理類會繼承目標物件型別 AOP術語: 切面(@Aspect),橫切面物件 封裝擴充套件業務的一個類的物件。 連線點(@joinpoint) 程式執行過程中某個特定的點,一般指被攔截到的的方法 切入點(pointcut):對連線點攔截內容的一種定義,一般理解為多個連線點的結合. 通知(@Advice) 切面的某個特定連線點上執行的動作(擴充套件功能) AOP基於XML實現
AOP基於註解實現 @Aspect:宣告這是一個AOP切面物件 @Service交給Spring管理 @EnableAspectJAutoProxy開啟AOP @Ponitcut(“bean(beanID)”) bean表示式、註解用於定義本類中的切入點 切面表示式: bean 匹配指定bean id的的方法執行 粗粒度 bean(“userService”) 指定類 ` bean(“*Service”) 指定字尾為Service的類 within 匹配指定包名下型別內的方法執行 粗粒度 within("aop.service.UserServiceImpl") 指定類,只能指定一個類 within("aop.service.*") 只包括當前目錄下的類 within("aop.service..*") 指定當前目錄包含所有子目錄中的類 @annotation 匹配指定註解修飾的方法執行 細粒度 @annotation("com.jt.common.anno.RequestLog")) 指定一個需要實現增強功能的方法 execution 匹配執行具體業務 細粒度 execution(void aop.service.UserServiceImpl.addUser()) 匹配方法 execution(void aop.service.PersonServiceImpl.addUser(String)) 方法引數必須為字串 execution(* aop.service..*.*(..)) 萬能配置 切面通知增強: 1) 前置通知 (@Before) 方法執行之前執行 2) 返回通知 (@AfterReturning) 方法return之後執行 3) 異常通知 (@AfterThrowing) 方法出現異常之後執行 4) 後置通知 (@After) : 又稱之為最終通知(finally) 5) 環繞通知 (@Around) :重點掌握 多個切面執行順序用@Order註解 Mybatis 1. 談一談你對Mybatis的理解? SSM三大框架之一的mybatis,持久層框架,支援對資料庫的 SQL查詢、儲存過程高階對映。極大簡化JDBC程式碼,使開發更關注sql語句。 最長操作的兩個類:Mapper類和Pojo類 同類產品比較: Hibernate:功能強大、更接近OOP、sql不依賴資料庫、sql自動生成 支援二級快取、三級快取 Mybatis:更基礎、sql依賴資料庫、sql相對靈活、關聯sql工作量大 支援三級快取 實現步驟(以查詢為例) a. 配置檔案:sqlMapConfig.xml 配置事務 (開啟駝峰規則mapUnderscoreToCamelCase、 設定別名typeAlias) 資料來源:池化的一般POOLED Mapper對映 b. POJO物件、Mapper物件、Mapper.xml c. 建立SqlSessionFactory(執行緒安全)物件獲取SqlSession(執行緒不安全) d. SqlSession執行Mapper對應的方法 2. Mapper.xml中涉及的問題? a. 名稱空間namespace:與定義的介面一致:包名.類名 b. #{}與${}的差別:#有預編譯效果,能用#就用 $相反 c. sql中的特殊字元:比如按照<、>來查詢,用<![CDATA[age<=#{age}]]> d. 動態sql: 共享一段sql語句:比如欄位名 :

方式一 一條sql語句:使用巢狀結果對映來處理重複的聯合結果的子集 select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id} 方式二 兩條sql語句:通過執行另外一個SQL對映語句來返回預期的複雜型別 select * from class where c_id=#{id} SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id} 一對多:

方式一 一條sql語句:使用巢狀結果對映來處理重複的聯合結果的子集 select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.C_id=s.class_id and c.c_id=#{id} 方式二 兩條sql語句:通過執行另外一個SQL對映語句來返回預期的複雜型別 select * from class where c_id=#{id} SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id} SELECT s_id id, s_name name FROM student WHERE class_id=#{id} 3. 通用Mapper與MybatisMapper? 通用Mapper: ORM思想Object Relational Mapping 物件關係對映 POJO和資料庫欄位對映 JDBC-JPA思想:持久化API 實現OOP操作資料庫 公共泛型 4. mybatis攔截器?

京淘專案技術點(大型高併發專案技術點)

  1. 電子商務網站專案特點? a. 分散式:把任務分發下去,然後將結果回收,得到最終結果。這樣一種演算法。 把一個非常巨大的問題分成許多小的部分,然後把這些部分分配給許多計算機處理,最後把這些計算結果綜合起來,得到最終結果。 專案結構: 將按功能模組拆分為不同的專案,便於開發管理,降低耦合! 特點: 分佈性、通訊性、穩健性 拆分方式: 垂直拆分:按功能拆分:parent+common+SSO+web+cart+order 水平拆分:按層級拆分:以介面為準 RPC呼叫 b. 高併發:同一時間內大量使用者訪問伺服器。鐵路12306、雙11、大學選課;2000/s tomcat能處理150/s的訪問量 部署15臺tomcat伺服器 c. 叢集:搭建叢集是抗擊高併發的有效策略 多個伺服器集中起來一起進行服務處理,在客戶端看起來只有一臺伺服器。 平行計算、高速計算 負載均衡(HA)+高可用(故障遷移) d. 海量資料: 檢索、快速處理 策略:資料轉儲/分庫分表/升級硬體
  2. 京淘Mini開發工具: EasyUI使用者網頁開發工具 PowerDesigner主流資料庫建模、關係物件視覺化工具。可以生成動態SQL
  3. Restful風格實現動態傳參:{}[email protected]
  4. 富文字編輯器實現圖片上傳: 實現步驟: a. 開啟多媒體標籤: b. 檔案上傳檢視解析器:org.springframework.web.multipart.commons.CommonsMultipartResolver c. 控制層 引數MultipartFile image(必須和頁面提交的一致) 方法 d. 業務層 操作上傳 a) 判斷圖片型別:轉小寫、正則匹配字尾、獲取長寬。 b) 分儲:Date獲取SDF格式yyyy/MM/dd的路徑 c) 動態生成檔名儘量不重複:UUID+三位隨機數 d) 實現檔案上傳:image.transferTo(new File(路徑/檔名)),到這裡基本完成了上傳 e) 進一步封裝長寬屬性,便於返回以及頁面呼叫 f) 設定虛擬路徑 測試是Nginx代理伺服器,為的是頁面回顯
  5. Nginx反向代理伺服器? a. 什麼是Nginx?什麼是反向代理?輕量級的web伺服器:處理請求返回響應 反向代理通俗的將就是:代理拿到請求後,代替我使用者去訪問,拿到資料後返回給我使用者。 Nginx乾的就是這個事:特點,記憶體小,併發能力強。支援最高5w/s,實際3w/s的訪問, nginx為什麼比apache快? Nginx 採用 epoll 模型,非同步非阻塞。多路複用。一個任務多個程序接受處理 Apache 採用select模型,同步阻塞IO。單路單用。一個任務一個程序接受處理 Nginx相對的缺點:不能處理動態請求、只適合靜態和反向代理 使用Nginx的網站:百度、京東、新浪、網易。 b. Nginx中的程序? 主程序:提供代理訪問。守護程序:防止主程序意外關閉。 c. Nginx中的針對tomcat的負載均衡策略: 輪詢、權重、IP_hash(IPhash後繫結到某一臺tomcat上,生效級別高於輪詢權重,Session黏著/共享,依然可能負載不均:改進方式單點登入) 健康檢測機制類似心跳檢測
  6. 如何實現資料庫高可用?3306 grant 許可權 on 資料庫名.表名 to ‘使用者名稱’@‘web伺服器的ip地址’ identified by ‘密碼’; 開啟資料庫許可權sql:grant all on . to ‘username’ @ ‘IP地址’ identified by ‘password’; 高可用: Amoeba/Mycat 資料庫的冷備份:定期備份,拷貝 資料庫的熱備份:實時備份,同步 修改配置檔案my.cnf:mysql資料的儲存路徑、編輯訪問項的mysql日誌檔案+重啟sql服務 Sql命令實現主從掛載 a. Show master status b. #實現主從掛載 IP/埠/使用者名稱/密碼/二進位制檔案/位置 change MASTER to MASTER_HOST=“192.168.126.162”, MASTER_PORT=3306, MASTER_USER=“root”, MASTER_PASSWORD=“root”, MASTER_LOG_FILE=“mysql-bin.000001”, MASTER_LOG_POS=120 c. 啟動命令 Start salve啟動 Stop slave檢測 Show slave status檢視 d. 雙機熱備 負載均衡: 讀寫分離: Amoeba:高可用、讀寫分離,繁瑣要改一堆配置檔案 Mycat:高可用、讀寫分離,分庫分表,操作簡單、心跳檢測機制 分庫分錶針對海量資料提出:根據業務垂直拆分、根據表水平拆分
  7. Redis快取服務是什麼?談談你對Redis的理解?6379 Redis一個開源免費的Key-Value的儲存系統,標準稱資料結構伺服器。 解決了什麼問題? “資料庫備份”有效地降低資料庫的訪問壓力,儲存在記憶體中讀取非常快!讀11w/s寫8w/s 特性:永續性、支援多種資料模型、支援master-slave模式 底層實現: 雜湊槽儲存資料16384個槽 a. Redis支援的型別? String型別、Hash型別、List型別、 b. 專案實現思路:操作API:jedis、objectMapper 以查詢為例, 第一次點選查詢,先查詢快取,返回null。 查詢資料庫,得到物件,返回給使用者,並且把物件轉化成JSON串存到redis中。 接下來查詢,訪問redis,得到JSON串,轉化成java物件就可以return了 c. Redis分片(分片1+1+1=3跟叢集111=1的區別) 多個redis動態擴容,對外看起來仍只有一個redis,如果一臺宕機只損失1/n的快取資料,一般不允許出現節點宕機丟失資料 需要在配置檔案裡寫大量bean配置redis.clients.jedis.JedisShardInfo 分片時採用雜湊一致性演算法 均衡性:要求資料儘量平均分佈在各個節點,虛擬節點進行資料平衡 單調性:當節點的個數增加,原有的節點的掛載會自動的發生變化.將滿足條件的資料自動的掛載到新的節點中. 分散性:由於分散式的專案部署,導致專案不能全部獲取node節點,一個key對應多個value 負載:負載是從另一個角度談論分散性,一個位置對應多個key,在分散式應用時,應該使用全部的node節點,避免出現這樣的現象. d. Redis的主從配置?資料備份 命令:在redis客戶端中執行127.0.0.1:6381> SLAVEOF 192.168.126.166 6379 e. Redis的哨兵配置?高可用 在中從配置基礎上,推選機制 f. Redis中的持久化策略?記憶體斷電會丟失資料、資料持久化 RDB預設定期持久化、效率高、可能丟失資料:記憶體資料的快照,允許資料丟失情況 推薦 AOF 手動開啟、每秒持久化效率低:記錄使用者的全部執行過程、檔案越來越大效率低、儘可能不丟失資料 g. Redis中的記憶體策略?永久可寫的問題 LRU演算法:設定超時時間,使用較少的資料進行刪除。 h. Redis叢集搭建?解決綜上問題 整合分片和哨兵機制 redis叢集中每個節點多可以與其他節點進行通訊.同時叢集內部有心跳檢測.如果節點發生宕機的現象.由所在叢集的全部伺服器負責推選.保證服務的正常執行. 使用ruby工具管理redis叢集. 在redis根目錄執行 ./src/redis-trib.rb create --replicas 2 192.168.126.166:7000 192.168.126.166:7001 192.168.126.166:7002 192.168.126.166:7003 192.168.126.166:7004 192.168.126.166:7005 192.168.126.166:7006 192.168.126.166:7007 192.168.126.166:7008 Redis叢集:簡單記,三主(主節點)六從(節點), 叢集中如果主機宕機,那麼從機可以繼續提供服務,當主機中沒有從機時,則向其他主機借用多餘的從機.繼續提供服務.如果主機宕機時沒有從機可用,則叢集崩潰.

i. 關於快取你瞭解多少? 快取穿透:訪問不存在的資料 攔截 快取擊穿:快取Key失效時高併發訪問該key 快取雪崩:大量的快取擊穿 腦裂:推選機制推選出多臺主機 :解決技術臺+多量/強制殺死一臺,再復活,成為小弟 j. Spring整合Redis? 屬性檔案properties: 配置檔案xml:bean物件 注入配置檔案 注入配置字首 注入redis配置檔案 8. 偽靜態介紹? 以html靜態頁面展現形式的動態頁面技術 開通雙向通道: springmvc-web .html springmvc-web /service/ .html 該操作攔截所有以.html結尾的請求 /service/ 該配置攔截所有以/Service開頭的請求 9. js跨域問題/js同源策略 安全策略 如果請求的協議://域名:埠都相同則是同源訪問,可以訪問資料。除此之外都是禁止直接通訊。 跨域實現: 使用Jsonp實現 JSONP是json的一種是用模式,解決主流瀏覽器跨域資料訪問的問題 利用script標籤的src屬性可以實現跨域。關鍵字callback 實現步驟: 頁面$.ajax{dataType:”jsonp”}設定返回型別是jsonp Controller端 使用 MappingJacksonValue API 10. SSO單點登入的實現? JS跨域訪問技術+Cookie+httpClient+Redis+md5加密 是什麼? Single Sign On 一次登入可以訪問所有的的應用系統 解決什麼問題? 傳統的方式url重寫、IP_hash是將登入資訊儲存到一臺伺服器上,無法實現資訊共享。 具體實現: 1) Web伺服器拿到使用者名稱+發起密碼httpClient請求到SSO 2) SSO 先DigestUtils.md5Hex(密碼),根據使用者名稱+MD5密碼查詢資料庫。合法使用者。 3) SSO 根據使用者名稱(加點東西)md5加密運算生成token+合法使用者物件轉化成userJSON串 4) SSO Jedis.set(token,3600247,userJSON),並將token返回到web伺服器 5) Web伺服器把token存到Cookie中cookie(“ticket”,token),並反饋給使用者登入成功。 6) 當用戶點選到別的系統,AJAX從cookie拿著token發起請求到SSO 7)SSO查詢redis比對該token是否存在,反饋使用者已登陸 8)使用者登出操作:只需要把redis和cookie中的token殺死即可cookie.setMaxAge(0) jedis.del(token) cookie+Redis實現使用者名稱密碼共享 11. httpClient的實現? 是什麼? 支援http協議,支援用java發起http請求協議的工具包。 幹什麼的 請求的二次處理根據請求在應用內再發起一次請求返回資料 在哪裡用到了? 一般處理資料訪問不會在多個專案存在同樣的處理。都要用httpClient發起二次請求,統一交給一個專案處理。比如,前端系統在購物車、訂單的查詢入庫操作都要可交給對應的cart系統或者order系統。 具體實現 1)屬性檔案: 2)Xml配置bean 3)Common工具包內注入bean物件,定義有關psot、get請求的方法及其過載方法 @Autowired(required=false) private CloseableHttpClient httpClient;//在xml中配置注入的屬性 @Autowired(required=false) private RequestConfig requestConfig; //在xml中配置注入的屬性 public String doPost/Get(String url,Map<String,String> params, String charset) 設定字符集 獲取請求實體 引數處理 發起請求獲取結果 判斷結果 返回 4)業務端發起請求得到資料轉化成物件ObjectMapper 12. 許可權控制實現?MVC攔截器+ThreadLocal 規定:如果使用者沒有登陸.則不能直接訪問購物車列表資料/訂單資料/物流資料等.跳轉登入 實現:使用SpringMVC提供的攔截器+ThreadLocal可以實現在一個執行緒內實現資料共享 首先判斷使用者是否登入 判讀使用者是否有cookie 根據token資料檢測redis快取中是有使用者資訊 如果使用者沒有登陸則轉化到使用者登陸頁面.如果使用者已經登陸則攔截器放行 配置攔截器: ThreadLocal介紹: 說明:使用ThreadLocal可以實現在一個執行緒內實現資料共享.它是JDK元素提供的API.並且內部實現時執行緒是安全的.

說明:一般使用ThreadLocal傳遞資料都是公用的資料.ThreadLocal底層實現時.利用JVM底層直接建立的執行緒.所以gc(垃圾回收器)不能回收該執行緒.所以一般使用完之後需要手動關閉.否則必然記憶體洩漏. Dubbo專案知識點

  1. Dubbo微服務有哪些好處?談談你對Dubbo的理解?Dubbo是什麼? 是什麼? Dubbo是 阿里巴巴公司開源的一個高效能優秀的服務框架(SOA),應用通過RPC實現服務通訊,可以和Spring框架無縫整合。 幹了啥? 分散式解決單體架構笨重的問題:功能模組耦合問題 維護麻煩:bug定位到底是哪個模組出了問題 擴充套件僵硬:整體擴充套件VS單個模組擴充套件 上線笨拙:一起上線VS單個模組上線 最重要的兩件事情:服務動態發現、序列化,反序列化。 Dubbo的缺點: a、效能,分散式系統是跨程序,跨網路的,效能很受網路延遲和頻寬的影響。 b、可靠性:由於高度依賴網路狀況,任何一次遠端呼叫都可能失敗。 c、運維成本:一個系統拆成了多個服務,每個服務都得配置,部署,監控,日誌處理
  2. RPC是什麼?談談你對RPC的理解? RPC在分散式的專案中實現系統內部的通訊,是一種跨程序呼叫。客戶機(請求程式)+伺服器模式(服務程式)對比HttpClient? 從ControllerService轉變為ControllerInterfaceService的模式
  3. Zookeeper是什麼?談談你對Zookpeer的理解?Zookpeer和eurake有什麼不同? ZooKeeper是一個分散式應用程式協調服務,為分散式的程式應用提供一致性服務:配置維護、域名 說明:當zk如果宕機後,消費者能否正確訊息??? 答案:可以 因為zk會動態的向客戶端更新服務列表資訊.當zk宕機後,由於之前已經同步了zk的服務列表資訊,所以客戶端可以按照自己已經快取的清單進行訪問.如果在這個期間服務端程式發現宕機現象,那麼則訪問故障機時由於不能通訊,則等待超時時間,則訪問下一臺伺服器. 如果這時,所有的服務端程式都宕機,則整個服務陷入癱瘓. CAP定理

註冊中心業務,CP好呢?還是AP好呢? 註冊中心特點,註冊到註冊中心資訊不回頻繁發生變化?不頻繁 分散式系統設計定理,P分割槽容錯性必須實現,實現方式AP側重可用性,CP側重一致性

Zookeeper支援叢集,主從結構(leader,follows)zk節點如果有半數節點宕機,此時zk叢集不讓用。Zk如果在選舉過程中,也不能使用。

Eureka也支援叢集,點對點,每兩個點互為主從。哪怕剩下最後一個節點,仍然能繼續訪問。最後這個節點宕機,照樣用。Server和client,client本地有快取!Eureka寧可錯誤,也要試試。

  1. SOA面向服務的架構(Service-oriented architecture)是一個元件模型,它將應用程式的不同功能單元(稱為服務)通過這些服務之間定義良好的介面和契約聯絡起來。介面是採用中立的方式進行定義的,它應該獨立於實現服務的硬體平臺、作業系統和程式語言。這使得構建在各種各樣的系統中的服務可以以一種統一和通用的方式進行互動。 訊息佇列RabbitMQ
  2. 什麼是RabbitMQ?談談你對RabbitMQ的理解?使用Rabbit有什麼好處? 是什麼? 本身是應用程式之間的一種通訊方法,一頭不斷讀取資料,一頭不斷提供資料,經常配合RPC一起使用。Erlang語言編寫 幹什麼? 緩解後臺伺服器的壓力,解決通訊流量暴增的問題: 削鋒填谷 應用場景? 商品秒殺業務 解決方式? 非同步處理
  3. Rabbit工作的幾種模式? a. 簡單模式:一吞一吐 問題:消費處理者太少,容易擁堵 b. 工作模式:一吞多吐 c. 釋出訂閱模式:如果生產者傳送訊息,那麼訂閱的全部消費者都會執行訊息. 一個訊息被多個訂閱者處理 工作模式:每個消費者得到訊息是不一樣的。

訂閱模式:每個消費者得到的訊息是一樣的,

d. 路由模式:路由模式是釋出訂閱模式的升級,通過定義不同的路由key使得程式將訊息傳送到不同的佇列中. 訂閱模式:每個消費者收到的訊息都一樣 路由模式:每個消費者收到的訊息不一樣 e. 主題模式:可以通過路由key將訊息傳送到一類相同的key中 使用萬用字元實現 #號:表示任意字元(任意個.) *號:任意單個字元或者片語(單個.) 全文檢索 3. 談一談你對全文檢索概念的理解?全文檢索是什麼?使用全文檢索有什麼好處? 是什麼? 全文檢索是一種資訊檢索技術,把非結構化的資料轉化為結構化的資料,形成目錄提供搜尋的技術。 幹什麼?那些產品? 資料庫快速定位。 我用過的Lucene、solr兩個核心技術點: 分詞:IK分詞器,對字、詞進行深加工 key值+value 索引:把K-V整理生成目錄 a. Lucene和solr對比? Lucnen缺點:查詢效率低、不能同步、生成索引慢 b. solr是一個獨立的企業級搜尋應用伺服器,它對外提供類似於Web-service的API介面。使用者可以通過http請求,向搜尋引擎伺服器提交一定格式的XML檔案,生成索引;也可以通過Http Get操作提出查詢請求,並得到XML格式的返回結果. 基於Lucene的全文搜尋伺服器。同時對其進行了擴充套件,提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴充套件並對查詢效能進行了優化,並且提供了一個完善的功能管理介面,是一款非常優秀的全文搜尋引擎。 特點:效能快、同步 Docker 4. 什麼是Docker?談談你對Docker的理解? 是什麼? 開源的應用容器引擎 幹什麼? 相同大量應用部署快速秒級實現 5. Docker五大要素

  1. 沙箱:隔離,將應用之間的必要資源隔離開,防止互相影響,應用之間互相獨立。

  2. 映象:模板,centos+tomcat+mysql+redis,映象可以拆分,傳輸用dockerfile

  3. 容器:映象的例項,映象只讀,容器可寫,容器中可以儲存應用產生的零時檔案

  4. 資料卷:掛載到容器上,用於儲存必要資料。比如容器中資料庫的資料,但是不建議用,因為重啟容器需要掛載同步資料,效率較慢,解決方式:資料庫拆分

  5. 倉庫:與maven倉庫概念一致,應用都會儲存在倉庫中,建立容器是根據映象的規定進行拉取,可以共享。 SpringCloud+SpringBoot

  6. 談談你對SpringBoot的理解? 是什麼? 全新框架簡化新Spring應用的初始搭建以及開發過程。幫我們整合了三大框架SSM 註解+約定大於配置 自帶parent父工程,統一管理jar 嵌入式tomcat 簡化Maven配置,新的yml(樹型結構)配置檔案 Main函式啟動

  7. SpringCloud全家桶 微服務有兩個解決方案: Servlet茅草房,SSM三大框架 一間房,dubbo一套高階套房三室兩廳,springcloud別墅 Dubbo阿里,3.0支援stream。將來我只是springcloud一個子集,只專注於RPC解決方案 1) Dubbo 基於RPC,hession序列化演算法,壓縮,二進位制,長連結 2) springCloud 基於REST+json,httpclient 效能:dubbo遠遠超過springCloud 異構開發語言支援:springcloud使用json

  8. SpringCloud全家桶 a) Eureka註冊中心 CAP定理:構建分散式系統,必須實現P,有兩種選擇CP,AP C一致性,mysql、oracle、sqlserver DRMS。資料要有唯一出處。外來鍵。 A可用性,哪怕資訊已經舊的。 P 分割槽容錯性。 Eureka適合註冊中心,還是ZooKeeper? 針對註冊中心特點,註冊資訊會頻繁發生變化,不會。 Eureka設計目標AP,ZooKeeper設計目標CP。這時針對註冊中心業務,Eureka更加合適。 b) Ribbon前端負載均衡器 Ribbon和Nginx比較? Nginx反向代理,Ribbon可以在訪問消費者本地增加快取,客戶端發起請求前,它的路徑已經決定。 Nginx沒有故障處理,也就是說,它代理某個服務宕機,或者無法訪問。它不能告訴程式,程式呼叫才出錯,等一會(超時時間),丟擲異常。Ribbon依賴Eureka動態列表。Eureka客戶端有向服務端定時發心跳,如果客戶端閥值(幾次機會)之後,宣佈服務死亡,Eureka會把其服務從列表中移除。Eureka客戶端它的心跳處理時,順便判斷列表有無更新。如果判斷有更新,從新獲取一個新的資料。 c) Feign宣告式 RESTFul形式支援,RestTemplate,介面更加方便。Jdk動態代理($ProxyN) cglib動態代理(CGLIB)。 以介面形式體現,介面和業務掛鉤,業務程式設計師必須自己做。做介面同時對業務更加了解。遮蔽複雜API學習成本。

  9. SpringCloud a) Hystrix斷路器、熔斷器,寫一個fallback方法,當程式失敗時,不像傳統程式,try/catch。提示極其不友好(失敗)。它實現程式異常時,回撥這個開發者自己寫的方法。方法內返回預設值(預案)。防止分散式微服務結構出現雪崩。 b) 微服務雪崩:很多服務組成一起完成一個業務,其中可能某一個服務出現異常,依賴它的這些服務都被阻塞。服務池溢位,所有服務都無法正常完成,就發生雪崩。Hystrix很好來解決雪崩問題。發現異常,快速嘗試如果失敗立即返回去呼叫fallback方法。給預設值返回使用者。這些呼叫微服務,呼叫完成。清理現場,釋放資源。 c) Zuul API閘道器,授權、快取、統一入口管理。配置對映。在application.yml Zuul路由,設定一個路徑,路徑作用就是分成不同模組。配置不同許可權。 d) NodeJS 基於chrome v8,號稱目前為止解析js最快引擎。成為一個js解析引擎。類似tomcat。 e) Sidecar本質,類似nginx配置一個連線而已。遮蔽技術壁壘。Web開發,url HTTP

  10. Git版本控制

  11. STS eclipse-spring,建立一個真正springboot專案

  12. springCloud-config配置中心:動態讀取配置資訊

    問題: 字串排序/比大小 SSO:Token攻擊如何解決:ip校驗 資料庫查詢內外關聯查詢的區別、篩選條件語句