答題的要點 1. 概念 2. 原理 3. 優點
Spring
一、說說你對spring的理解
首先spring是一個開源框架,為了解決企業應用程序開發復雜性而創建的,它完成了大量開發中的通用步驟,留給開發者的僅僅是與特定應用相關的部分,從而大大提高了企業應用的開發效率。
其次spring架構是一個分層架構,由7大模塊組成
1.spring IOC
2.spring AOP
3.spring 上下文
4.springDao
5.springMVC
6.springWeb
7.springORM
然后spring自己也有幾大框架
spring MVC、spring Boot丶spring cloud丶spring data丶spring security
二丶說一下springIOC
IOC控制反轉也叫依賴注入,我理解的是它就是一個生產和管理bean的一個容器,你自己不需要通過new去生成對象而是通過spring bean的工廠來生成所需要的對象。
原理
將對象交給容器管理,你只需要在spring配置文件中配置對應的bean以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啟動的時候,spring會把你在配置文件中配置的bean都初始化好,然后在你需要調用的時候,就把它已經初始化好的那些bean分配給你需要調用這些bean的類(假設這個類名是A),分配的方法就是調用A的setter方法來注入,而不需要你在A里面new這些bean了。
三丶說一下springIOC的幾種注入方式
1.通過注解注入
2.調用set方法注入
3.通過構造方法注入
四丶說一下springAOP
簡單來說,就是將那些與業務無關,卻為業務模塊共同調用的邏輯封裝起來,減少重復代碼降低了代碼的耦合度。並有利於未來對代碼的可操作性和可維護性。
原理
實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼
五丶說一下springMVC
M-Model 模型(完成業務邏輯:有javaBean構成,service+dao+entity)
V-View 視圖(做界面的展示 jsp,html……)
C-Controller 控制器(接收請求—>調用模型—>根據結果派發頁面)
六丶spring常用接口
1.ApplicationListener:當需要監聽自定義事件時,可以新建一個實現ApplicationListener接口的類,並將該類配置到Spring容器中。
2.FactoryBean:用於創建特定的對象,對象的類型由getObject方法的返回值決定。
3.ApplicationContextAware:當一個類需要獲取ApplicationContext實例時,可以讓該類實現ApplicationContextAware接口。
4.ApplicationEvent:當需要創建自定義事件時,可以新建一個繼承自ApplicationEvent抽象類的類。
七丶spring cloud有哪些組件
https://blog.csdn.net/yejingtao703/article/details/78331442/
spring cloud常見面試題
https://blog.csdn.net/moakun/article/details/82817757
JVM
集合
一丶HashMap底層原理
https://www.cnblogs.com/java-jun-world2099/p/9258605.html
二丶List面試題
https://www.cnblogs.com/chanshuyi/p/4998776.html
MQ
一丶為什么使用MQ
面試官問這個問題的期望之一的回答是,你們公司有什么業務場景,這個業務場景有什么技術挑戰,如果不用MQ可能會很麻煩,但是再用了之后帶來了很多好處。
消息隊列的常見使用場景有很多但是核心的有三個:解耦、異步、削峰
二丶消息隊列的優點和缺點?
優點:特殊場景下解耦、異步、削峰。
缺點:
系統可用性降低:系統引入的外部依賴越多,越容易掛掉,本來你就是A系統調用BCD三個系統的接口就好了,人ABCD四個系統好好的沒什么問題,你偏加個MQ進來,萬一MQ掛了怎么辦,整套系統崩潰了,就完蛋了
系統復雜性提高:硬生生加個MQ進來,你怎么保證消息沒有重復消費?怎么處理消息丟失的情況?怎么保證消息傳遞的順序性?
一致性問題:系統A處理完了直接返回成功了,人家都認為你這個請求成功了;但問題是,要是BCD三個系統哪里BD系統成功了,結果C系統寫庫失敗了,咋整?數據就不一致了。
三丶如何保證消息不被重復消費(如何保證消息消費時的冪等性)?
在消息生產時,MQ內部針對每條生產者發送的消息生成一個inner-msg-id,作為去重的依據(消息投遞失敗並重傳),避免重復的消息進入隊列;
在消息消費時,要求消息體中必須要有一個bizId(對於同一業務全局唯一,如支付ID、訂單ID、帖子ID等)作為去重的依據,避免同一條消息被重復消費。
四丶如何處理消息丟失的問題 (如何保證消息的可靠傳輸)?
這個丟數據,mq一般分為兩種,要么是mq自己弄丟了,要么是我們消費的時候弄丟了。
用rabbit舉例
(1)消息持久化
(2)ACK確認機制
(3)消息補償機制
(4)設置集群鏡像模式
五丶消息如何分發?
若該隊列至少有一個消費者訂閱,消息將以循環(round-robin)的方式發送給消費者。每條消息只會分發給一個訂閱的消費者(前提是消費者能夠正常處理消息並進行確認)。
六丶消息隊列有哪些配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd"> <!-- 定義RabbitMQ的連接工廠 --> <rabbit:connection-factory id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"> <constructor-arg value="10.130.202.12"><!--服務器ip地址--> <property name="username" value="tele-onlineYa"> <property name="password" value="tele-onlineYa"> <property name="port" value="5678"> <property name="channelCacheSize" value="50"> <!--通道緩存大小-->
<property name="virtualHost" value="tele-onlineYa"> </bean> <!--通過指定admin信息,當前producer中的exchange和queue會在rabbitmq服務器上自動生成。 -->
<rabbit:admin connection-factory="connectionFactory" /> <!-- 隊列queue,自動聲明 -->
<rabbit:queue name="ZL.SALETRACE" exclusive="false" auto-declare="false" durable="true" /> <!--自定義消息接受者-->
<bean id="messageReceiver" class="com.zlf.cn.api.RabbitMqConsumerListener"> <!-- queue監聽器,觀察監聽模式。當有消息到達本應用時會通知監聽在對應隊列queue上的監聽對象 -->
<rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener queues="ZL.SALETRACE" ref="messageReceiver" />
</rabbit:listener-container>
</beans>
dubbo
一丶簡單說一下dubbo
Dubbo是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。簡單的說,就是個遠程服務調用的分布式框架(告別Web Service模式中的WSdl,以服務者與消費者的方式在dubbo上注冊)
其核心部分包含:
1. 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。
2. 集群容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
3. 自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
二丶dubbo調用關系說明
(1)服務提供者在啟動時,向注冊中心注冊自己提供的服務。
(2)服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
(3)注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
(4)服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
(5)服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
三丶你配置過dubbo哪些東西
# 應用名 dubbo.application.name = dubbodemo-consumer # 注冊中心地址 dubbo.registry.address = zookeeper://localhost:2181
# 調用協議地址 dubbo.protocol.name = dubbo dubbo.protocol.port = 28080
# 設置服務端和消費端連接超時時間
spring.dubbo.consumer.timeout=30000
spring.dubbo.provider.timeout=30000
服務端要聲明暴露的服務接口
消費端要配置調用哪些服務
MySQL
一丶MYSQL有哪些索引?
https://blog.csdn.net/liutong123987/article/details/79384395