您好,登錄后才能下訂單哦!
這篇文章給大家介紹什么是 Spring Boot ,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
Spring Boot 項(xiàng)目的啟動(dòng)注解是:@SpringBootApplication,其實(shí)它就是由下面三個(gè)注解組成的:
@Configuration
@ComponentScan
@EnableAutoConfiguration
其中 @EnableAutoConfiguration 是實(shí)現(xiàn)自動(dòng)配置的入口,該注解又通過 @Import 注解導(dǎo)入了AutoConfigurationImportSelector,在該類中加載 META-INF/spring.factories 的配置信息。然后篩選出以 EnableAutoConfiguration 為 key 的數(shù)據(jù),加載到 IOC 容器中,實(shí)現(xiàn)自動(dòng)配置功能!
思考一下在你的虛擬機(jī)上部署應(yīng)用程序需要些什么。
第一步:安裝 Java
第二部:安裝 Web 或者是應(yīng)用程序的服務(wù)器(Tomat/Wbesphere/Weblogic 等等)
第三部:部署應(yīng)用程序 war 包
如果我們想簡化這些步驟,應(yīng)該如何做呢?
讓我們來思考如何使服務(wù)器成為應(yīng)用程序的一部分?
你只需要一個(gè)安裝了 Java 的虛擬機(jī),就可以直接在上面部署應(yīng)用程序了,
是不是很爽?
這個(gè)想法是嵌入式服務(wù)器的起源。
當(dāng)我們創(chuàng)建一個(gè)可以部署的應(yīng)用程序的時(shí)候,我們將會(huì)把服務(wù)器(例如,tomcat)嵌入到可部署的服務(wù)器中。
例如,對(duì)于一個(gè) Spring Boot 應(yīng)用程序來說,你可以生成一個(gè)包含 Embedded Tomcat 的應(yīng)用程序 jar。你就可以像運(yùn)行正常 Java 應(yīng)用程序一樣來運(yùn)行 web 應(yīng)用程序了。
嵌入式服務(wù)器就是我們的可執(zhí)行單元包含服務(wù)器的二進(jìn)制文件(例如,tomcat.jar)。
支持分布式事務(wù),可以使用Spring Boot集成 Aatomikos來解決,但是我一般不建議這樣使用,因?yàn)槭褂梅植际绞聞?wù)會(huì)增加請(qǐng)求的響應(yīng)時(shí)間,影響系統(tǒng)的TPS。一般在實(shí)際工作中,會(huì)利用消息的補(bǔ)償機(jī)制來處理分布式的事務(wù)。
cas和oauth是一個(gè)解決單點(diǎn)登錄的組件,shiro主要是負(fù)責(zé)權(quán)限安全方面的工作,所以功能點(diǎn)不一致。但往往需要單點(diǎn)登陸和權(quán)限控制一起來使用,所以就有 cas+shiro或者oauth+shiro這樣的組合。
token一般是客戶端登錄后服務(wù)端生成的令牌,每次訪問服務(wù)端會(huì)進(jìn)行校驗(yàn),一般保存到內(nèi)存即可,也可以放到其他介質(zhì);redis可以做Session共享,如果前端web服務(wù)器有幾臺(tái)負(fù)載,但是需要保持用戶登錄的狀態(tài),這場景使用比較常見。
我們公司使用oauth+shiro這樣的方式來做后臺(tái)權(quán)限的管理,oauth負(fù)責(zé)多后臺(tái)統(tǒng)一登錄認(rèn)證,shiro負(fù)責(zé)給登錄用戶賦予不同的訪問權(quán)限。
在傳統(tǒng)的SOA治理中,使用rpc的居多;Spring Cloud默認(rèn)使用restful進(jìn)行服務(wù)之間的通訊。rpc通訊效率會(huì)比restful要高一些,但是對(duì)于大多數(shù)公司來講,這點(diǎn)效率影響甚微。我建議使用restful這種方式,易于在不同語言實(shí)現(xiàn)的服務(wù)之間通訊。
對(duì)于無狀態(tài)服務(wù),首先說一下什么是狀態(tài):如果一個(gè)數(shù)據(jù)需要被多個(gè)服務(wù)共享,才能完成一筆交易,那么這個(gè)數(shù)據(jù)被稱為狀態(tài)。進(jìn)而依賴這個(gè)“狀態(tài)”數(shù)據(jù)的服務(wù)被稱為有狀態(tài)服務(wù),反之稱為無狀態(tài)服務(wù)。
那么這個(gè)無狀態(tài)服務(wù)原則并不是說在微服務(wù)架構(gòu)里就不允許存在狀態(tài),表達(dá)的真實(shí)意思是要把有狀態(tài)的業(yè)務(wù)服務(wù)改變?yōu)闊o狀態(tài)的計(jì)算類服務(wù),那么狀態(tài)數(shù)據(jù)也就相應(yīng)的遷移到對(duì)應(yīng)的“有狀態(tài)數(shù)據(jù)服務(wù)”中。
場景說明:例如我們以前在本地內(nèi)存中建立的數(shù)據(jù)緩存、Session緩存,到現(xiàn)在的微服務(wù)架構(gòu)中就應(yīng)該把這些數(shù)據(jù)遷移到分布式緩存中存儲(chǔ),讓業(yè)務(wù)服務(wù)變成一個(gè)無狀態(tài)的計(jì)算節(jié)點(diǎn)。遷移后,就可以做到按需動(dòng)態(tài)伸縮,微服務(wù)應(yīng)用在運(yùn)行時(shí)動(dòng)態(tài)增刪節(jié)點(diǎn),就不再需要考慮緩存數(shù)據(jù)如何同步的問題。
@Cacheable ,用來聲明方法是可緩存,將結(jié)果存儲(chǔ)到緩存中以便后續(xù)使用相同參數(shù)調(diào)用時(shí)不需執(zhí)行實(shí)際的方法,直接從緩存中取值。
@CachePut,使用 @CachePut 標(biāo)注的方法在執(zhí)行前,不會(huì)去檢查緩存中是否存在之前執(zhí)行過的結(jié)果,而是每次都會(huì)執(zhí)行該方法,并將執(zhí)行結(jié)果以鍵值對(duì)的形式存入指定的緩存中。
@CacheEvict,是用來標(biāo)注在需要清除緩存元素的方法或類上的,當(dāng)標(biāo)記在一個(gè)類上時(shí)表示其中所有的方法的執(zhí)行都會(huì)觸發(fā)緩存的清除操作。
現(xiàn)代瀏覽器出于安全的考慮, HTTP 請(qǐng)求時(shí)必須遵守同源策略,否則就是跨域的 HTTP 請(qǐng)求,默認(rèn)情況下是被禁止的,IP(域名)不同、或者端口不同、協(xié)議不同(比如 HTTP、HTTPS)都會(huì)造成跨域問題。
一般前端的解決方案有:
① 使用 JSONP 來支持跨域的請(qǐng)求,JSONP 實(shí)現(xiàn)跨域請(qǐng)求的原理簡單的說,就是動(dòng)態(tài)創(chuàng)建<script>
標(biāo)簽,然后利用<script>
的 SRC 不受同源策略約束來跨域獲取數(shù)據(jù)。缺點(diǎn)是需要后端配合輸出特定的返回信息。
② 利用反應(yīng)代理的機(jī)制來解決跨域的問題,前端請(qǐng)求的時(shí)候先將請(qǐng)求發(fā)送到同源地址的后端,通過后端請(qǐng)求轉(zhuǎn)發(fā)來避免跨域的訪問。
后來 HTML5 支持了 CORS 協(xié)議。CORS 是一個(gè) W3C 標(biāo)準(zhǔn),全稱是”跨域資源共享”(Cross-origin resource sharing),允許瀏覽器向跨源服務(wù)器,發(fā)出 XMLHttpRequest 請(qǐng)求,從而克服了 AJAX 只能同源使用的限制。它通過服務(wù)器增加一個(gè)特殊的 Header[Access-Control-Allow-Origin]來告訴客戶端跨域的限制,如果瀏覽器支持 CORS、并且判斷 Origin 通過的話,就會(huì)允許 XMLHttpRequest 發(fā)起跨域請(qǐng)求。
前端使用了 CORS 協(xié)議,就需要后端設(shè)置支持非同源的請(qǐng)求,Spring Boot 設(shè)置支持非同源的請(qǐng)求有兩種方式。
第一,配置 CorsFilter。
@Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.setAllowCredentials(true); config.addAllowedMethod("*"); config.addAllowedHeader("*"); config.addExposedHeader("*"); UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); return new CorsFilter(configSource); } }
需要配置上述的一段代碼。第二種方式稍微簡單一些。
第二,在啟動(dòng)類上添加:
public class Application extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowCredentials(true) .allowedHeaders("*") .allowedOrigins("*") .allowedMethods("*"); } }
JPA本身是一種規(guī)范,它的本質(zhì)是一種ORM規(guī)范(不是ORM框架,因?yàn)镴PA并未提供ORM實(shí)現(xiàn),只是制定了規(guī)范)因?yàn)镴PA是一種規(guī)范,所以,只是提供了一些相關(guān)的接口,但是接口并不能直接使用,JPA底層需要某種JPA實(shí)現(xiàn),Hibernate 是 JPA 的一個(gè)實(shí)現(xiàn)集。
JPA 是根據(jù)實(shí)體類的注解來創(chuàng)建對(duì)應(yīng)的表和字段,如果需要?jiǎng)討B(tài)創(chuàng)建表或者字段,需要?jiǎng)討B(tài)構(gòu)建對(duì)應(yīng)的實(shí)體類,再重新調(diào)用Jpa刷新整個(gè)Entity。動(dòng)態(tài)SQL,mybatis支持的最好,jpa也可以支持,但是沒有Mybatis那么靈活。
Spring 最初最核心的兩大核心功能 Spring Ioc 和 Spring Aop 成就了 Spring,Spring 在這兩大核心的功能上不斷的發(fā)展,才有了 Spring 事務(wù)、Spring Mvc 等一系列偉大的產(chǎn)品,最終成就了 Spring 帝國,到了后期 Spring 幾乎可以解決企業(yè)開發(fā)中的所有問題。
Spring Boot 是在強(qiáng)大的 Spring 帝國生態(tài)基礎(chǔ)上面發(fā)展而來,發(fā)明 Spring Boot 不是為了取代 Spring ,是為了讓人們更容易的使用 Spring 。
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊(cè)、配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用 Spring Boot 的開發(fā)風(fēng)格做到一鍵啟動(dòng)和部署。
Spring Cloud 是為了解決微服務(wù)架構(gòu)中服務(wù)治理而提供的一系列功能的開發(fā)框架,并且 Spring Cloud 是完全基于 Spring Boot 而開發(fā),Spring Cloud 利用 Spring Boot 特性整合了開源行業(yè)中優(yōu)秀的組件,整體對(duì)外提供了一套在微服務(wù)架構(gòu)中服務(wù)治理的解決方案。
用一組不太合理的包含關(guān)系來表達(dá)它們之間的關(guān)系。
Spring ioc/aop > Spring > Spring Boot > Spring Cloud
關(guān)于什么是 Spring Boot 就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。