1. 程式人生 > >《Spring Boot揭祕:快速構建微服務體系》讀書筆記

《Spring Boot揭祕:快速構建微服務體系》讀書筆記

第一章 瞭解微服務

火車模型:交付的服務就像一輛火車,這個服務相關的所有功能對應的專案成果,就是要裝上火車車廂的一件件貨物,交付的列車只有等到所有專案都開發測試完成之後才可以裝車觸發,完成這個服務的交付。
微服務的益處:獨立,進而可擴充套件性;多語言生態;
帶來的挑戰:服務的例項數量增多,管理等麻煩;
架構設計上有一種實踐模式,即隔板模式(bulkhead pattern),首要目的就是為了隔離系統中的各個功能單元和實體,使得系統不會因為一個單元或者服務的失敗而導致整體失敗。

第二章 spring框架的本質

IoC有兩種方式,DI(Dependency Injection,當前軟體實體被動接受其依賴的其它元件被IoC容器注入)和DL(Dependency Lookup,當前軟體實體主動去某個服務註冊地查詢其依賴的那些服務)依賴查詢,一個例子“context.getBean()”。
Spring IoC容器的依賴注入工作的兩個階段:
收集和註冊,構建和收集bean定義的階段;
分析和組裝,IoC容器分析這些容器中的bean,根據它們之間的依賴關係先後組裝它們。
常用註解:@ComponentScan、@PropertySource/@ PropertySources(同PropertySourcesPlaceholderConfigurer配合使用)、@Import(註解形式)/@ImportResource(xml形式)

第三章 spring boot工作機制

雖然Dropwizard是公認的最早的微框架,但是spring boot CoC(Convention over Configuration)概念的最佳實踐;
@ SpringBootApplication三位一體== SpringBootConfiguration + EnableAutoConfiguration + ComponentScan;@ EnableAutoConfiguration藉助@Import的幫助,將所有符合自動配置條件的bean定義載入到IoC容器。
@[email protected][email protected]

,藉助於SpringFactoriesLoader的支援,這個類可以智慧地自動配置生效;SpringFactoriesLoader是spring框架的一種擴充套件方案,類似於java的SPI方案ServiceLoader,從指定的配置檔案META-INF/spring.factories載入配置,配置格式為完整的類名形式的key-value。

SpringApplication的執行流程;
精簡後的流程圖:
這裡寫圖片描述
啟動過程中的重要的擴充套件點:
SpringApplicationRunListener
ApplicationListener
ApplicationContextInitializer
CommandLineRunner

基於條件的自動配置有:

@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingClass
@ConditionalOnMissingBean
@ConditionalOnProperty

@Conditional註解,使用這個註解,可以實現自己的自定義條件註解。

另外,還可以對當前要提供的配置或者元件的載入順序進行調整,使用@AutoConfigureAfter/@AutoConfigureBefore

第四章 瞭解常用的spring-boo-starter

對spring boot的行為進行干預的配置方式有以下幾類(優先順序從高到低):
命令列引數:如–spring.profiles.active
系統環境變數
檔案系統中的配置檔案
classpath中的配置檔案
程式碼中的配置項
預設的配置檔名application.properties,放在根目錄或者config子目錄下。
1. logging
預設的實現是logback;想要自定義的話,新增logback.yml/xml等,然後在application.properties加以配置。
2. web
資原始檔統一放在src/main/resources下面,如static/img等;自動配置的SpringMVC的必要元件;還可以對嵌入式的web容器進行定製;
3. jdbc
如果在ApplicationContext裡面配置有多個DataSource例項,指向多個數據庫,則會啟動失敗,解決方法是取消DataSourceAutoConfiguration的自動配置,在SpringBootApplication的註解裡面配置exclude;方法二,@Primary註解。
4. aop
兩個配置項:
apring.aop.auto=false #關閉自動的aop配置
apring.aop.proxy-target-class=true#啟用針對class而不是interface級別的aop代理。
APM(application performance monitoring)的開發,可以考慮dropwizard.metrics的依賴匯入;metrics-annotation依賴包提供的註解:@Timed、@Gauge、@Counted、@Metered、@ExceptionMetered
5. security
Acegi->spring security;security預設提供一個基於HTTP basic認證的安全防護策略,使用者名稱為use,密碼是32位uuid;
Spring security提供的配置項:
security.user.name=
security.user.password=
security.user.role=
核心給你圖:
這裡寫圖片描述
AbstractSecurityInterceptor是抽象類,一般通過實現類來攔截。
AccessDecisionManager是控制機構,決定誰可以訪問哪些資源。
AuthenticationManager解決訪問者的身份驗證的問題。
這三者是spring security的核心,後兩者負責制定規則,前者負責執行。
Spring security的web安全方案基於servlet API規範構建;
這裡寫圖片描述

  1. actuator與應用監控
    actuator自動配置模組預設提供很多endpoint,可以分成兩類,監和控:
    Sensor類監:
    autoconfig、beans、configprops、info、health、env、metrics、trace、mapping
    actuator類控:
    shutdown(關閉應用)、dump(執行執行緒的dump操作)
    預設情況下,除shutdown是關閉的,其他endpoints是開啟的;這有安全隱患,因此建議如果在生產環境中引入actuator模組,建議遵循deny by default原則,將所有的endpoints都關掉,然後再根據需求在application.properties檔案裡面單獨開啟某些需要監控的endpoints:
