Spring
1.支持我們現(xiàn)在流行的POJO的開發(fā)方式楣铁、也支持老的JavaBean的開發(fā)方式挂据;
2.面向切面編程最好的理解:Aspect Oriented Program, 我們在兩個類中拴签,可能都需要在每個方法中做日志塑崖。按面向?qū)ο蟮脑O(shè)計方法贷腕,我們就必須在兩個類的方法中都加入日志的內(nèi)容侵俗。也許他們是完全相同的锨用,但就是因為面向?qū)ο蟮脑O(shè)計讓類與類之間無法聯(lián)系,而不能將這些重復(fù)的代碼統(tǒng)一起來隘谣。我們可以將這段代碼寫在一個獨立的類獨立的方法里增拥,然后再在這兩個類中調(diào)用。但是寻歧,這樣一來掌栅,這兩個類跟我們上面提到的獨立的類就有耦合了,它的改變會影響這兩個類码泛。
3.什么叫聲明式事務(wù)猾封?就是通過配置就能實現(xiàn)事務(wù)回滾,而不需要自己編程實現(xiàn)噪珊;還意味著你的業(yè)務(wù)代碼和事務(wù)管理是分離的晌缘;之所以Spring可以進行事務(wù)管理,其實是依賴數(shù)據(jù)庫本身的事務(wù)管理痢站,是通過binlog或者redo log實現(xiàn)的磷箕;最細粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別阵难;
4.什么叫Spring降低了JavaEE API的使用難度岳枷?因為Spring對JavaMail等進行了很好的封裝;
5.為什么說Spring是非侵入式框架呜叫?因為Spring只是為了把類注入空繁,對代碼的干擾比較少;更專業(yè)的說法是:Spring框架對程序代碼的影響兄烨臁盛泡;
6.Spring中的設(shè)計模式?這個確實挺難懂的椎工;(我自己的理解就是可復(fù)用的模式、可復(fù)用的編程方案)
[Design Pattern is] a solution to a problem in a context.也就是說,設(shè)計模式是針對特定上下文的特定問題的解決方案维蒙,這種解決方案被抽象化掰吕、模版化,就是設(shè)計模式颅痊。
1)單例模式 Singleton
Spring推薦將所有業(yè)務(wù)邏輯組件殖熟、DAO組件、數(shù)據(jù)源組件等配置為單例的行為方式斑响;
Spring從容器中取一個對象(或者說類的實例)菱属,默認是單例模式,即不會每次創(chuàng)建新對象舰罚,除非是下面這種情況:
<bean id="date" class="java.util.Date" scope="prototype">
減少創(chuàng)建Java實例所帶來的系統(tǒng)開銷纽门;便于系統(tǒng)跟蹤;
2)裝飾模式 Decorator / Wrapper
Spring中用到的裝飾模式在類名上有兩種表現(xiàn):一種是類名中含有Wrapper营罢,另一種是類名中含有Decorator赏陵,基本上都是動態(tài)地給一個對象添加一些額外的職責(zé)。
3)觀察者模式 Observer
Spring把多個訂閱者稱為觀察者饲漾,在Spring里指的就是Listener
4)Factory 簡單工廠模式蝙搔,又叫靜態(tài)工廠模式:Static Factory Method
Spring中的BeanFactory就是簡單工廠模式的體現(xiàn),根據(jù)傳入的id來獲得bean對象考传;
理解是最好的記憶:A依賴B, 你可以直接new B, 也可以實現(xiàn)一個接口IB接口吃型,而IBFactory類來負責(zé)創(chuàng)建IB實例;
在Spring中可以通過配置XML來實現(xiàn)工廠類的修改僚楞;
最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory 勤晚,它根據(jù)XML文件中的定義加載beans;
POJO(Plain Old Java Objects)
5)代理模式 Proxy
Spring的Proxy模式在aop中有體現(xiàn)镜硕,主要是控制运翼,跟Decorator不同的是
Spring AOP - Aspect Oriented Program
自定義攔截器、切點兴枯;
6)適配器模式 Adapter
Spring中的DispatchServlet
7)工廠方法 Factory Method
通常由應(yīng)用程序直接使用new創(chuàng)建新的對象血淌;
而工廠模式跟簡單工廠模式很類似,只是不同的工廠生產(chǎn)不同的對象财剖;
8)模板方法
模板方法:用來解決代碼重復(fù)的問題悠夯。比如. RestTemplate, JmsTemplate, JpaTemplate
7.你怎么把IOC控制反轉(zhuǎn)和依賴注入
Spring IOC 負責(zé)創(chuàng)建對象,管理對象(通過依賴注入DI)躺坟,裝配對象沦补,配置對象,并且管理這些對象的整個生命周期咪橙;
控制反轉(zhuǎn)(IoC)有什么作用:管理對象的創(chuàng)建和依賴關(guān)系的維護(必須通過依賴注入)
Spring 中的 IoC 的實現(xiàn)原理就是工廠模式加反射機制夕膀,工廠模式好理解:你需要不同的類虚倒,反射模式也好理解:依賴注入就靠反射;
什么是依賴注入:從 XML 的配置上說产舞,即 ref 標(biāo)簽魂奥。對應(yīng) Spring RuntimeBeanReference 對象;
對于 IoC 來說易猫,最重要的就是容器耻煤,容器管理著 Bean 的生命周期,控制著 Bean 的依賴注入准颓;
8.BeanFactory 和 ApplicationContext有什么區(qū)別哈蝇?
ApplicationContext是BeanFactory的子節(jié)點,包含更多的細節(jié):
繼承MessageSource攘已,因此支持國際化炮赦;
統(tǒng)一的資源文件訪問方式;
提供在監(jiān)聽器中注冊bean的事件贯被;
同時加載多個配置文件眼五;
載入多個(有繼承關(guān)系)上下文 ,使得每一個上下文都專注于一個特定的層次彤灶,比如應(yīng)用的web層看幼;
BeanFactroy采用的是延遲加載形式來注入Bean的;
ApplicationContext幌陕,它是在容器啟動時诵姜,一次性創(chuàng)建了所有的Bean;
BeanFactory 簡單粗暴搏熄,可以理解為就是個 HashMap棚唆,Key 是 BeanName,Value 是 Bean 實例心例。通常只提供注冊(put)宵凌,獲取(get)這兩個功能止后。我們可以稱之為?“低級容器”瞎惫;
依賴注入分為接口注入(Interface Injection),Setter方法注入(Setter Injection)和構(gòu)造器注入(Constructor Injection)三種方式译株。其中接口注入由于在靈活性和易用性比較差瓜喇,現(xiàn)在從Spring4開始已被廢棄;
9.什么是Spring beans歉糜?
Spring beans 是那些形成Spring應(yīng)用的主干的java對象乘寒;Spring beans就是Java對象;
10.Spring支持的作用域和JAVA的作用域有什么區(qū)別匪补?
缺省的Spring bean 的作用域是Singleton伞辛。使用 prototype 作用域需要慎重的思考烂翰,因為頻繁創(chuàng)建和銷毀 bean 會帶來很大的性能開銷。
11.什么是有狀態(tài)和無狀態(tài)蚤氏?
有狀態(tài)就是有數(shù)據(jù)存儲功能刽酱。view model 對象
無狀態(tài)就是不會保存數(shù)據(jù)。?dao 類
12.Spring如何處理線程并發(fā)問題瞧捌?
ThreadLocal采用了“空間換時間”的方式;
13.spring 自動裝配 bean 有哪些方式润文?
在Spring框架xml配置中共有5種自動裝配:
no:默認的方式是不進行自動裝配的姐呐,通過手工設(shè)置ref屬性來進行裝配bean。
byName:通過bean的名稱進行自動裝配典蝌,如果一個bean的 property 與另一bean 的name 相同曙砂,就進行自動裝配。
byType:通過參數(shù)的數(shù)據(jù)類型進行自動裝配骏掀。
constructor:利用構(gòu)造函數(shù)進行裝配鸠澈,并且構(gòu)造函數(shù)的參數(shù)通過byType進行裝配。
autodetect:自動探測截驮,如果有構(gòu)造方法笑陈,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配葵袭。
14.怎么區(qū)分byName, byType 以及 required=false這些術(shù)語涵妥?
這些都和@Autowired有關(guān),如果對象是一個就直接裝配坡锡,如果多個就byName這樣的方式去裝配蓬网,如果沒有這個對象就應(yīng)該配置required=false這樣才不會拋出異常;所以@Autowired不如顯式裝配精確鹉勒;
@Autowired默認是按照類型裝配注入的byType帆锋,@Resource默認是按照名稱來裝配注入的byName, name resource,只有當(dāng)找不到與名稱匹配的bean才會按照類型來裝配注入禽额;
autowired自動裝配
15.事務(wù)管理服務(wù)是誰提供的锯厢?
Spring AOP
16.什么是Spring DAO(數(shù)據(jù)訪問對象)?
使得 Mybatis, JDBC绵疲,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問技術(shù)更容易以一種統(tǒng)一的方式工作
17.何謂SpringMVC的清晰角色分析哲鸳?
DispatcherServlet - HandlerMapping - HandlerAdapter - handler - ViewResolver - view
18.Spring MVC的控制器是不是單例模式
是,且不需要通過HttpServletRequest和HttpServletRepsonse等HttpServlet獲取data
19.注解原理是什么盔憨?
Annotation是動態(tài)代理Dynamic Proxy的體現(xiàn)徙菠,是從map中取值;
20.@RequestMapping注解
consumes: 指定處理請求的提交內(nèi)容類型(Content-Type)郁岩,例如application/json, text/html;
params婿奔,headers: 對于request都是有要求的缺狠;
21.@ResponseBody注解的作用
作用: 該注解用于將Controller的方法返回的對象,通過適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后萍摊,寫入到Response對象的body數(shù)據(jù)區(qū)挤茄。
使用時機:返回的數(shù)據(jù)不是html標(biāo)簽的頁面,而是其他某種格式的數(shù)據(jù)時(如json冰木、xml等)使用穷劈;
22.Spring MVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的?
(1)轉(zhuǎn)發(fā):在返回值前面加"forward:"踊沸,譬如"forward:user.do?name=method4"
(2)重定向:在返回值前面加"redirect:"歇终,譬如"redirect:http://www.baidu.com"
23.Spring MVC怎么和AJAX相互調(diào)用的?
通過Jackson或者Alibaba的FastJson
24.如何解決POST請求中文亂碼問題逼龟,GET的又如何處理呢评凝?
POST: 在web.xml中配置一個CharacterEncodingFilter過濾器,設(shè)置成utf-8腺律;
GET:
①修改tomcat配置文件添加編碼與工程編碼一致奕短,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
②另外一種方法對參數(shù)進行重新編碼:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)
ISO8859-1是tomcat默認編碼,需要將tomcat編碼后的內(nèi)容按utf-8編碼匀钧。
25.Spring MVC的異常處理翎碑?
答:可以將異常拋給Spring框架,由Spring框架來處理之斯;我們只需要配置簡單的異常處理器杈女,在異常處理器中添視圖頁面即可。
26.怎樣在方法里面得到Request,或者Session吊圾?
在形參中聲明或以變量的形式注入就可以达椰;像HttpServletRequest, HttpServletReponse
27.如果前臺有很多個參數(shù)傳入,并且這些參數(shù)都是一個對象的,那么怎么樣快速得到這個對象?
答:直接在方法中聲明這個對象,Spring MVC就自動會把屬性賦值到這個對象里面项乒。
這個對于傳表格是很有用的啰劲;
28.Spring MVC用什么對象從后臺向前臺傳遞數(shù)據(jù)的?
答:通過ModelMap對象,可以在這個對象里面調(diào)用put方法,把對象加到里面,前臺就可以通過el表達式拿到檀何;
怎么通過EL表達式拿到很多數(shù)據(jù)蝇裤;EL expression
29.怎么樣把ModelMap里面的數(shù)據(jù)放入Session里面?
答:可以在類上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key频鉴。
這個確實沒使用過栓辜;
30.Spring MVC里面攔截器是怎么寫的
有兩種方法;HandlerInterceptor
public class BuyLoginHandlerInterceptor implements HandlerInterceptor
和繼承適配器類
31.在 Spring Boot 里面垛孔,可以使用以下幾種方式來加載配置藕甩。
1)properties文件;
2)YAML文件周荐;
3)系統(tǒng)環(huán)境變量狭莱;
4)命令行參數(shù)僵娃;
32.YAML的缺點
相比 properties 配置文件,YAML 還有一個缺點腋妙,就是不支持 @PropertySource 注解導(dǎo)入自定義的 YAML 配置:
33.什么是 Spring Profiles默怨?
pom.xml中配置 <profiles></profiles>
每種環(huán)境都對應(yīng)一個?properties?文件,然后在application.properties中配置一下要使用的環(huán)境 spring.profiles.active=dev
34.如何實現(xiàn) Spring Boot 應(yīng)用程序的安全性骤素?
使用 spring-boot-starter-security 依賴項匙睹;
35.攔截器和filter的區(qū)別
攔截器更靠后,filter更靠前济竹,攔截器一般是在Controller前后垃僚,而filter是在Servlet前;這里又是Servlet
36.什么是 CSRF 攻擊规辱?
CSRF 攻擊專門針對狀態(tài)改變請求,而不是數(shù)據(jù)竊取栽燕,因為攻擊者無法查看對偽造請求的響應(yīng)罕袋;
37.spring-boot-starter-parent 有什么用 ?
java版本、utf-8碍岔、配置等浴讯,最重要的是spring boot dependencies,那跟spring boot application有啥區(qū)別呢蔼啦?
38.Spring Boot 打成的 jar 和普通的 jar 有什么區(qū)別 ?
java -jar
39.運行 Spring Boot 有哪幾種方式榆纽?
打包用命令行運行,或放到容器中捏肢;用maven插件等運行奈籽;直接在編輯器里運行;
40.開啟 Spring Boot 特性有哪幾種方式鸵赫?
starter-parent
或者你自己導(dǎo)入spring boot dependencies
41.如何使用 Spring Boot 實現(xiàn)異常處理衣屏?
Advice, ControllerAdvice
在Spring里,我們可以使用@ControllerAdvice來聲明一些全局性的東西辩棒,最常見的是結(jié)合@ExceptionHandler注解用于全局異常的處理狼忱。
42.如何使用 Spring Boot 實現(xiàn)分頁和排序?
JPA Persistence API一睁,JPA有點像Common API, 你只需關(guān)注API的創(chuàng)建钻弄,以減少數(shù)據(jù)訪問層DAO的開發(fā);
Spring Data JPA 通過規(guī)范方法的名字者吁,根據(jù)符合規(guī)范的名字來確定方法需要實現(xiàn)什么樣的邏輯窘俺;
43.微服務(wù)中如何實現(xiàn) session 共享 ?
常見的方案就是 Spring Session + Redis 來實現(xiàn) session 共享;
44.Spring Boot 中如何實現(xiàn)定時任務(wù) ?
一個就是使用 Spring 中的 @Scheduled 注解,另一個則是使用第三方框架 Quartz
44.Spring Boot的監(jiān)控推薦复凳?
Spring boot actuator批销,Spring Boot?Admin(SBA)是一個社區(qū)開源項目洒闸,用于管理和監(jiān)視Spring Boot?應(yīng)用程序,它提供詳細的健康(Health)信息均芽、內(nèi)存信息丘逸、JVM 系統(tǒng)和環(huán)境屬性、垃圾回收信息掀宋、日志設(shè)置和查看深纲、定時任務(wù)查看、Spring Boot?緩存查看和管理等功能劲妙。
45.網(wǎng)站架構(gòu)的演變
傳統(tǒng)架構(gòu) → 分布式架構(gòu) → SOA架構(gòu) → 微服務(wù)架構(gòu)
46.SOA跟微服務(wù)的最大區(qū)別
SOA數(shù)據(jù)庫會存在共享湃鹊,微服務(wù)提倡每個服務(wù)連接獨立的數(shù)據(jù)庫;
47.Spring Cloud的組件
注冊中心(eureka)镣奋、客戶端負載均衡(Ribbon)币呵、網(wǎng)關(guān)(zull或gateway)、分布式鎖侨颈、分布式會話余赢;
前面是Ribbon后面是Gateway
Spring Cloud服務(wù)的注冊和發(fā)現(xiàn):在注冊中心通過服務(wù)別名, IP, 端口發(fā)現(xiàn)服務(wù),緩存哈垢,然后通過本地HttpClient去遠程調(diào)用妻柒;
Nginx和Ribbon的區(qū)別:Nginx主要是通過upstream在服務(wù)器轉(zhuǎn)發(fā),而Ribbon主要是基于客戶端的選擇去調(diào)用服務(wù)耘分,Ribbon的效率在負載均衡方面做得更好举塔;
SpringCloud有幾種調(diào)用接口方式:在Spring Cloud Netflix棧中,各個微服務(wù)都是以HTTP接口的形式暴露自身服務(wù)的求泰,因此在調(diào)用遠程服務(wù)時就必須使用HTTP客戶端央渣。我們可以使用JDK原生的URLConnection、Apache的Http Client渴频、Netty的異步HTTP Client痹屹,Spring的RestTemplate。但是枉氮,用起來最方便的還是要屬Feign了
48.什么是雪崩效應(yīng)志衍?avalanche
雖然Spring Cloud是不同的服務(wù)不同的數(shù)據(jù)庫,但服務(wù)之間的相互調(diào)用還是很多的聊替,服務(wù)調(diào)用斷片就會導(dǎo)致連鎖反應(yīng)楼肪,或者雪崩效應(yīng),怎么解決呢惹悄?服務(wù)隔離春叫,一旦服務(wù)不可用則返回友好提示
為什么會產(chǎn)生雪崩效應(yīng),還是tomcat的線程池全部被占用了;
服務(wù)降級:當(dāng)客戶端請求服務(wù)器端的時候暂殖,防止客戶端一直等待价匠,不會處理業(yè)務(wù)邏輯代碼,直接返回一個友好的提示給客戶端呛每;
服務(wù)熔斷是在服務(wù)降級的基礎(chǔ)上更直接的一種保護方式踩窖,當(dāng)在一個統(tǒng)計時間范圍內(nèi)的請求失敗數(shù)量達到設(shè)定值(requestVolumeThreshold)或當(dāng)前的請求錯誤率達到設(shè)定的錯誤率閾值(errorThresholdPercentage)時開啟斷路,之后的請求直接走fallback方法晨横,在設(shè)定時間(sleepWindowInMilliseconds)后嘗試恢復(fù)洋腮;
服務(wù)隔離:就是開啟一個獨立的線程池败徊;
49.Spring Boot的一些新概念:
在啟動類添加@EnableAsync表示開啟對異步任務(wù)的支持趾徽,在異步服務(wù)上添加@Async
使用@ConfigurationProperties讀取properties中的配置;
使用@MapperScan注冊到對應(yīng)的mapper包中
50.SpringBootApplication的含義奶段?
包括@EnableAutoConfiguration主要是關(guān)于SpringBoot配置和依賴包库糠;
和@ComponentScan主要是關(guān)于package包和子包下的類伙狐;
51.SpringBoot的底層原理,就是依賴瞬欧、jar包+class文件
使用maven父子包依賴關(guān)系加載相關(guān)jar包贷屎,使用java操作Spring的初始化過程生成class文件,然后用java創(chuàng)建tomcat服務(wù)器加載這些class文件黍判;
52.網(wǎng)站跨越解決方案
a、使用jsonp 缺點只能發(fā)送get請求
b篙梢、使用httpclient進行轉(zhuǎn)發(fā)顷帖,效率低
c、設(shè)置響應(yīng)頭允許跨域
d渤滞、使用Nginx搭建api網(wǎng)關(guān)
e贬墩、使用Zuul微服務(wù)搭建api接口網(wǎng)關(guān)
53.分布式Session一致性問題,主要是兩種:
d妄呕、使用Spring-Session框架陶舞,相當(dāng)于把session放到redis中
e、使用token令牌代替session绪励;我一般是使用后一種肿孵;
54.這是對反向代理最好的解釋:
代替真實服務(wù)器接收網(wǎng)絡(luò)請求,然后將請求轉(zhuǎn)發(fā)到真實服務(wù)器疏魏;
四層負載均衡有那些實現(xiàn)方案:LVS停做、F5;
lvs與keepalived區(qū)別:Lvs可以實現(xiàn)負載均衡大莫,但是無法實現(xiàn)健康檢查蛉腌。Keepalived可以進行健康檢查實現(xiàn)高可用;
keepalive 軟件可以進行健康檢查,而且能同時實現(xiàn) LVS 的高可用性烙丛,解決 LVS 單點故障的問題舅巷;
使用lvs+keepalived+Nginx做主從熱備,lvs管理nginx集群河咽,nginx管理服務(wù)器集群钠右,在服務(wù)器宕機的情況下keepalived啟動健康檢測,多次重啟無果可以短信通知運維人員及時維護库北;
55.動靜分離與前后分離區(qū)別
動靜分離是將靜態(tài)資源和動態(tài)資源存放在不同服務(wù)器中爬舰,前后分離是將前端和后臺分離,前端通過api調(diào)用后臺接口寒瓦;
56.互聯(lián)網(wǎng)高并發(fā)解決方案情屹?
304狀態(tài)碼或許不應(yīng)該認為是一種錯誤,而是對客戶端有緩存情況下服務(wù)端的一種響應(yīng)杂腰;
那么服務(wù)器集群垃你,一定能解決高并發(fā)嗎?這其實不一定喂很。
首先要分清楚高并發(fā)影響用戶的源頭惜颇?是因為帶寬不夠還是服務(wù)內(nèi)存不足?
服務(wù)帶寬指的是:客戶端與服務(wù)器傳輸?shù)膶挾鹊乃俣龋?m 等于 128kb少辣。
服務(wù)內(nèi)存指的是:服務(wù)器端處理業(yè)務(wù)能力凌摄。
那么解決高并發(fā)的入口是客戶端與服務(wù)器端傳輸帶寬速度, 如果帶寬速度不足的情況,可能會導(dǎo)致客戶端延遲等待漓帅。
一個網(wǎng)站核心 分為靜態(tài)資源(css锨亏、img、js)和動態(tài)資源(jsp忙干、ftl)組合器予,絕大數(shù)的情況下靜態(tài)資源占了整個網(wǎng)站帶寬傳輸, 這時候應(yīng)該采用網(wǎng)站動靜分 離架構(gòu)捐迫,將動態(tài)資源與靜態(tài)資源分開服務(wù)器存放乾翔,注意:網(wǎng)站跨域問題。
后端優(yōu)化方案:
可以對服務(wù)器實現(xiàn)集群 施戴、加服務(wù)配置反浓、采用 MQ 異步傳輸、使用 Redis 做緩存赞哗,減輕數(shù)據(jù)庫訪問壓力勾习、代碼優(yōu)化、數(shù)據(jù)庫采用:讀寫分離和分表分庫懈玻,程序采用多線程巧婶、jvm 參數(shù)調(diào)優(yōu)乾颁,服務(wù)實現(xiàn)保護機制(服務(wù)降級、服務(wù)隔離艺栈、服務(wù)熔斷英岭、服務(wù)限流)等。 Web 前端優(yōu)化大多數(shù)情況下湿右,屬于公司運維干的事情诅妹,后端優(yōu)化屬于架構(gòu)師做的事情,如果一個網(wǎng)站中靜態(tài)資源非常多的情況下毅人,不要將靜態(tài)資源和動態(tài)資源在同一個服務(wù)器存放吭狡,一定要采用動靜分離架構(gòu),提高網(wǎng)站的吞吐量丈莺。
#所以帶寬的問題還是要從前端去解決問題划煮,因為每個客戶的帶寬是不同的,解決服務(wù)器帶帶寬傳輸是關(guān)鍵缔俄,所以要解決服務(wù)器的問題
最后總結(jié)下弛秋,如果服務(wù)器帶寬不足的情況下,服務(wù)器接受客戶端請求資源俐载,可能會產(chǎn)生延遲蟹略,服務(wù)器做集群、加配置遏佣,效果不會很明顯挖炬,因為服務(wù)器集群只能提高服務(wù)器的業(yè)務(wù)處理能力,不能提高服務(wù)器的帶寬傳輸状婶,
所以可以采用以上總結(jié)的 Web 前端優(yōu)化方案意敛,減少客戶端與服務(wù)器端帶寬傳輸。
如果在帶寬的足夠的情況下太抓,客戶端發(fā)送請求已經(jīng)到達了后端服務(wù)器空闲,服務(wù)器端處理能力產(chǎn)生延遲令杈,那么采用以上總結(jié) 后端優(yōu)化方案 服務(wù)器集群走敌、加服務(wù)器配置等。
之前有一位學(xué)員問逗噩,app 客戶端遇到高并發(fā)掉丽,是采用后端優(yōu)化還是前端優(yōu)化,app 屬于 cs 架構(gòu)异雁,靜態(tài)資源在打包的時候已經(jīng)在安裝包里面捶障,不需要遠程獲取,業(yè)務(wù)邏輯需要遠程調(diào)用接口纲刀,獲取 json 數(shù)據(jù)進行解析项炼,讓后展示數(shù)據(jù),所以 app 客戶端產(chǎn)生的高并發(fā),核心在于后端優(yōu)化
57.注解詳解 Type Policy
其實注解的起源很早就有了 JAVA5.0就引入了锭部,內(nèi)置的注解:@SuppressWarnings - 指示編譯器去忽略注解中聲明的警告暂论。我確實應(yīng)該對所有的JAVA技術(shù)或者Spring技術(shù)要有一個總結(jié);
(01) 1 個 Annotation 和 1~n 個 ElementType 關(guān)聯(lián)拌禾。
可以理解為:對于每 1 個 Annotation 對象取胎,可以有若干個 ElementType 屬性
ElementType 是 Enum 枚舉類型,它用來指定 Annotation 的類型湃窍;
RetentionPolicy 是 Enum 枚舉類型闻蛀,它用來指定 Annotation 的策略。通俗點說您市,就是不同 RetentionPolicy 類型的 Annotation 的作用域不同觉痛;
若 Annotation 的類型為 SOURCE,則意味著:Annotation 僅存在于編譯器處理期間墨坚,編譯器處理完之后秧饮,該 Annotation 就沒用了。 例如泽篮," @Override" 標(biāo)志就是一個 Annotation盗尸。當(dāng)它修飾一個方法的時候,就意味著該方法覆蓋父類的方法帽撑;并且在編譯期間會進行語法檢查泼各!編譯器處理完后,"@Override" 就沒有任何作用了亏拉;
自定義的注解:
@Target(ElementType.TYPE) 的意思就是指定該 Annotation 的類型是 ElementType.TYPE扣蜻。這就意味著,MyAnnotation1 是來修飾"類及塘、接口(包括注釋類型)或枚舉聲明"的注解莽使。
定義 Annotation 時,@Target 可有可無笙僚。若有 @Target芳肌,則該 Annotation 只能用于它所指定的地方;若沒有 @Target肋层,則該 Annotation 可以用于任何地方亿笤。
58.Scheduling 是專注于定時任務(wù)調(diào)度的框架,但 Spring Task 不僅僅是這一塊
59.Spring Boot的一些工具栋猖?
Selenium净薛,Mockito,Cucumber蒲拉,https://blog.51cto.com/u_10180481/3001766
60.微服務(wù)之間的調(diào)用到底是通過什么來調(diào)用肃拜?
每個服務(wù)為獨立的業(yè)務(wù)開發(fā)痴腌,一個微服務(wù)一般完成某個特定的功能,比如:訂單管理燃领,用戶管理等衷掷;
微服務(wù)之間通過一些輕量的通信機制進行通信,例如通過REST API或者RPC的方式進行調(diào)用柿菩;
SpringBoot實際上就是一個Spring MVC應(yīng)用戚嗅;
61.Docker和Kubernetes的區(qū)別到底有啥?
容器化部署的 Docker枢舶,容器編排的 Kubernetes懦胞,這些都是在解決微服務(wù)的治理問題;
62. Spring Boot的日志實現(xiàn)?
Spring Boot 默認集成的日志框架是 SLF4J凉泄,日志實現(xiàn)是 Logback躏尉;
從低到高:trace(跟蹤)、debug(調(diào)試)后众、info(信息)胀糜、warn(告警)、error(錯誤)蒂誉,這是越來越嚴(yán)重教藻;
如果開發(fā)團隊用了 lombok 來簡化代碼,則是在類上加注解 @Slf4j右锨,然后代碼里直接用 log 進行日志輸出括堤;
從這里也可以看出來,為什么很多人會反對用 lombok绍移,上述代碼里的 log 是直接蹦出來的悄窃,沒有定義,影響了代碼的“可讀性”蹂窖;
63.Spring Boot的部署
事實上 Spring Boot 還有一個默認的配置文件 bootstrap.yml轧抗,它比 application.yml 優(yōu)先加載,所以可以配置一個 bootstrap.yml 來指定 profile瞬测,然后結(jié)合多個 application-*.yml 來工作横媚;
有了 jar 文件和 actuator 的加持,要部署和監(jiān)控基于 Spring Cloud 開發(fā)的微服務(wù)涣楷,在技術(shù)上已經(jīng)可行了:
nohup java -jar -Xms64m -Xmx512m someone.jar >> ./logs/nohup.out 2>&1 &
從直接運行 jar 包分唾,到編寫腳本執(zhí)行部署抗碰,到容器化部署(Docker)和容器編排(Kubernetes)狮斗,在應(yīng)用的部署上,我們算是走得越來越遠了(越來越復(fù)雜)弧蝇;
Kubernetes 沒有固定要求容器的格式碳褒,但是?Kubernetes?使用它自己的 API 和命令行接口來進行容器編排折砸。除了?Docker 容器之外,Kubernetes 還支持其他多種容器沙峻;
Swarm和Kubernetes比較類似睦授,但是更加輕,具有的功能也較kubernetes更少一些摔寨;
k8s+istio會成為微服務(wù)架構(gòu)的主流去枷,部署相對困難;
64.Java持久層怎么選擇是复?
其實可以在一個項目在同時支持 mybatis 和spring-data-jpa删顶,復(fù)雜SQL走 mybatis,常用SQL走 spring-data-jpa淑廊;
想用哪個用哪個吧逗余,現(xiàn)在基本都是簡單sql了,業(yè)務(wù)都在代碼中做的季惩,目前大部分录粱,都是直接撈數(shù)據(jù),代碼做業(yè)務(wù)画拾,不過推薦mybatis-plus啥繁,或者jdbcTemplate(transactionTemaplte),越簡單越好青抛,查詢一個數(shù)據(jù)別搞太多花樣输虱;推薦Common Mapper,撈數(shù)據(jù)嘛脂凶,這個最簡單宪睹,連SQL語句都不用寫;mybatis-plus本質(zhì)基于mybatis蚕钦,通用mapper亦是如此亭病。相當(dāng)于增強,CURD快速開發(fā)嘶居。
主要是說下mybatis-plus和通用mapper罪帖。我個人的話,推薦通用mapper邮屁,以下是原因:mapper的輕快小巧整袁,恰巧滿足我的需求。復(fù)雜的SQL佑吝,老老實實寫到XML里面去坐昙,浪費不了幾個時間,出問題后排查也容易排查
一切問題如果不談場景就是耍流氓芋忿。
對于簡單的場景炸客,用Hibernate或者Mybatis都可以疾棵。
對于業(yè)務(wù)復(fù)雜的場景:對象建模優(yōu)先(在這個階段不需要考慮用的是mysql,sqlserver還是postgres),然后根據(jù)這個對象的模型生成數(shù)據(jù)庫表. 如果遇到性能調(diào)優(yōu)問題或者多表關(guān)聯(lián)查詢或者嵌套查詢怎么辦痹仙?單獨寫規(guī)則
65.Springboot開發(fā)先寫service還是controller?
個人覺得是尔,接口定義還是必須放在第一步的。接口都不明確开仰,service就不知道該怎么寫了拟枚。需求不明確這是管理者或溝通協(xié)調(diào)上的問題;
要滿足持續(xù)交付众弓,對于不明確的需求梨州,就是可能以后這個功能會改變,那么暫時可以用最簡單的方法先實現(xiàn)田轧,一些關(guān)鍵的權(quán)限或可能會修改的地方做開關(guān)暴匠。
66.什么是stream?
stream是對集合對象功能的增強,aggregation operation或bulk data operation
不是集合傻粘,更不是數(shù)據(jù)結(jié)構(gòu)每窖,是高級版本的iterator
一般在開發(fā)中集合中的元素都是從數(shù)據(jù)庫中查詢的,為什么還要用stream?
Stream流更適合的是在多數(shù)據(jù)源的情況下使用弦悉,特別是分庫分表的情況下窒典,或是從不同的數(shù)據(jù)庫里得到的數(shù)據(jù),這樣基本上是要走數(shù)據(jù)聚合的方式
Stream就好比流水從面前流過稽莉,一去不復(fù)返
每次轉(zhuǎn)換原有 Stream 對象不改變瀑志,返回一個新的 Stream 對象(可以有多次轉(zhuǎn)換);
67.@Configuration的作用
注冊額外的bean污秆;
把該類變成一個配置類劈猪,不需要額外的xml配置;
68.@EnableAutoConfiguration的作用
包及子包里的所有組件掃描到Spring容器良拼;默認情況下主配置類包及子包以外的組件战得,Spring 容器是掃描不到的,用心看的小伙伴應(yīng)該發(fā)現(xiàn)了庸推,其實很多需要待加載的類都放在類路徑下的META-INF/Spring.factories文件下常侦,而不是直接寫死這代碼中,這樣做就可以很方便我們自己或第三方去做擴展贬媒;
69.@ComponentScan的作用聋亡?
70.Springboot的工作原理
總結(jié)下@SpringbootApplication:就是說,他已經(jīng)把很多東西準(zhǔn)備好际乘,具體是否使用取決于我們的程序或者說配置坡倔;上面的方法主要包括兩大步驟,而上面說的@SpringbootApplication只是起到配置的作用;
創(chuàng)建 SpringApplication 對象致讥。
運行 run() 方法。
71.Docker跟虛機的區(qū)別器赞?Docker和kubernetes的區(qū)別
都是一個物理機上可以跑多個虛機(或Container)垢袱,每個虛機(或Container)可以跑多個程序或應(yīng)用,虛機就是多了一個guest OS港柜,而且虛機里每個運行的app之間是不能相互隔離的请契;容器化從根本上解決了環(huán)境不一致的問題(解決了標(biāo)準(zhǔn)化鏡像的問題)
我們用kubernetes去管理Docker集群,即可以將Docker看成Kubernetes內(nèi)部使用的低級別組件夏醉。另外爽锥,kubernetes不僅僅支持Docker,還支持Rocket畔柔,這是另一種容器技術(shù)氯夷。Docker是天生為微服務(wù)所生的;
解決這些問題需要容器編排技術(shù)靶擦,可以將眾多機器抽象腮考,對外呈現(xiàn)出一臺超大機器。現(xiàn)在業(yè)界比較流行的有:k8s玄捕、Mesos踩蔚、Docker Swarm;
k8s 由眾多組件組成枚粘,組件間通過 API 互相通信馅闽,歸納起來主要分為三個部分:
Controller manager(in Master)
nodes(Kubelet, Kube Proxy)
pods(Pod在container之上,Pod可以有多個containers馍迄,而containers最重要的就是docker which you can find anything from Docker Hub)
72.Kubernetes和Cloud Foundry的區(qū)別福也?http://dockone.io/article/5679
多年來我一直在Pivotal Cloud Foundry上開發(fā)。使用Spring Boot工具棧攀圈,我能輕松地創(chuàng)建CI/CD流水線并完成部署拟杉。我發(fā)現(xiàn)它是一個真正的敏捷平臺;
Kubernetes首要的功能是一個容器運行時量承。盡管不限于此搬设,但它通常是被用來運行Docker容器。主要目的是提供一個運行容器的簡單基礎(chǔ)設(shè)施解決方案撕捍;有一些解決方案基于Kubernetes提供了PaaS體驗拿穴,比如RedHat OpenShift
Apache Kafka是現(xiàn)今其中一個最佳的消息代理,但是這個消息代理目前仍沒有可用的PCF服務(wù)忧风,因此它必須運行在外部虛擬機上∧現(xiàn)在有了PCF 2.0,我可以在PCF集群內(nèi)運行Apache Kafka Docker容器了
如果Kubernetes是Google狮腿,那么PCF就是Apple
https://kubernetes.io/docs/tutorials/kubernetes-basics/ 基本的stuff
73.Lombok的@Data注解
74.常用的Annotation?
@Controller, @Reference, @Service, @RestController, @Component, @RequestMapping, @ResponseBody, @RequestBody, @RequestParam, @PathVariable(URL Path), @CookieValue
@SpringBootApplication
75.RabbitMQ的Exchange和Queue的區(qū)別腿宰?還有vhost
76.單線程的app有哪些呕诉?
77.Component和Autowired的區(qū)別
component是直接找到那個component, 而autowired是find match
78. Bean和Object的區(qū)別
在Spring里的Object才叫Bean,life cycle
79.多態(tài)
Java中Overload和Override的區(qū)別(動態(tài)多態(tài)和靜態(tài)多態(tài))
多態(tài)polymorphism的作用是interface resuable吃度,繼承的作用是code reusable, encapsulation的作用是secure, protects, module化
feign肯定是像RestTemplate那樣的是去調(diào)用服務(wù)的甩挫,而Ribbon是實現(xiàn)服務(wù)間的負載均衡的;
Eureka:各個服務(wù)啟動時椿每,Eureka Client都會將服務(wù)注冊到Eureka Server伊者,并且Eureka Client還可以反過來從Eureka Server拉取注冊表,從而知道其他服務(wù)在哪里
Ribbon:服務(wù)間發(fā)起請求的時候间护,基于Ribbon做負載均衡亦渗,從一個服務(wù)的多臺機器中選擇一臺
Feign:基于Feign的動態(tài)代理機制,根據(jù)注解和選擇的機器汁尺,拼接請求URL地址法精,發(fā)起請求
Hystrix:發(fā)起請求是通過Hystrix的線程池來走的,不同的服務(wù)走不同的線程池痴突,實現(xiàn)了不同服務(wù)調(diào)用的隔離亿虽,避免了服務(wù)雪崩的問題
Zuul:如果前端、移動端要調(diào)用后端系統(tǒng)苞也,統(tǒng)一從Zuul網(wǎng)關(guān)進入洛勉,由Zuul網(wǎng)關(guān)轉(zhuǎn)發(fā)請求給對應(yīng)的服務(wù)
https://blog.51cto.com/u_15293910/3062954
zuul/gateway/nginx, Ribbon/Hystrix, Feigh/RestTemplate/RPC/HttpClient, Eureka/Zookeeper
80.屬性注入set方法,構(gòu)造器方法
<property></property>
<constructor-arg></constructor-arg>
81.JPA的作用如迟,以及與common APIs的區(qū)別
JPA提供自定義方法的查詢收毫,比如:findByXXX, findByXXXAndYYY, countByXXXAndYYY
專注于最好的理解,就是我的技術(shù)博文的出發(fā)點殷勘;hylyn - hylyn的官方網(wǎng)站
hylyn.com應(yīng)該指向hylyn.samemart.com這樣安全性也有了此再;