SpringCloud升級之路2020.0.x版-6.微服務特性相關的依賴說明

乾貨滿滿張雜湊發表於2021-08-08

本系列程式碼地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford

image

spring-cloud-common 不再是一個純依賴的專案,這個模組包括:

  1. spring-framework-common 的依賴
  2. 同步與非同步微服務公共的依賴
  3. 同步與非同步微服務公共的框架程式碼改造,這個我們後面分析框架以及我們設計的修改的時候,會詳細分析,這裡先跳過

同步與非同步微服務公共的依賴包括

程式碼請參考:https://github.com/HashZhang/spring-cloud-scaffold/blob/master/spring-cloud-iiford/spring-cloud-iiford-spring-cloud-common/pom.xml

1.啟用 Spring Cloud 的 Bootstrap Context:在 Spring Cloud 2020.0.x 版本開始,Bootstrap Context 預設不再啟用。我們的專案,某些模組使用了 spring-cloud-config,這個是需要啟用 Bootstrap Context 的。同時,我們的配置,還通過 bootstrap.ymlapplication.yml 區分了不同配置,如果多環境中配置是一樣並且基本不會動態更改的則放入 bootstrap.yml,不同環境不同或者可能動態修改則放入 application.yml。所以通過加入如下依賴來啟用:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

這個底層實現非常簡單,是否啟用 Bootstrap Context 是通過檢查這個依賴中的 Marker 類是否存在而決定的。參考程式碼:

PropertyUtils.java

/**
 * Property name for bootstrap marker class name.
 */
public static final String MARKER_CLASS = "org.springframework.cloud.bootstrap.marker.Marker";

/**
 * Boolean if bootstrap marker class exists.
 */
public static final boolean MARKER_CLASS_EXISTS = ClassUtils.isPresent(MARKER_CLASS, null);

2.使用 Eureka 作為註冊中心,我們需要新增 Eureka 的客戶端依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.不使用 Ribbon,使用 Spring Cloud LoadBalancer 作為我們的負載均衡器

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

4.使用 resilience4j 作為重試、斷路、限併發、限流的元件基礎

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-cloud2</artifactId>
</dependency>

5.暴露 actuator 相關埠

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

6.使用 prometheus 進行指標監控採集

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

image

spring-cloud-webmvc 是針對基於同步 spring-mvc 的微服務的依賴,同樣的,spring-cloud-webmvc 也包含同步微服務公共的框架程式碼改造,這個我們後面分析框架以及我們設計的修改的時候,會詳細分析,這裡先跳過。我們這裡先只說明依賴:

程式碼請參考:https://github.com/HashZhang/spring-cloud-scaffold/blob/master/spring-cloud-iiford/spring-cloud-iiford-spring-cloud-webmvc/pom.xml

1.spring-cloud-common 的依賴:之前提到過 spring-cloud-common 是 spring-cloud-webmvc 與 spring-cloud-webflux 的公共依賴。

2.使用 undertow 作為我們的 web 容器:web-mvc 預設的容器是 tomcat,需要排除這個依賴,並新增 undertow 相關依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

3.使用 webflux 相關非同步介面,某些微服務主要基於同步介面,但有一些特殊的介面使用的非同步響應式實現,這個並不會發生衝突,所以在這裡我們也新增了 web-flux 依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

4.使用 OpenFeign 作為同步微服務呼叫客戶端,OpenFeign 目前主要還是作為同步客戶端使用,雖然目前也有非同步實現,但是功能與粘合程式碼還不完整,非同步的我們還是會使用 WebClient。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

5.粘合 OpenFeign 與 resilience4j 的程式碼依賴,官方提供了 OpenFeign 與 resilience4j 粘合程式碼,請參考:resilience4j-feign。我們會在此基礎上做一些個性化改造,後面我們會詳細分析。

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-feign</artifactId>
</dependency>

image

spring-cloud-webmvc 是針對基於非同步響應式 spring-webflux 的微服務的依賴,同樣的,spring-cloud-webflux 也包含非同步微服務公共的框架程式碼改造,這個我們後面分析框架以及我們設計的修改的時候,會詳細分析,這裡先跳過。我們這裡先只說明依賴:

程式碼請參考:https://github.com/HashZhang/spring-cloud-scaffold/blob/master/spring-cloud-iiford/spring-cloud-iiford-spring-cloud-webflux/pom.xml

1.spring-cloud-common 的依賴:之前提到過 spring-cloud-common 是 spring-cloud-webmvc 與 spring-cloud-webflux 的公共依賴。

2.使用 webflux 作為我們的 web 容器,這裡我們不需要額外 web 容器。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

3.粘合 project-reactor 與 resilience4j,這個在非同步場景經常會用到,請參考:resilience4j-reactor

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-reactor</artifactId>
</dependency>

本小節我們分析了我們專案中的微服務公共依賴以及基於 web-mvc 同步的微服務依賴和基於 web-flux 非同步的微服務依賴。下一節我們將從一些 Spring 基礎開始,逐步深入分析我們的 Spring Cloud 框架。

微信搜尋“我的程式設計喵”關注公眾號,每日一刷,輕鬆提升技術,斬獲各種offer

相關文章