標籤:

微服務之SpringBoot解讀

微服務之SpringBoot解讀

來自專欄 沒事玩點編程吧!

隨著敏捷,精益,持續交付等價值觀和方法論的提出與實踐,以及DevOps文化的推行以及市場對快速交付的需要;Java社區也試著尋找一種能夠快速進行持續交付,同時提供強大的運維能力的框架;Springboot在這個基礎上被創建了出來。

1.SpringBoot所提供的特性:

  • Springboot本身基於spring開發,可創建獨立的Spring應用程序;
  • Springboot Actuator提供了許多運維特性如:應用運行狀態檢查,健康檢查,監控信息等;
  • metrics度量指標:
  • mory, heap, class

    loading, 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,AspectJ

Spring並發控制 ?

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:微服務架構 |