大家好,如果您還對springcloud組件調用的注解不太了解,沒有關系,今天就由本站為大家分享springcloud組件調用的注解的知識,包括import注解的作用的問題都會給大家分析到,還望可以解決大家的問題,下面我們就開始吧!
自定義的Spring Boot starter如何設置自動配置注解
在了解如何設置自動配置注解之前可以先看看spring-boot的自動配置原理,了解了原理之后,在來看如何配置就很簡單了;
SpringBoot自動配置
1.自動配置注解
要想使用自動配置功能,SpringBoot提供了注解@EnableAutoConfiguration,當然不需要我們配置因為在@SpringBootApplication注解中默認以及啟用了;
可以看到@SpringBootApplication注解本身也有注解@EnableAutoConfiguration:
在注解@EnableAutoConfiguration中重點看一下@Import注解中使用的AutoConfigurationImportSelector類,此類是自動注解的核心類,會有條件的加載我們默認指定的配置類;這里有兩個概念一個是有條件,一個是配置類,分別簡單介紹一下:配置類可以簡單理解就是相關組件對接SpringBoot的對接類,此類可以做一些初始化的工作;有條件表示并不是有配置類就能被對接上,是有條件的,SpringBoot默認提供了大量配置類,但并不是所有配置類都能被加載初始化的,是有條件的,比如mybatis在沒有數(shù)據(jù)源的情況下,沒有mybatis基礎包的情況下是不能被對接的;下面首先看一下SpringBoot提供的哪些條件類;
2.條件類
SpringBoot提供了很多條件類,可以在配置中上配置注解條件類,相關條件類可以在spring-boot-autoconfigure包下的org.springframework.boot.autoconfigure.condition下找到,主要包含如下:
ConditionalOnBean:當前容器有指定Bean的條件下;ConditionalOnClass:當前類路徑下有指定類的條件下;ConditionalOnCloudPlatform:當指定了云平臺的時候;ConditionalOnExpression:SpEL表達式作為判斷條件;ConditionalOnJava:JVM版本作為判斷條件;ConditionalOnJndi:在JNDI存在的條件下查找指定的位置;ConditionalOnMissingBean:當容器里沒有指定Bean的情況下;ConditionalOnMissingClass:當類路徑下沒有指定的類的條件下;ConditionalOnNotWebApplication:當前項目不是WEB項目的條件下;ConditionalOnProperty:當前應用是否配置了指定屬性指定的值;ConditionalOnResource:只有當指定的資源位于類路徑下;ConditionalOnSingleCandidate:bean工廠中只有一個或者有多個情況下是主要的候選bean;ConditionalOnWebApplication:當前項目是WEB項目的條件下。以上是注解類,注解本身沒有功能,只是提供標記的功能,具體功能在@Conditional中指定的,比如ConditionalOnBean注解如下所示:
相關功能的實現(xiàn)就在OnBeanCondition類中,同樣其他注解類的實現(xiàn)類也在包org.springframework.boot.autoconfigure.condition下找到;
3.自動配置過程
Springboot應用啟動過程中使用ConfigurationClassParser分析配置類,此類中有一個processImports方法,此方法用來處理@Import注解,在@EnableAutoConfiguration注解存在@Import注解,這時候會實例化注解中的AutoConfigurationImportSelector,在其內部有一個AutoConfigurationGroup內部類,內部類有兩個核心方法分別是:process和selectImports;
此方法主要獲取經過條件過濾之后可用的自動配置類,主要調用AutoConfigurationImportSelector中的getAutoConfigurationEntry完成的:
首先獲取了所有備選的自動配置類,然后刪除了重復和被排除的類,最后通過條件進行篩選出可用的配置類,下面分別看一下,首先看一下如何獲取所有備選的配置類:
通過SpringFactoriesLoader獲取類路徑下META-INF/spring.factories文件中key為org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置類,可以看一下spring-boot-autoconfigure.jar中的spring.factories內容:
當然這里只是截取了其中一個類路徑jar下的部分配置,獲取所有配置類之后進行去重,去被排除的類,然后進行條件過濾,下面重點看一下:
此方法大致就是首先獲取配置的AutoConfigurationImportFilter,然后對之前獲取的所有配置類進行過濾,最后返回過濾之后的配置類;AutoConfigurationImportFilter同樣也是通過SpringFactoriesLoader類進行加載類路徑下META-INF/spring.factories,只不過當前的key是:org.springframework.boot.autoconfigure.AutoConfigurationImportFilter,可以看一下SpringBoot默認配置的filter:
可以看到Filter其實就是上文介紹的條件類,這里默認了OnBeanCondition,OnClassCondition以及OnWebApplicationCondition,已這里使用的Mybatis為例看一下MybatisAutoConfiguration的注解:
可以看到其中有用到@ConditionalOnClass,表示必須提供SqlSessionFactory和SqlSessionFactoryBean類的情況下才加載此配置類,而整兩個是正式Mybatis基礎包中提供的;有了基礎包還不行,還需要DataSource,而且DataSource必須在MybatisAutoConfiguration實例化之前初始化好,SpringBoot是如何實現(xiàn),繼續(xù)看另外一個核心方法selectImports():
首先是對被排除類的一個過濾,然后接下來重點看一下對配置類進行排序的一個方法,具體操作在類AutoConfigurationSorter中進行的,具體方法為getInPriorityOrder():
首先使用order進行排序,然后使用@AutoConfigureBefore和@AutoConfigureAfter就行排序;order其實就是通過注解@AutoConfigureOrder進行排序的,值是一個整數(shù),結構類似如下:
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE+10)@AutoConfigureBefore和@AutoConfigureAfter字面意思也很好理解,指定在其他配置類之前和之后,所以可以看到在MybatisAutoConfiguration中有如下配置:
表示在DataSourceAutoConfiguration配置類加載之后才會加載Mybatis配置類,這樣就解決了依賴關系;還有上文提到的Mybatis操作數(shù)據(jù)庫依賴的SqlSessionFactory和SqlSession,都在MybatisAutoConfiguration進行了初始化操作;SpringBoot本身其實以及提供了大量常用組件的自動配置類,我們只需要提供滿足的特定條件,SpringBoot自動會幫我加載初始化等操作;
下面用一個簡單的實例來看看如何自定義一個自動配置類;
自定義配置類
接下來我們用很簡單的實例來看一下自定義的流程,一個格式化大寫消息的實例;
1.pom文件引入依賴
Spring官方Starter通常命名為spring-boot-starter-{name}如spring-boot-starter-web,Spring官方建議非官方Starter命名應遵循{name}-spring-boot-starter的格式;
2.服務類和屬性配置類
屬性類提供了type參數(shù)可以在application.properties中配置,可配置值包括:upper,lower;
3.自動配置類和創(chuàng)建spring.factories文件
這個就是自定義的自動配置類,SpringBoot啟動的時候會根據(jù)條件自動初始化;最后在resources/META-INF/下創(chuàng)建spring.factories文件:
4.測試
在其他SpringBoot中可以引入上面創(chuàng)建的項目,引入方式也很簡單:
同時在application.properties配置格式化類型:
啟動應用,瀏覽器訪問http://localhost:8888/format?word=hello,結果為:HELLO
以上分析了一下springboot的自動配置原理,并自定義一個自動配置類,并且運行,相信對你有所幫助;
更多可以參考本人之前的文章:https://www.toutiao.com/i6749752249532023309/
怎么看是否使用了springcloud
使用該框架會有一些比較明顯的特征,比如會有一些yml之類的一些相關配置類。而且他也是遵循三層架構的方式,并且每一層之間互相調用。
而且在這個框架里面的一些配置文件,他不會有xml文件。
而且每個功能需求,如果注釋清晰的話,是非常容易看懂的
微服務框架spring cloud和dubbo有什么區(qū)別
首先,從嚴格意義上來說,Dubbo和SpringCloud的定位是不一樣的。Dubbo是一個高性能的、基于java的開源RPC框架,注意它的定位是是高性能和RPC框架。SpringCloud提供了一系列通用工具來幫助開發(fā)者在分布式系統(tǒng)里快速構建一些常見模式,比如分布式配置管理、服務發(fā)現(xiàn)、熔斷降級、智能路由、微代理、控制總線、一次性令牌、全局鎖、分布式選主、分布式session等一些列解決方案,它的設計目標是提供一整套服務治理能力,它具有一套完整的微服務解決方案體系。
dubbo只是一個分布式的RPC框架,如果一定要按照分布式系統(tǒng)架構里的功能來定義的話,只是解決了服務發(fā)現(xiàn)、服務路由、服務降級和負載均衡方面的能力,新版本里也提供了動態(tài)配置中心和服務治理相關的能力,但相比SpringCloud而言,還是差了相當一部分的能力。
從功能支持上來說,dubbo的角色定位可能更像是另外一個大名鼎鼎的框架,那就是gRPC,而且兩者在使用的方式以及工作原理上都非常相似,都是基于序列化協(xié)議來解決分布式系統(tǒng)中的遠程調用問題,在使用上可以通過約定接口或者通過proto文件生成代碼文件來“提升用戶的使用”。
如果你在系統(tǒng)設計之初就已經考慮到了后續(xù)可能會涉及到各種服務治理能力,比如分布式配置、全局鎖、分布式session等常見需求,那么使用SpringCloud將會減少你很多的工作,因為這些基本上都是"套件",相互配合使用會非常順暢。如果你想要的只是解決分布式架構后的遠程調用問題,那么Dubbo是一個不錯的選擇。
SpringCloud和Dubbo的基本差異大概就是如上所述,如果你不知道該如何做選擇,這里再補充幾個比較關鍵的差異點,希望能幫助你更好的結合自身業(yè)務做出選擇:
能力支持方面
上文也提到,SpringCloud提供了一整套微服務治理的功能組件,很多組件基本上都是"開箱即用"的,并且相互之間能很好的兼容,舉個例子,如果要在SpringCloud里實現(xiàn)服務發(fā)現(xiàn)、負載均衡和熔斷降級,你只需要引用SpringCloud的依賴組件即可,直接通過注解便可使用,基本上零配置;而dubbo框架,除了上述提到的能力支持之外,如果想要使用熔斷降級,那你可能需要額外引用hystrix或者resilience4j來實現(xiàn);溫馨提示,hystrix官方目前也已經宣布不再更新,并且推薦使用resilience4j。
協(xié)議兼容方面
SpringCloud里并沒有限制服務之間的通信協(xié)議,但是主流的一些客戶端比如restTemple、feign等都是直接支持使用Ribbon來做服務注冊發(fā)現(xiàn)和智能路由的,其底層通信的協(xié)議都是HTTP;而dubbo框架缺省是基于NIO異步傳輸使用TCP長連接并采用Hessian二進制序列化方式通信的;
這會涉及后續(xù)系統(tǒng)在擴展上的兼容性問題,比如需要調用一個三方系統(tǒng)或者是被第三方系統(tǒng)調用,相比而言HTTP協(xié)議可能更加通用。
模型定義方面
dubbo在模型設計上將一個接口定義為一個服務,而SpringCloud里則是將一個應用定義為一個服務,這兩者在模型上是存在很大差異的,你也許會奇怪,這個對使用會有影響嗎?從現(xiàn)有使用方面來說是沒有什么影響的,但是你如果有關注ServiceMesh最新微服務技術的話,目前對Dubbo協(xié)議這塊可能支持暫時還不完善,其中很大一部分原因就是因為在服務模型上與K8S的服務模型有差異;
調用性能方面
如果分布式系統(tǒng)中比較關注遠程調用的性能,那Dubbo可能是一個較好的選擇,基于NIO和TCP長連接的通信傳輸方式,在性能上相比HTTP協(xié)議是有絕對優(yōu)勢的;當然基于SpringCloud你也可以使用gRPC協(xié)議來解決性能問題,那就是另外一個問題了。
openfeign高級使用教程
下面是一些OpenFeign高級使用教程:
自定義編碼器和解碼器:OpenFeign默認采用Jackson進行JSON序列化和反序列化,如果需要支持其他類型的數(shù)據(jù)格式,可以通過自定義編碼器和解碼器來實現(xiàn)。例如,可以使用Protobuf或Msgpack等優(yōu)秀的序列化庫來提高性能。
自定義攔截器:OpenFeign的攔截器機制類似于SpringAOP,可以通過自定義攔截器來實現(xiàn)日志記錄、安全驗證、性能監(jiān)控等功能。
Hystrix和Ribbon集成:OpenFeign默認采用HTTP協(xié)議進行通信,如果需要支持負載均衡和熔斷機制,可以將其與NetflixHystrix和Ribbon集成起來。這樣可以提高系統(tǒng)的可靠性和穩(wěn)定性,避免因單個服務節(jié)點故障導致整個系統(tǒng)崩潰。
支持多種HTTP請求方式:OpenFeign支持多種HTTP請求方式,包括GET、POST、PUT、DELETE等,可以根據(jù)具體的業(yè)務需求選擇合適的請求方式。
錯誤處理和異常處理:在使用OpenFeign時,可能會出現(xiàn)網絡連接失敗、超時、404等錯誤,也可能會出現(xiàn)業(yè)務邏輯異常等問題。因此需要對這些問題進行處理和統(tǒng)一的異常處理,以保證系統(tǒng)的穩(wěn)定性和可靠性。
總之,OpenFeign是一個非常優(yōu)秀的JavaHTTP客戶端開發(fā)工具,通過學習和掌握其高級使用技巧,可以更好地實現(xiàn)RESTful服務的調用和遠程方法調用。
feign認證授權原理
Feign是一個聲明式的偽HTTP客戶端,它使得HTTP請求變得更簡單。使用Feign,只需要創(chuàng)建一個接口并注解。它具有可插拔注釋支持,包括Feign注解和JAX-RS注解、Feign還支持可插拔編碼器和解碼器、SpringCloud增加了對SpringMVC注釋的支持。
Feign默認集成了Ribbon,并和Eureka結合,默認實現(xiàn)了負載均衡的效果。
好了,文章到此結束,希望可以幫助到大家。