Spring
1.支持我們現(xiàn)在流行的POJO的開發(fā)方式、也支持老的JavaBean的開發(fā)方式;
2.面向切面編程最好的理解:Aspect Oriented Program, 我們在兩個類中,可能都需要在每個方法中做日志。按面向對象的設計方法,我們就必須在兩個類的方法中都加入日志的內容。也許他們是完全相同的,但就是因為面向對象的設計讓類與類之間無法聯(lián)系,而不能將這些重復的代碼統(tǒng)一起來。我們可以將這段代碼寫在一個獨立的類獨立的方法里,然后再在這兩個類中調用。但是,這樣一來,這兩個類跟我們上面提到的獨立的類就有耦合了,它的改變會影響這兩個類。
3.什么叫聲明式事務?就是通過配置就能實現(xiàn)事務回滾,而不需要自己編程實現(xiàn);還意味著你的業(yè)務代碼和事務管理是分離的;之所以Spring可以進行事務管理,其實是依賴數(shù)據(jù)庫本身的事務管理,是通過binlog或者redo log實現(xiàn)的;最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別;
4.什么叫Spring降低了JavaEE API的使用難度?因為Spring對JavaMail等進行了很好的封裝;
5.為什么說Spring是非侵入式框架?因為Spring只是為了把類注入,對代碼的干擾比較少;更專業(yè)的說法是:Spring框架對程序代碼的影響小;
6.Spring中的設計模式?這個確實挺難懂的;(我自己的理解就是可復用的模式、可復用的編程方案)
[Design Pattern is] a solution to a problem in a context.也就是說,設計模式是針對特定上下文的特定問題的解決方案,這種解決方案被抽象化、模版化,就是設計模式。
1)單例模式 Singleton
Spring推薦將所有業(yè)務邏輯組件、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)地給一個對象添加一些額外的職責。
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類來負責創(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
通常由應用程序直接使用new創(chuàng)建新的對象;
而工廠模式跟簡單工廠模式很類似,只是不同的工廠生產(chǎn)不同的對象;
8)模板方法
模板方法:用來解決代碼重復的問題。比如. RestTemplate, JmsTemplate, JpaTemplate
7.你怎么把IOC控制反轉和依賴注入
Spring IOC 負責創(chuàng)建對象,管理對象(通過依賴注入DI),裝配對象,配置對象,并且管理這些對象的整個生命周期;
控制反轉(IoC)有什么作用:管理對象的創(chuàng)建和依賴關系的維護(必須通過依賴注入)
Spring 中的 IoC 的實現(xiàn)原理就是工廠模式加反射機制,工廠模式好理解:你需要不同的類,反射模式也好理解:依賴注入就靠反射;
什么是依賴注入:從 XML 的配置上說,即 ref 標簽。對應 Spring RuntimeBeanReference 對象;
對于 IoC 來說,最重要的就是容器,容器管理著 Bean 的生命周期,控制著 Bean 的依賴注入;
8.BeanFactory 和 ApplicationContext有什么區(qū)別?
ApplicationContext是BeanFactory的子節(jié)點,包含更多的細節(jié):
繼承MessageSource,因此支持國際化;
統(tǒng)一的資源文件訪問方式;
提供在監(jiān)聽器中注冊bean的事件;
同時加載多個配置文件;
載入多個(有繼承關系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層;
BeanFactroy采用的是延遲加載形式來注入Bean的;
ApplicationContext,它是在容器啟動時,一次性創(chuàng)建了所有的Bean;
BeanFactory 簡單粗暴,可以理解為就是個 HashMap,Key 是 BeanName,Value 是 Bean 實例。通常只提供注冊(put),獲取(get)這兩個功能。我們可以稱之為?“低級容器”;
依賴注入分為接口注入(Interface Injection),Setter方法注入(Setter Injection)和構造器注入(Constructor Injection)三種方式。其中接口注入由于在靈活性和易用性比較差,現(xiàn)在從Spring4開始已被廢棄;
9.什么是Spring beans?
Spring beans 是那些形成Spring應用的主干的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:默認的方式是不進行自動裝配的,通過手工設置ref屬性來進行裝配bean。
byName:通過bean的名稱進行自動裝配,如果一個bean的 property 與另一bean 的name 相同,就進行自動裝配。
byType:通過參數(shù)的數(shù)據(jù)類型進行自動裝配。
constructor:利用構造函數(shù)進行裝配,并且構造函數(shù)的參數(shù)通過byType進行裝配。
autodetect:自動探測,如果有構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。
14.怎么區(qū)分byName, byType 以及 required=false這些術語?
這些都和@Autowired有關,如果對象是一個就直接裝配,如果多個就byName這樣的方式去裝配,如果沒有這個對象就應該配置required=false這樣才不會拋出異常;所以@Autowired不如顯式裝配精確;
@Autowired默認是按照類型裝配注入的byType,@Resource默認是按照名稱來裝配注入的byName, name resource,只有當找不到與名稱匹配的bean才會按照類型來裝配注入;
autowired自動裝配
15.事務管理服務是誰提供的?
Spring AOP
16.什么是Spring DAO(數(shù)據(jù)訪問對象)?
使得 Mybatis, JDBC,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問技術更容易以一種統(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: 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
params,headers: 對于request都是有要求的;
21.@ResponseBody注解的作用
作用: 該注解用于將Controller的方法返回的對象,通過適當?shù)腍ttpMessageConverter轉換為指定格式后,寫入到Response對象的body數(shù)據(jù)區(qū)。
使用時機:返回的數(shù)據(jù)不是html標簽的頁面,而是其他某種格式的數(shù)據(jù)時(如json、xml等)使用;
22.Spring MVC怎么樣設定重定向和轉發(fā)的?
(1)轉發(fā):在返回值前面加"forward:",譬如"forward:user.do?name=method4"
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
23.Spring MVC怎么和AJAX相互調用的?
通過Jackson或者Alibaba的FastJson
24.如何解決POST請求中文亂碼問題,GET的又如何處理呢?
POST: 在web.xml中配置一個CharacterEncodingFilter過濾器,設置成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編碼后的內容按utf-8編碼。
25.Spring MVC的異常處理?
答:可以將異常拋給Spring框架,由Spring框架來處理;我們只需要配置簡單的異常處理器,在異常處理器中添視圖頁面即可。
26.怎樣在方法里面得到Request,或者Session?
在形參中聲明或以變量的形式注入就可以;像HttpServletRequest, HttpServletReponse
27.如果前臺有很多個參數(shù)傳入,并且這些參數(shù)都是一個對象的,那么怎么樣快速得到這個對象?
答:直接在方法中聲明這個對象,Spring MVC就自動會把屬性賦值到這個對象里面。
這個對于傳表格是很有用的;
28.Spring MVC用什么對象從后臺向前臺傳遞數(shù)據(jù)的?
答:通過ModelMap對象,可以在這個對象里面調用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 注解導入自定義的 YAML 配置:
33.什么是 Spring Profiles?
pom.xml中配置 <profiles></profiles>
每種環(huán)境都對應一個?properties?文件,然后在application.properties中配置一下要使用的環(huán)境 spring.profiles.active=dev
34.如何實現(xiàn) Spring Boot 應用程序的安全性?
使用 spring-boot-starter-security 依賴項;
35.攔截器和filter的區(qū)別
攔截器更靠后,filter更靠前,攔截器一般是在Controller前后,而filter是在Servlet前;這里又是Servlet
36.什么是 CSRF 攻擊?
CSRF 攻擊專門針對狀態(tài)改變請求,而不是數(shù)據(jù)竊取,因為攻擊者無法查看對偽造請求的響應;
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
或者你自己導入spring boot dependencies
41.如何使用 Spring Boot 實現(xiàn)異常處理?
Advice, ControllerAdvice
在Spring里,我們可以使用@ControllerAdvice來聲明一些全局性的東西,最常見的是結合@ExceptionHandler注解用于全局異常的處理。
42.如何使用 Spring Boot 實現(xiàn)分頁和排序?
JPA Persistence API,JPA有點像Common API, 你只需關注API的創(chuàng)建,以減少數(shù)據(jù)訪問層DAO的開發(fā);
Spring Data JPA 通過規(guī)范方法的名字,根據(jù)符合規(guī)范的名字來確定方法需要實現(xiàn)什么樣的邏輯;
43.微服務中如何實現(xiàn) session 共享 ?
常見的方案就是 Spring Session + Redis 來實現(xiàn) session 共享;
44.Spring Boot 中如何實現(xiàn)定時任務 ?
一個就是使用 Spring 中的 @Scheduled 注解,另一個則是使用第三方框架 Quartz
44.Spring Boot的監(jiān)控推薦?
Spring boot actuator,Spring Boot?Admin(SBA)是一個社區(qū)開源項目,用于管理和監(jiān)視Spring Boot?應用程序,它提供詳細的健康(Health)信息、內存信息、JVM 系統(tǒng)和環(huán)境屬性、垃圾回收信息、日志設置和查看、定時任務查看、Spring Boot?緩存查看和管理等功能。
45.網(wǎng)站架構的演變
傳統(tǒng)架構 → 分布式架構 → SOA架構 → 微服務架構
46.SOA跟微服務的最大區(qū)別
SOA數(shù)據(jù)庫會存在共享,微服務提倡每個服務連接獨立的數(shù)據(jù)庫;
47.Spring Cloud的組件
注冊中心(eureka)、客戶端負載均衡(Ribbon)、網(wǎng)關(zull或gateway)、分布式鎖、分布式會話;
前面是Ribbon后面是Gateway
Spring Cloud服務的注冊和發(fā)現(xiàn):在注冊中心通過服務別名, IP, 端口發(fā)現(xiàn)服務,緩存,然后通過本地HttpClient去遠程調用;
Nginx和Ribbon的區(qū)別:Nginx主要是通過upstream在服務器轉發(fā),而Ribbon主要是基于客戶端的選擇去調用服務,Ribbon的效率在負載均衡方面做得更好;
SpringCloud有幾種調用接口方式:在Spring Cloud Netflix棧中,各個微服務都是以HTTP接口的形式暴露自身服務的,因此在調用遠程服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的異步HTTP Client,Spring的RestTemplate。但是,用起來最方便的還是要屬Feign了
48.什么是雪崩效應?avalanche
雖然Spring Cloud是不同的服務不同的數(shù)據(jù)庫,但服務之間的相互調用還是很多的,服務調用斷片就會導致連鎖反應,或者雪崩效應,怎么解決呢?服務隔離,一旦服務不可用則返回友好提示
為什么會產(chǎn)生雪崩效應,還是tomcat的線程池全部被占用了;
服務降級:當客戶端請求服務器端的時候,防止客戶端一直等待,不會處理業(yè)務邏輯代碼,直接返回一個友好的提示給客戶端;
服務熔斷是在服務降級的基礎上更直接的一種保護方式,當在一個統(tǒng)計時間范圍內的請求失敗數(shù)量達到設定值(requestVolumeThreshold)或當前的請求錯誤率達到設定的錯誤率閾值(errorThresholdPercentage)時開啟斷路,之后的請求直接走fallback方法,在設定時間(sleepWindowInMilliseconds)后嘗試恢復;
服務隔離:就是開啟一個獨立的線程池;
49.Spring Boot的一些新概念:
在啟動類添加@EnableAsync表示開啟對異步任務的支持,在異步服務上添加@Async
使用@ConfigurationProperties讀取properties中的配置;
使用@MapperScan注冊到對應的mapper包中
50.SpringBootApplication的含義?
包括@EnableAutoConfiguration主要是關于SpringBoot配置和依賴包;
和@ComponentScan主要是關于package包和子包下的類;
51.SpringBoot的底層原理,就是依賴、jar包+class文件
使用maven父子包依賴關系加載相關jar包,使用java操作Spring的初始化過程生成class文件,然后用java創(chuàng)建tomcat服務器加載這些class文件;
52.網(wǎng)站跨越解決方案
a、使用jsonp 缺點只能發(fā)送get請求
b、使用httpclient進行轉發(fā),效率低
c、設置響應頭允許跨域
d、使用Nginx搭建api網(wǎng)關
e、使用Zuul微服務搭建api接口網(wǎng)關
53.分布式Session一致性問題,主要是兩種:
d、使用Spring-Session框架,相當于把session放到redis中
e、使用token令牌代替session;我一般是使用后一種;
54.這是對反向代理最好的解釋:
代替真實服務器接收網(wǎng)絡請求,然后將請求轉發(fā)到真實服務器;
四層負載均衡有那些實現(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管理服務器集群,在服務器宕機的情況下keepalived啟動健康檢測,多次重啟無果可以短信通知運維人員及時維護;
55.動靜分離與前后分離區(qū)別
動靜分離是將靜態(tài)資源和動態(tài)資源存放在不同服務器中,前后分離是將前端和后臺分離,前端通過api調用后臺接口;
56.互聯(lián)網(wǎng)高并發(fā)解決方案?
304狀態(tài)碼或許不應該認為是一種錯誤,而是對客戶端有緩存情況下服務端的一種響應;
那么服務器集群,一定能解決高并發(fā)嗎?這其實不一定。
首先要分清楚高并發(fā)影響用戶的源頭?是因為帶寬不夠還是服務內存不足?
服務帶寬指的是:客戶端與服務器傳輸?shù)膶挾鹊乃俣龋?m 等于 128kb。
服務內存指的是:服務器端處理業(yè)務能力。
那么解決高并發(fā)的入口是客戶端與服務器端傳輸帶寬速度, 如果帶寬速度不足的情況,可能會導致客戶端延遲等待。
一個網(wǎng)站核心 分為靜態(tài)資源(css、img、js)和動態(tài)資源(jsp、ftl)組合,絕大數(shù)的情況下靜態(tài)資源占了整個網(wǎng)站帶寬傳輸, 這時候應該采用網(wǎng)站動靜分 離架構,將動態(tài)資源與靜態(tài)資源分開服務器存放,注意:網(wǎng)站跨域問題。
后端優(yōu)化方案:
可以對服務器實現(xiàn)集群 、加服務配置、采用 MQ 異步傳輸、使用 Redis 做緩存,減輕數(shù)據(jù)庫訪問壓力、代碼優(yōu)化、數(shù)據(jù)庫采用:讀寫分離和分表分庫,程序采用多線程、jvm 參數(shù)調優(yōu),服務實現(xiàn)保護機制(服務降級、服務隔離、服務熔斷、服務限流)等。 Web 前端優(yōu)化大多數(shù)情況下,屬于公司運維干的事情,后端優(yōu)化屬于架構師做的事情,如果一個網(wǎng)站中靜態(tài)資源非常多的情況下,不要將靜態(tài)資源和動態(tài)資源在同一個服務器存放,一定要采用動靜分離架構,提高網(wǎng)站的吞吐量。
#所以帶寬的問題還是要從前端去解決問題,因為每個客戶的帶寬是不同的,解決服務器帶帶寬傳輸是關鍵,所以要解決服務器的問題
最后總結下,如果服務器帶寬不足的情況下,服務器接受客戶端請求資源,可能會產(chǎn)生延遲,服務器做集群、加配置,效果不會很明顯,因為服務器集群只能提高服務器的業(yè)務處理能力,不能提高服務器的帶寬傳輸,
所以可以采用以上總結的 Web 前端優(yōu)化方案,減少客戶端與服務器端帶寬傳輸。
如果在帶寬的足夠的情況下,客戶端發(fā)送請求已經(jīng)到達了后端服務器,服務器端處理能力產(chǎn)生延遲,那么采用以上總結 后端優(yōu)化方案 服務器集群、加服務器配置等。
之前有一位學員問,app 客戶端遇到高并發(fā),是采用后端優(yōu)化還是前端優(yōu)化,app 屬于 cs 架構,靜態(tài)資源在打包的時候已經(jīng)在安裝包里面,不需要遠程獲取,業(yè)務邏輯需要遠程調用接口,獲取 json 數(shù)據(jù)進行解析,讓后展示數(shù)據(jù),所以 app 客戶端產(chǎn)生的高并發(fā),核心在于后端優(yōu)化
57.注解詳解 Type Policy
其實注解的起源很早就有了 JAVA5.0就引入了,內置的注解:@SuppressWarnings - 指示編譯器去忽略注解中聲明的警告。我確實應該對所有的JAVA技術或者Spring技術要有一個總結;
(01) 1 個 Annotation 和 1~n 個 ElementType 關聯(lián)。
可以理解為:對于每 1 個 Annotation 對象,可以有若干個 ElementType 屬性
ElementType 是 Enum 枚舉類型,它用來指定 Annotation 的類型;
RetentionPolicy 是 Enum 枚舉類型,它用來指定 Annotation 的策略。通俗點說,就是不同 RetentionPolicy 類型的 Annotation 的作用域不同;
若 Annotation 的類型為 SOURCE,則意味著:Annotation 僅存在于編譯器處理期間,編譯器處理完之后,該 Annotation 就沒用了。 例如," @Override" 標志就是一個 Annotation。當它修飾一個方法的時候,就意味著該方法覆蓋父類的方法;并且在編譯期間會進行語法檢查!編譯器處理完后,"@Override" 就沒有任何作用了;
自定義的注解:
@Target(ElementType.TYPE) 的意思就是指定該 Annotation 的類型是 ElementType.TYPE。這就意味著,MyAnnotation1 是來修飾"類、接口(包括注釋類型)或枚舉聲明"的注解。
定義 Annotation 時,@Target 可有可無。若有 @Target,則該 Annotation 只能用于它所指定的地方;若沒有 @Target,則該 Annotation 可以用于任何地方。
58.Scheduling 是專注于定時任務調度的框架,但 Spring Task 不僅僅是這一塊
59.Spring Boot的一些工具?
Selenium,Mockito,Cucumber,https://blog.51cto.com/u_10180481/3001766
60.微服務之間的調用到底是通過什么來調用?
每個服務為獨立的業(yè)務開發(fā),一個微服務一般完成某個特定的功能,比如:訂單管理,用戶管理等;
微服務之間通過一些輕量的通信機制進行通信,例如通過REST API或者RPC的方式進行調用;
SpringBoot實際上就是一個Spring MVC應用;
61.Docker和Kubernetes的區(qū)別到底有啥?
容器化部署的 Docker,容器編排的 Kubernetes,這些都是在解決微服務的治理問題;
62. Spring Boot的日志實現(xiàn)?
Spring Boot 默認集成的日志框架是 SLF4J,日志實現(xiàn)是 Logback;
從低到高:trace(跟蹤)、debug(調試)、info(信息)、warn(告警)、error(錯誤),這是越來越嚴重;
如果開發(fā)團隊用了 lombok 來簡化代碼,則是在類上加注解 @Slf4j,然后代碼里直接用 log 進行日志輸出;
從這里也可以看出來,為什么很多人會反對用 lombok,上述代碼里的 log 是直接蹦出來的,沒有定義,影響了代碼的“可讀性”;
63.Spring Boot的部署
事實上 Spring Boot 還有一個默認的配置文件 bootstrap.yml,它比 application.yml 優(yōu)先加載,所以可以配置一個 bootstrap.yml 來指定 profile,然后結合多個 application-*.yml 來工作;
有了 jar 文件和 actuator 的加持,要部署和監(jiān)控基于 Spring Cloud 開發(fā)的微服務,在技術上已經(jīng)可行了:
nohup java -jar -Xms64m -Xmx512m someone.jar >> ./logs/nohup.out 2>&1 &
從直接運行 jar 包,到編寫腳本執(zhí)行部署,到容器化部署(Docker)和容器編排(Kubernetes),在應用的部署上,我們算是走得越來越遠了(越來越復雜);
Kubernetes 沒有固定要求容器的格式,但是?Kubernetes?使用它自己的 API 和命令行接口來進行容器編排。除了?Docker 容器之外,Kubernetes 還支持其他多種容器;
Swarm和Kubernetes比較類似,但是更加輕,具有的功能也較kubernetes更少一些;
k8s+istio會成為微服務架構的主流,部署相對困難;
64.Java持久層怎么選擇?
其實可以在一個項目在同時支持 mybatis 和spring-data-jpa,復雜SQL走 mybatis,常用SQL走 spring-data-jpa;
想用哪個用哪個吧,現(xiàn)在基本都是簡單sql了,業(yè)務都在代碼中做的,目前大部分,都是直接撈數(shù)據(jù),代碼做業(yè)務,不過推薦mybatis-plus,或者jdbcTemplate(transactionTemaplte),越簡單越好,查詢一個數(shù)據(jù)別搞太多花樣;推薦Common Mapper,撈數(shù)據(jù)嘛,這個最簡單,連SQL語句都不用寫;mybatis-plus本質基于mybatis,通用mapper亦是如此。相當于增強,CURD快速開發(fā)。
主要是說下mybatis-plus和通用mapper。我個人的話,推薦通用mapper,以下是原因:mapper的輕快小巧,恰巧滿足我的需求。復雜的SQL,老老實實寫到XML里面去,浪費不了幾個時間,出問題后排查也容易排查
一切問題如果不談場景就是耍流氓。
對于簡單的場景,用Hibernate或者Mybatis都可以。
對于業(yè)務復雜的場景:對象建模優(yōu)先(在這個階段不需要考慮用的是mysql,sqlserver還是postgres),然后根據(jù)這個對象的模型生成數(shù)據(jù)庫表. 如果遇到性能調優(yōu)問題或者多表關聯(lián)查詢或者嵌套查詢怎么辦?單獨寫規(guī)則
65.Springboot開發(fā)先寫service還是controller?
個人覺得,接口定義還是必須放在第一步的。接口都不明確,service就不知道該怎么寫了。需求不明確這是管理者或溝通協(xié)調上的問題;
要滿足持續(xù)交付,對于不明確的需求,就是可能以后這個功能會改變,那么暫時可以用最簡單的方法先實現(xiàn),一些關鍵的權限或可能會修改的地方做開關。
66.什么是stream?
stream是對集合對象功能的增強,aggregation operation或bulk data operation
不是集合,更不是數(shù)據(jù)結構,是高級版本的iterator
一般在開發(fā)中集合中的元素都是從數(shù)據(jù)庫中查詢的,為什么還要用stream?
Stream流更適合的是在多數(shù)據(jù)源的情況下使用,特別是分庫分表的情況下,或是從不同的數(shù)據(jù)庫里得到的數(shù)據(jù),這樣基本上是要走數(shù)據(jù)聚合的方式
Stream就好比流水從面前流過,一去不復返
每次轉換原有 Stream 對象不改變,返回一個新的 Stream 對象(可以有多次轉換);
67.@Configuration的作用
注冊額外的bean;
把該類變成一個配置類,不需要額外的xml配置;
68.@EnableAutoConfiguration的作用
包及子包里的所有組件掃描到Spring容器;默認情況下主配置類包及子包以外的組件,Spring 容器是掃描不到的,用心看的小伙伴應該發(fā)現(xiàn)了,其實很多需要待加載的類都放在類路徑下的META-INF/Spring.factories文件下,而不是直接寫死這代碼中,這樣做就可以很方便我們自己或第三方去做擴展;
69.@ComponentScan的作用?
70.Springboot的工作原理
總結下@SpringbootApplication:就是說,他已經(jīng)把很多東西準備好,具體是否使用取決于我們的程序或者說配置;上面的方法主要包括兩大步驟,而上面說的@SpringbootApplication只是起到配置的作用;
創(chuàng)建 SpringApplication 對象。
運行 run() 方法。
71.Docker跟虛機的區(qū)別?Docker和kubernetes的區(qū)別
都是一個物理機上可以跑多個虛機(或Container),每個虛機(或Container)可以跑多個程序或應用,虛機就是多了一個guest OS,而且虛機里每個運行的app之間是不能相互隔離的;容器化從根本上解決了環(huán)境不一致的問題(解決了標準化鏡像的問題)
我們用kubernetes去管理Docker集群,即可以將Docker看成Kubernetes內部使用的低級別組件。另外,kubernetes不僅僅支持Docker,還支持Rocket,這是另一種容器技術。Docker是天生為微服務所生的;
解決這些問題需要容器編排技術,可以將眾多機器抽象,對外呈現(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容器。主要目的是提供一個運行容器的簡單基礎設施解決方案;有一些解決方案基于Kubernetes提供了PaaS體驗,比如RedHat OpenShift
Apache Kafka是現(xiàn)今其中一個最佳的消息代理,但是這個消息代理目前仍沒有可用的PCF服務,因此它必須運行在外部虛擬機上。現(xiàn)在有了PCF 2.0,我可以在PCF集群內運行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那樣的是去調用服務的,而Ribbon是實現(xiàn)服務間的負載均衡的;
Eureka:各個服務啟動時,Eureka Client都會將服務注冊到Eureka Server,并且Eureka Client還可以反過來從Eureka Server拉取注冊表,從而知道其他服務在哪里
Ribbon:服務間發(fā)起請求的時候,基于Ribbon做負載均衡,從一個服務的多臺機器中選擇一臺
Feign:基于Feign的動態(tài)代理機制,根據(jù)注解和選擇的機器,拼接請求URL地址,發(fā)起請求
Hystrix:發(fā)起請求是通過Hystrix的線程池來走的,不同的服務走不同的線程池,實現(xiàn)了不同服務調用的隔離,避免了服務雪崩的問題
Zuul:如果前端、移動端要調用后端系統(tǒng),統(tǒng)一從Zuul網(wǎng)關進入,由Zuul網(wǎng)關轉發(fā)請求給對應的服務
https://blog.51cto.com/u_15293910/3062954
zuul/gateway/nginx, Ribbon/Hystrix, Feigh/RestTemplate/RPC/HttpClient, Eureka/Zookeeper
80.屬性注入set方法,構造器方法
<property></property>
<constructor-arg></constructor-arg>
81.JPA的作用,以及與common APIs的區(qū)別
JPA提供自定義方法的查詢,比如:findByXXX, findByXXXAndYYY, countByXXXAndYYY
專注于最好的理解,就是我的技術博文的出發(fā)點;hylyn - hylyn的官方網(wǎng)站
hylyn.com應該指向hylyn.samemart.com這樣安全性也有了;