微服務之SpringBoot解讀
來自專欄 沒事玩點編程吧!
隨著敏捷,精益,持續交付等價值觀和方法論的提出與實踐,以及DevOps文化的推行以及市場對快速交付的需要;Java社區也試著尋找一種能夠快速進行持續交付,同時提供強大的運維能力的框架;Springboot在這個基礎上被創建了出來。
1.SpringBoot所提供的特性:
- Springboot本身基於spring開發,可創建獨立的Spring應用程序;
- Springboot Actuator提供了許多運維特性如:應用運行狀態檢查,健康檢查,監控信息等;
- metrics度量指標:
- mory, heap, classloading, processor and thread pool
- metrics.html
- Springboot 內置伺服器,可選的伺服器有Tomcat,undertow(基於xnio),jetty
- 沒有對代碼生成和xml的要求配置,更加輕量;
- 自動配置spring,簡化maven配置;
- 提供cli(命令行)工具(利用了grovvy),可以在命令行上安裝和操作springboot項目;
1)基本使用:
從官網將Maven文件放入pom.xml就行:
通過Yml文件簡單配置
部署:支持jar和war包
<plugins> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.2</version> <executions> <execution> <id>compile-scala</id> <phase>compile</phase> <goals> <goal>add-source</goal> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile-scala</id> <phase>test-compile</phase> <goals> <goal>add-source</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <recompileMode>incremental</recompileMode> <scalaVersion>${scala.version}</scalaVersion> <args> <arg>-deprecation</arg> </args> <jvmArgs> <jvmArg>-Xms64m</jvmArg> <jvmArg>-Xmx1024m</jvmArg> </jvmArgs> </configuration> </plugin> <!-- 編譯插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <compilerArguments> <verbose/> <bootclasspath>${java.home}/lib/rt.jar</bootclasspath> </compilerArguments> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.0.0</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.5.2.RELEASE</version> </dependency> </dependencies> <configuration> <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope> <createDependencyReducedPom>false</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"> <resource>META-INF/spring.factories</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.wii.AppMain</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
當你生成好jar包之後只需要在命令行:java -Dspring.profiles.active=dev –jar xxx.jar
其他方式
好SpringBoot就可以使用起來了,足夠簡單吧……
2)在這裡我們可以簡單和同類框架進行對比:
?Scala: Playframework框架
?play官網
?Python:Tornado
Tornadoweb
這些框架的基本特徵都是:輕量級,高性能,內嵌伺服器,易於使用;
2.SpringBoot的設計思想
SpringBoot的目標不在於為已解決的問題域提供新的解決方案,而是為平台帶來另一種開發體驗,從而簡化對這些已有技術的使用;
1)模塊化思想
?Boot對Spring應用的開發進行了簡化,提供了模塊化方式導入依賴的能力,強調了開發RESTful
Web服務的功能並提供了生成可運行jar的能力,這一切都清晰地表明在開發可部署的微服務方面Boot框架是一個強大的工具;?你可以很容易的將spring-boot-starter-data-jpa(數據訪問),spring-boot-starter-security(安全控制), spring integration 等模塊導入
2)簡化配置
不在像Spring一樣需要大量的配置,來完成工作;SpringBoot中提供大量的,強大的註解讓你工作起來更加快速和方便。
3)快速構建
通過springboot cli
可以實現在命令行上快速搭建工程;互動式的創建以及運行工程是通過採用Groovy實現。3.原理分析
SpringBoot內嵌應用伺服器包括(Tomcat,Jetty,Undertow),當前主要分析內嵌Tomcat的應用下的整體流程;
首先我們按照從整體到部分的思路來大致理解整個過程:
?Tomcat的整體架構
?SpringBoot啟動階段
?SpringBoot運行階段
?SpringBoot設計上的基本問題
1)Tomcat整體架構
Tomcat支持多個服務運行,但在SpringBoot中由於內嵌Tomcat所以只有一個Service服務運行;
2)啟動階段分析
3)運行狀態分析
4.SpringBoot的基本問題:
Spring Aop 與 IOC ?
1) Ioc:依賴注入
2) Aop:
實現JDK動態代理,CGLIB,Javassist,AspectJSpring並發控制 ?
1)ThreadLocal
2)Future、ThreadPool(Executor)、master-work(fork-join)、producer-consumer、Actor模型等等
3) Spring5
帶來的變革:https://spring.io/blog/2016/09/22/new-in-spring-5-functional-web-framework
應用伺服器:tomcat vs undertow
1)Tomcat:三種接收請求的處理方式:BIO、NIO、APR(從操作系統級別解決非同步IO)
2)Netty:aio、nio => reactor、preactor
3)Undertow: xnio
5.SpringBoot當前社區情況
Spring Cloud為開發人員提供了快速構建分散式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制匯流排)。分散式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支持實現這些模式的服務和應用程序。他們將在任何分散式環境中運行良好,包括開發人員自己的筆記本電腦,裸機數據中心,以及Cloud Foundry等託管平台。
https://springcloud.cc/spring-cloud-dalston.html
1)GitHub:
https://github.com/spring-projects/spring-boot
2)SpringCloud中文網
https://springcloud.cc/
3)SpringCloud官網
http://projects.spring.io/spring-cloud/
4)社區:
https://gitter.im/spring-cloud/spring-cloud
6.微服務帶來的技術變革
產生背景:隨著雲計算、開源、Docker等為技術界帶來革命性的影響,同時,用戶使用方式與生活方式都在移動化浪潮的裹挾下發生了巨變;互聯網產品需求來的快,變得快,使得我們的產品需要不斷的持續創新,不斷給用戶帶來價值;用戶的期望交付周期極大縮短了 ,我們需要以更快的方式迭代並持續集成產品,這就要求我們拋棄傳統單體應用,以新的開發,架構,運維方式來解決我們的問題,「微服務」架構(MSA:Micro
Service Architecture)這一全新的企業架構模式越來越受到關注,也有越來越多的企業和平台服務商開始將「微服務」的概念轉化為實踐,掌握到第一手的實戰經驗。1)微服務:微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,服務之間互相協調,配合為用戶提供最終價值。每個服務運行在其獨立的進程中,服務與服務間採用輕量級的通信機制互相溝通(通常基於HTTP的RESTFUL API);每個服務都圍繞具體業務進行構建,並且能夠被獨立地部署到生產環境,類生產環境等,另外應盡量避免統一的,集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言,工具對其構建。
2)當前問題:
?分散式系統的複雜度:性能,可靠性,非同步,數據一致性,工具;
?運維成本:配置,部署,監控與告警,日誌收集;
?部署自動化;
?devOps與組織架構;
?服務間依賴測試,管理;
推薦閱讀:
※使用Istio簡化微服務系列三:如何才能做「金絲雀部署」,並通過Istio增加流量?
※「演講復盤」技術沙龍(滬江網4月) - 我所遇見的微服務演進這十年
※《微服務設計》閱讀筆記(六)部署
※第一篇:spring boot入門:通過官網:start.spring.io開啟Spring Boot之路
※過去365天,40篇不能錯過的工具類技術乾貨文章集錦
TAG:微服務架構 |