一、springboot是什麼? 微服務,應該是近年來最火的概念,越來越多的公司開始使用微服務架構,面試中被問到的微服務的概率很高,不管對技術的追求,還是為了進更好的公司,微服務都是我們開發人員的必須要學習的知識。 那麼微服務究竟是什麼呢? 我們通俗的理解方式就是:微服務化的核心就是將傳統的一站式應 ...
一、
微服務,應該是近年來最火的概念,越來越多的公司開始使用微服務架構,面試中被問到的微服務的概率很高,不管對技術的追求,還是為了進更好的公司,微服務都是我們開發人員的必須要學習的知識。
那麼微服務究竟是什麼呢?
我們通俗的理解方式就是:微服務化的核心就是將傳統的一站式應用,根據業務拆分成一個一個的服務,徹底 地去耦合,每一個微服務提供單個業務功能的服務,一個服務做一件事,從技術角度看就是一種小而獨立的處理過程,類似進程概念,能夠自行單獨啟動或銷毀,擁有自己獨立的資料庫。
想要更好的瞭解微服務概念的同學可以去看看這篇論文:https://martinfowler.com/articles/microservices.html
dubbo和springcloud
目前比較成熟的微服務架構有兩種:dubbo和springcloud,這兩種技術各有優劣,他們最大的區別是:SpringCloud拋棄了Dubbo的RPC通信,採用的是基於HTTP的REST方式
為何會選擇springcloud,主要是從兩個方面考慮:
-
spring全家桶:作為Spring的拳頭項目,springcloud能夠與Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring項目完美融合,而且springcloud有一整套的微服務架構解決方案,你可以很放心的使用,大家都愛全家桶。
-
社區支持與更新力度:DUBBO停止了5年左右的更新,雖然2017.7重啟了,但是影響還是有一些的。
當然,這隻是一種技術選擇,不需要去爭論。
講了這麼多,還沒有說到主題,那springboot又是什麼?SpringBoot專註於快速方便的開發單個個體微服務,SpringBoot可以離開SpringCloud獨立使用開發項目,但是SpringCloud離不開SpringBoot,屬於依賴的關係,SpringBoot專註於快速、方便的開發單個微服務個體,SpringCloud關註全局的服務治理框架。
要學習springcloud,就必須先學習springboot。
二、
Spring Boot是來簡化Spring應用開發,約定大於配置,去繁從簡,just run就能創建一個獨立的,產品級別的應用,多數Spring Boot應用需要很少的Spring配置。
用過spring開發就知道,spring配置繁多、開發效率低下、部署流程複雜、且第三方技術集成難度大。而使用springboot有如下優勢:
1、快速創建獨立運行的Spring項目以及與主流框架集成。
2、使用嵌入式的Servlet容器,應用無需打成WAR包 。
3、starters自動依賴與版本控制 。
4、大量的自動配置,簡化開發,也可修改預設值。
5、 無需配置XML,無代碼生成,開箱即用。
6、準生產環境的運行時應用監控。
7、與雲計算的天然集成。
學習spring是有一定前提的,spring,maven都必須先掌握
三、
相信大部分開發現在都是使用idea,關於idea的maven配置就不講了,我們開始第一個springboot項目
新建項目:
下一步:
下一步:
下一步:
只勾選web,這裡我們就構建成功了,再刪除一些不必要的文件,最終結構:
新建一個controller:
代碼:
@Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello(){ return "hello world"; } }
啟動項目:
成功後,
結果就出來了,簡直太方便了,springboot不僅開發簡單,部署也非常容易,直接打包
打包後的文件:
複製到桌面,然後直接執行命令 java -jar
刷新剛剛的地址,成功顯示,就已經部署完成。
四、
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
進入依賴,發現他還有一個父依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.3.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>
在父依賴中我們可以看到裡面對組件的版本號進行了寫入:
我們預設是不需要寫版本的,當然,沒有在裡面的依賴需要我們定義,這就是springboot的版本仲裁中心
再看另外的一個依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
這個依賴可以分為兩個部分:spring-boot-starter說明這個是spring-boot場景啟動器,而後面的web會幫我們導入了web模塊正常運行所依賴的組件,如:
Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器),只需要在項目裡面引入這些starter相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啟動器。
我們在看看主程式類
@SpringBootApplication //來標註一個主程式類,說明這是一個Spring Boot應用 public class SpringbootLearnApplication { public static void main(String[] args) { SpringApplication.run(SpringbootLearnApplication.class, args); } }
@SpringBootApplication: Spring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用,進入其中
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {
這裡面有個@SpringBootConfiguration: 翻譯過來是Spring Boot的配置類,標註在某個類上,就表示這是一個Spring Boot的配置類。
我們再進入其中,又可以看到一個註解@Configuration: 翻譯過來是配置類,上面標註這個註解說明這是一個配置類,相當於一個配置文件,配置類也是容器中的一個組件相當於@Component。
還有一個@EnableAutoConfiguration 這個註解說明開啟自動配置功能。這就是為什麼我們不需要寫任何配置,就可以起項目的原因,以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration告訴SpringBoot開啟自動配置功能,這樣自動配置才能生效。
我們不妨再進入到這個註解中:
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {
@Import({Registrar.class}) public @interface AutoConfigurationPackage { }
這個註解我們就比較熟悉了,@Import 這個註解是給容器中導入一個組件;導入的組件由Registrar.class,這個 Registrar.class中的方法的就是將所在包及下麵所有子包裡面的所有組件掃描到Spring容器。
這個要註意必須是其子包,如果我們放在外面將不能被掃描,用個例子說明,假設我們在java路徑下增加一個類,
@Controller public class HelloWorld { @ResponseBody @RequestMapping("/world") public String world(){ return "hello world"; } }
再次啟動,是找不到這個地址的,因為這個包沒有掃入其中,這樣我們就明白了包是怎麼掃描進去的。
下麵我們再到@EnableAutoConfiguration 找到@Import({AutoConfigurationImportSelector.class}),
EnableAutoConfigurationImportSelector 翻譯過來是導入哪些組件的選擇器,這個類的作用是:將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中。
public String[] selectImports(AnnotationMetadata annotationMetadata) {
這個方法會給容器中導入非常多的自動配置類(xxxAutoConfiguration),就是給容器中導入這個場景需要的所有組件,並配置好這些組件。
這樣我們就知道自動配置類是如何導入的,有了自動配置類,免去了我們手動編寫配置註入功能組件等的工作。
去看這個文件,發現裡面有大量的註解配置類:
Spring Boot在啟動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作,以前我們需要自己配置的東西,自動配置類都幫我們。