endpoints.enabled=false
endpoints.info.enabled=true
endpoints.health.enabled=true

還可以自定義應用的健康檢查狀態;
Endpoints資訊只有開放出去才有價值,提供給外部的監控者;這些endpoint例項以JMX bean的形式開放的;預設情況下,在org.springframework.boot名稱空間下,通過配置項可以加以更改:endpoints.jmx.domain=com.johnny.management;
另外,還可以以HTTP協議開放,通過management.為字首的配置項對endpoints的HTTP開放行為進行調整,如management.port=-1,則表示關閉HTTP對外服務;
注意,由於Java的序列號漏洞,以及JMX的遠端訪問防火牆問題,建議使用HTTP協議。

總結:
約定配置三板斧:
建議優先使用相應的spring-boot-starter預設的約定配置;
建議約定配置無法滿足需求的前提下,再基於spring-boot-starter原有約定配置的基礎上進行適當的擴充套件配置。
如果約定加適當的擴充套件配置還是無法滿足需求,則允許開發者推倒重來,基於spring框架的一些原有特性直接實現自己想要的功能。

第五章 spring boot微服務實踐探索

5.1 構建
任何註冊到springboot應用的CommandLineRunner都將在SpringApplication.run執行完成之後再執行。
Dubbo自身定位為一款基於TCP長連線通訊的高效能服務治理框架。
使用springboot構建web API有幾種選擇:starter-jersey構建restful API;starter-hateoas;
一般情況下,starter-web夠用,雖然不規範。
Builder模式;
Spring框架設計不足之處:迴圈條件判斷應用哪個類的時候,條件判斷API開放不足。
Akka框架是scale語言裡面的一種,典型Actor模型;
5.2 釋出與部署
釋出不等於部署;一先一後,後者還要確定服務正常啟動;釋出的形式多種多樣,傳統如jar包,war包,流行如images,面向平臺/系統如rpm、deb包等;
藉助於maven來發布的話,需要先搭建Nexus伺服器(或者artifactory)
Pom檔案:

<distributionManagement>
    <repository>
        <id>deployment</id>
        <name>internal</name>        <url>http://{nexus_server}/nexus/content/repositories/releases</url>
    </repository>
    <snapshotRepository>
        <id>deployment</id>
        <name>internal</name>        <url>http://{nexus_server}/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
</distributionManagement>

Settings.xml檔案:

<server>
    <id>deployment</id>
    <username>root</username>
    <password>root</password >
</server>

rpmbuild檔案用來構建rpm包,使用系統的rpmbuild工具完成,需要一個構建描述檔案,即.spec檔案;

5.3 註冊與發現
可選項,基於Redis、zookeeper、DNS的服務註冊與發現機制。
5.4 監控與運維
Zabbix/Nagios;ElasticSearch對高頻度的寫入並沒有很高的承受力?故而使用Kafka作為資料採集的緩衝區,以便減輕從大量應用結點採集日誌並寫入ES的負擔;
同前文,不建議使用JMX的方式來進行暴露MBean狀態資料,而是使用Jolokia方案,無侵入(啟動時/後掛載javaagent)提供一種基於HTTP的JMX Mbean訪問通道。
資料採集,資料客戶端主動上報(PUSH),採集服務端主動拉取(PULL)

5.5 安全和防護
5.6 釋出和部署平臺

第六章 springboot與Scala

java平臺:語言,類庫和虛擬機器;
6.1 基於maven構建和釋出
基於maven構建Scala專案,引入Dependency:

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>${scala.version}</version>
</dependency>
<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-compiler</artifactId>
    <version>${scala.version}</version>
</dependency>

還需要引入build外掛:

<build>
    <plugins>
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <version></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>
    </plugins>
</build>

還有< properties ></ properties>裡面配置的scala.version以及scala.maven.version
Maven專案的依賴Dependency可以傳遞依賴(transitive Dependency),但是外掛卻不行。解決方法:
1. 使用gist工具(無論是本地還是線上的),然後複製粘帖
2. 在公司內部搭建一個私有的Spring initializer服務例項,如https://start.spring.io/,到https://github.com/spring-io/initializr獲取專案然後部署到自己的服務,然後……
3. 建立公司組織級別的parent工程,package方式為pom。在這裡定義所有的Dependency和plugin。因為maven的外掛可以通過繼承實現重用,不能通過組合實現重用。
4. 使用maven archetype簡化專案建立
包括從零開始建立和在已有的專案的基礎之上建立兩種方式,無論是哪種方式,都需要注意遵守規範。在已有的專案下,建立archetype的步驟:先執行mvn archetype:create-from-project命令,在專案的target/generated-sources/archetype目錄下面生成初版的archetype專案,注意這個專案的結構,還需要進行適當的裁剪,之後cd到上述目錄,執行mvn install/deploy命令完成最終的archetype專案的釋出,以後要建立專案的話,只需要執行命令:

mvn archetype:generate -DarchetypeGroupId= -DarchetypeArtifactId= -DarchetypeVersion= -DGroupId= -DArtifactId= -DVersion=

即可。
上述便是建立一個可以通過命令列的方式快速搭建專案的自定義腳手架專案的大致流程;
更進一步,開發用IDE的情況下,可以把上述成果搬到IDEA裡面去。點選Add archetype即可。

6.2 基於SBT構建和釋出
SBT(simple build tool),triggered execution特性,寫程式碼的同時實時獲得編譯結果反饋。
在不能引入spring-boot-starter-parent的情況下,引入spring-boot-dependencies;why?因為spring-boot-starter-parent是一個空專案,只有pom.xml檔案的定義,其parent就是spring-boot-dependencies,然後spring-boot-dependencies也是一個空專案。
無論什麼starter模組,都依賴spring-boot-starter模組,其pom.xml檔案依賴spring-boot、spring-boot-autoconfigure、spring-boot-starter-logging、spring-core以及snakeyaml。這幾個也是一個springboot專案得以成型的必備依賴。
SBT專案類似與spring initializer這樣的腳手架工具是typesafe activator,執行命令:
activator new scala-project minimal-scala
minimal-scala是為模版的專案名。對應的檔案是build.sbt。
sbt-native-packageer外掛,可以將SBT專案釋出為ZIP、tar、rpm、deb甚至docker images形式。注意釋出時,聲明當前應用是java應用(JavaAppPackaging), 而不是Scala應用,因為編譯完成之後執行器都是java位元組碼;要指定mainClass宣告啟動類。

相關推薦

Spring Boot揭祕快速構建服務體系讀書筆記

第一章 瞭解微服務 火車模型:交付的服務就像一輛火車,這個服務相關的所有功能對應的專案成果,就是要裝上火車車廂的一件件貨物,交付的列車只有等到所有專案都開發測試完成之後才可以裝車觸發,完成這個服務的交付。 微服務的益處:獨立,進而可擴充套件性;多語言生態;

Spring Boot 入門(四)服務之 Config Server 統一配置中心

bootstra pan pat 默認 star default client efault localhost 一、目錄結構 二、pom文件 <!-- 配置服務依賴 --> <dependency> &l

spring boot系列01--快速構建spring boot項目

註解 spring auto enc java ram fig 技術 configure 最近的項目用spring boot 框架 借此學習了一下 這裏做一下總結記錄 非常便利的一個框架 它的優缺點我就不在這背書了 想了解的可以自行度娘谷歌 說一下要寫什麽吧 其實還真不

Maven安裝 &快速構建服務項目

maven3 成功 open ext mis 創建 根目錄 unable 安裝 Maven安裝手冊 1、準備安裝包   安裝包: apache-maven-3.5.4-bin.zip (最好JDK 1.7及以上版本)   集成包: eclipse-maven3-plugi

Spring Boot(1) 快速入門

標準 版本號 odi enable 部署 tro 依賴包 -m xsd Spring Boot 簡介 Spring Boot非常簡單易用,我們只需要很少的配置,就可以使用Spring Boot快速的搭建基於Spring的生產級程序。Spring Boot提供了一種特殊的方式

Spring boot入門快速搭建Spring boot專案(一)

(一)Spring boot介紹   本部分摘自:https://www.zhihu.com/question/64671972/answer/223383505   Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定

spring-boot-admin 配合eureka實現 服務監控

admin server配置: pom依賴: <dependencies> <dependency> <groupId>org.springframework.boot</groupId>

第二篇SpringCloud 構建服務系統之服務註冊和發現(nacos)

