本系列程式碼地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford
原始碼檔案:https://github.com/HashZhang/spring-cloud-scaffold/blob/master/spring-cloud-iiford/pom.xml
1. 使用 log4j2 非同步日誌所需要的依賴:需要排除預設的日誌實現 logback,增加 log4j2 的依賴,並且新增 log4j2 非同步日誌需要的 disruptor 依賴。
<!--日誌需要用log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--log4j2非同步日誌需要的依賴,所有專案都必須用log4j2和非同步日誌配置-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>${disruptor.version}</version>
</dependency>
2. javax.xml 的相關依賴。我們的專案使用 JDK 11。JDK 9 之後的模組化特性導致 javax.xml 不自動載入,所以需要如下模組:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>${jaxb.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-xjc</artifactId>
<version>${jaxb.version}</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>${activation.version}</version>
</dependency>
3. 使用 Junit 5 進行單元測試,Junit 5 使用可以參考:Junit5 user guide
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
4. 使用 Spring Boot 單元測試,可以參考:features.testing
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
5. mockito擴充套件,主要是需要mock final類:Spring Boot 單元測試已經包含了 mockito 依賴了,但是我們還需要 Mock final 類,所以新增以下依賴:
<!--mockito擴充套件,主要是需要mock final類-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>${mokito.version}</version>
<scope>test</scope>
</dependency>
6. embedded-redis:使用 embedded-redis 用於涉及 Redis 的單元測試:如果你的單元測試需要訪問 redis,則需要在測試前初始化一個 redis,並在測試後關閉。使用 embedded-redis 就可以。我們在 spring-cloud-parent 中已經新增了這個依賴,所以可以直接使用。參考:embedded-redis
<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
<version>${embedded-redis.version}</version>
<scope>test</scope>
</dependency>
7. sqlite 單元測試依賴:對於資料庫的單元測試,我們可以使用 SQLite。參考:sqlite-jdbc
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>${sqlite-jdbc.version}</version>
<scope>test</scope>
</dependency>
8. 指定編譯級別為 Java 11
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<!--ingore javac compiler assert error-->
<forceJavacCompilerUse>true</forceJavacCompilerUse>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
作為使用 spring 與 spring boot 框架的公共依賴 spring-framework-common 專案是一個純依賴的專案。
1. 內部快取框架統一採用caffeine:這是一個很高效的本地快取框架,介面設計與 Guava-Cache 完全一致,可以很容易地升級。效能上,caffeine 原始碼裡面就有和 Guava-Cache, ConcurrentHashMap,ElasticSearchMap,Collision 和 Ehcache 等等實現的對比測試,並且測試給予了 yahoo 測試庫,模擬了近似於真實使用者場景,並且,caffeine 參考了很多論文實現不同場景適用的快取,例如:
- Adaptive Replacement Cache:http://www.cs.cmu.edu/~15-440/READINGS/megiddo-computer2004.pdf
2.Quadruply-segmented LRU:http://www.cs.cornell.edu/~qhuang/papers/sosp_fbanalysis.pdf - 2 Queue:http://www.tedunangst.com/flak/post/2Q-buffer-cache-algorithm
- Segmented LRU:http://www.is.kyusan-u.ac.jp/~chengk/pub/papers/compsac00_A07-07.pdf
- Filtering-based Buffer Cache:http://storageconference.us/2017/Papers/FilteringBasedBufferCacheAlgorithm.pdf
所以,我們選擇 caffeine 作為我們的本地快取框架,參考:caffeine
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
2. 使用 google 的 java 開發庫 guava:guava 是 google 的 Java 庫,雖然本地快取我們不使用 guava,但是 guava 還有很多其他的元素我們經常用到。參考:guava docs
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
3. 內部序列化統一採用fastjson:注意 json 庫一般都需要預熱一下,後面會提到怎麼做。參考:fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
4. 使用 lombok 簡化程式碼,參考:projectlombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
5. 呼叫路徑記錄 - sleuth。參考:spring-cloud-sleuth
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
6. 跨執行緒 ThreadLocal。參考:transmittable-thread-local
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>${transmittable-thread-local.version}</version>
</dependency>
7. Swagger 相關。參考:swagger
<!--Swagger-->
<!-- swagger java後設資料整合 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- swagger 前端頁面 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
8. Apache Commons 相關工具包。我們會使用一些 Commons 工具包,來簡化程式碼:
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>${commons-collections4.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>${commons-text.version}</version>
</dependency>
本小節我們詳細說明了我們所有專案的 parent,以及 使用了 Spring 與 Spring Boot 特性的工具包依賴 spring-framework-common 的設計。下一節我們將詳細分析提供微服務特性的依賴。
微信搜尋“我的程式設計喵”關注公眾號,每日一刷,輕鬆提升技術,斬獲各種offer: