Spring你要記住的關鍵點

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這樣安全性也有了;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容