上一篇我們學習了一下consul在soringcloud中的使用。今天要給大家介紹的阿里巴巴中介軟體團隊出品的Nacos來作為新一代的服務管理中介軟體。 首先學習Nacos之前,我們應該看看Nacos的官網,對它有一個初步的認識。 1. Nacos 官網 (https://nacos

第一篇SpringCloud 構建服務系統之服務註冊和發現(consul)

今天我們要學習的是consul在soringcloud中的使用。首先學習consul之前,我們應該看看consul的官網,對它有一個初步的認識。 1. consul 官網 (https://www.consul.io) 2. consul 簡介 consul是googl

Spring Boot 系列(1) 服務介紹

相信做過ssh或者ssm專案的人都曾經被那些繁瑣的xml檔案所困擾,後來,隨著註解的出現,註解式開發變得越來越普及,但是有的時候,開發還是離不開xml。 Spring Boot的核心功能: 1.生產出獨立地jar檔案來執行,執行一個Spring Boot的專

Spring Boot實戰part1 構建第一個spring boot 專案

系統環境 MacOS、JDK1.8、maven3.6.2、 IntelliJ IDEA 2019.2 搭建springboot專案 搭建專案可以選擇start.spring.io線上構建或直接在IDE工具構建 一、使用start.spring.io線上構建

Spring Cloud服務讀書筆記

Spring Cloud概述 dubbo與spring cloud的區別 dubbo基於Netty的TCP及二進位制的資料傳輸,spring cloud基於http,http每次都要建立連線,在效能上有些損耗 什麼是微服務 微服務是一種架構風格,將單體應用劃分為小型的服務

構建服務快速搭建Spring Boot專案

Spring Boot簡介:        Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力於在蓬勃發展的快速應用開發領域

Spring Cloud(2)構建服務 - Spring Boot

color 並發 時間 基於 執行 sof mil master 超時 微服務的特點及構建遵循的原則 約束:微服務遵循UNIX理念,即應用程序是服務的集合,每個服務只做一件事,並做好一件事。 松耦合:基於微服務的應用程序是小型服務的集合,服務之間使用HTTP和REST通

Spring Boot + Spring Cloud 構建服務系統(三)服務消費和負載(Feign)

Spring Cloud Feign Spring Cloud Feign是一套基於Netflix Feign實現的宣告式服務呼叫客戶端。它使得編寫Web服務客戶端變得更加簡單。我們只需要通過建立介面並用註解來配置它既可完成對Web服務介面的繫結。它具備可插拔的註解支援,包括Feign註解、JAX-RS註解

Spring Boot + Spring Cloud 構建服務系統(二)服務消費和負載(Ribbon)

使用RestTemplate呼叫服務 在上一篇教程中,我們是這樣呼叫服務的,先通過 LoadBalancerClient 選取出對應的服務,然後使用 RestTemplate 進行遠端呼叫。 LoadBalancerClient 就是負載均衡器,預設使用的是 Ribbon 的實現 RibbonLoadBa

構建服務Spring boot 入門篇

public class HelloWorldControlerTests { private MockMvc mvc; @Before public void setUp() throws Exception { mvc = MockMvcBuilders.stand

Spring Boot + Spring Cloud 構建服務系統(七)API服務閘道器(Zuul)

技術背景 前面我們通過Ribbon或Feign實現了微服務之間的呼叫和負載均衡,那我們的各種微服務又要如何提供給外部應用呼叫呢。 當然,因為是REST API介面,外部客戶端直接呼叫各個微服務是沒有問題的,但出於種種原因,這並不是一個好的選擇。 讓客戶端直接與各個微服務通訊,會有以下幾個問題: 客戶端會多次

Spring Boot + Spring Cloud 構建服務系統(八)分散式鏈路追蹤(Sleuth、Zipkin)

技術背景 在微服務架構中,隨著業務發展,系統拆分導致系統呼叫鏈路愈發複雜,一個看似簡單的前端請求可能最終需要呼叫很多次後端服務才能完成,那麼當整個請求出現問題時,我們很難得知到底是哪個服務出了問題導致的,這時就需要解決一個問題,如何快速定位服務故障點,於是,分散式系統呼叫鏈追蹤技術就此誕生了。 ZipKin

Spring Boot + Spring Cloud 構建服務系統(五)熔斷監控面板(Hystrix Dashboard)

Hystrix Dashboard Hystrix-dashboard是一款針對Hystrix進行實時監控的工具,通過Hystrix Dashboard我們可以在直觀地看到各Hystrix Command的請求響應時間, 請求成功率等資料。 新增依賴 我們新建一個工程 spring-cloud-consul-