1. 程式人生 > 其它 >04-微服務之 SpringCloud

04-微服務之 SpringCloud

什麼是 SpringCloud

SpringCloud 就是基於 SpringBoot 提供的一套微服務解決方案,是關注全域性的微服務協調治理框架,是各個微服務架構落地技術的集合體。

SpringCloud 與 SpringBoot 的關係

  • SpringBoot 專注於快速開發單個個體微服務
  • SpringCloud 是關注全域性的微服務協調治理框架,它將 SpringBoot 開發的微服務整合並管理起來,為各個微服務之間提供:配置管理、服務發現、斷路器、路由、代理、事件匯流排等整合服務
  • SpringBoot 可以離開 SpringCloud 獨立使用,而 SpringCloud 離不開 SpringBoot

SpringCloud 與 SpringBoot 的版本選擇

SpringCloud Netflix 環境搭建

  1. 建立通用 Maven 專案:spring-cloud-netflix

  2. 作為總工程,只留一個 pom.xml 檔案即可

  3. 編寫 pom 定義依賴管理

    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.kaishen</groupId>
        <artifactId>spring-cloud-netflix</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!-- 打包方式 -->
        <packaging>pom</packaging>
    
        <!-- 版本號 -->
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
    
            <!-- 日誌相關 -->
            <log4j.version>2.17.2</log4j.version>
            <logback.version>1.3.0-alpha14</logback.version>
    
            <!-- json 相關 -->
            <json.version>20220320</json.version>
            <gson.version>2.9.0</gson.version>
    
            <!-- J2EE 相關 -->
            <lombok.version>1.18.24</lombok.version>
            <lang3.version>3.12.0</lang3.version>
            <dom4j.version>2.1.3</dom4j.version>
            <commons-io.version>2.11.0</commons-io.version>
            <guava.version>31.1-jre</guava.version>
    
            <!-- 資料庫相關 -->
            <druid.version>1.2.9</druid.version>
            <mysql.version>5.1.47</mysql.version>
            <mybatis.version>2.2.2</mybatis.version>
    
            <!-- Netflix Component version -->
            <netflix.component.version>1.4.7.RELEASE</netflix.component.version>
        </properties>
    
        <!-- 依賴管理,此處做管理,每個Module需自行引入所需依賴 -->
        <dependencyManagement>
            <dependencies>
                <!-- SpringCloud 依賴 -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Hoxton.SR12</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
    
                <!-- SpringBoot 依賴 -->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.3.12.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
    
                <!-- region 通用元件 -->
                <!-- log4j -->
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                    <version>${log4j.version}</version>
                </dependency>
    
                <!-- logback -->
                <dependency>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                    <version>${logback.version}</version>
                </dependency>
    
                <!-- json -->
                <dependency>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                    <version>${json.version}</version>
                </dependency>
    
                <!-- google json -->
                <dependency>
                    <groupId>com.google.code.gson</groupId>
                    <artifactId>gson</artifactId>
                    <version>${gson.version}</version>
                </dependency>
    
                <!-- Lombok -->
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                    <scope>provided</scope>
                </dependency>
    
                <!-- lang3 Java 第二 API -->
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                    <version>${lang3.version}</version>
                </dependency>
    
                <!-- dom4j -->
                <dependency>
                    <groupId>org.dom4j</groupId>
                    <artifactId>dom4j</artifactId>
                    <version>${dom4j.version}</version>
                </dependency>
    
                <!-- commons-io -->
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>${commons-io.version}</version>
                </dependency>
    
                <!-- guava 執行緒池技術 -->
                <dependency>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                    <version>${guava.version}</version>
                </dependency>
    
                <!-- druid -->
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                    <version>${druid.version}</version>
                </dependency>
    
                <!-- MySQL -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.version}</version>
                </dependency>
    
                <!-- MyBatis -->
                <dependency>
                    <groupId>org.mybatis.spring.boot</groupId>
                    <artifactId>mybatis-spring-boot-starter</artifactId>
                    <version>${mybatis.version}</version>
                </dependency>
                <!-- endregion -->
    
                <!-- region Netflix Component -->
                <!-- Eureka Server -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-eureka-server</artifactId>
                    <version>${netflix.component.version}</version>
                </dependency>
    
                <!-- Eureka Client -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-eureka</artifactId>
                    <version>${netflix.component.version}</version>
                </dependency>
    
                <!-- Ribbon -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-ribbon</artifactId>
                    <version>${netflix.component.version}</version>
                </dependency>
    
                <!-- Feign -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-feign</artifactId>
                    <version>${netflix.component.version}</version>
                </dependency>
    
                <!-- Hystrix -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-hystrix</artifactId>
                    <version>${netflix.component.version}</version>
                </dependency>
    
                <!-- Dashboard -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
                    <version>${netflix.component.version}</version>
                </dependency>
    
                <!-- Zuul -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-zuul</artifactId>
                    <version>${netflix.component.version}</version>
                </dependency>
    
                <!-- Config Server -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-config-server</artifactId>
                    <version>3.1.2</version>
                </dependency>
    
                <!-- Config Client -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-config</artifactId>
                    <version>3.1.2</version>
                </dependency>
                <!-- endregion -->
            </dependencies>
        </dependencyManagement>
    
    </project>
    
  4. 打包方式改為 pom

  5. 建立 Module,每個 Module 都是一個獨立的微服務

SpringCloud Alibaba 環境搭建

由於 SpringCloud Netflix 相關元件停更,Alibaba 便在原有 SpringCloud 的基礎上推出了一套替代方案

  1. 建立通用 Maven 專案:spring-cloud-alibaba

  2. 作為總工程,只留一個 pom.xml 檔案即可

  3. 編寫 pom 定義依賴管理

    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.kaishen</groupId>
        <artifactId>springcloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!-- 打包方式 -->
        <packaging>pom</packaging>
    
        <!-- 屬性配置 -->
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
    
            <!-- 日誌相關 -->
            <log4j.version>2.17.2</log4j.version>
            <logback.version>1.3.0-alpha14</logback.version>
    
            <!-- json 相關 -->
            <json.version>20220320</json.version>
            <gson.version>2.9.0</gson.version>
    
            <!-- J2EE 相關 -->
            <lombok.version>1.18.24</lombok.version>
            <lang3.version>3.12.0</lang3.version>
            <dom4j.version>2.1.3</dom4j.version>
            <commons-io.version>2.11.0</commons-io.version>
            <guava.version>31.1-jre</guava.version>
    
            <!-- 資料庫相關 -->
            <druid.version>1.2.9</druid.version>
            <mysql.version>5.1.47</mysql.version>
            <mybatis.version>2.2.2</mybatis.version>
    
            <!-- SpringCloud 元件相關 -->
            <springcloud.version>2021.0.2</springcloud.version>
            <alibaba.cloud.version>2021.0.1.0</alibaba.cloud.version>
            <springboot.version>2.6.7</springboot.version>
            <zk.version>3.1.1</zk.version>
            <consul.version>3.1.0</consul.version>
        </properties>
    
        <!-- 依賴管理,此處做管理,每個 Module 需自行引入所需依賴 -->
        <dependencyManagement>
            <dependencies>
                <!-- SpringCloud -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${springcloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
    
                <!-- Alibaba Cloud -->
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>${alibaba.cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
    
                <!-- SpringBoot -->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${springboot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
    
                <!-- region 通用元件 -->
                <!-- log4j -->
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                    <version>${log4j.version}</version>
                </dependency>
    
                <!-- logback -->
                <dependency>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                    <version>${logback.version}</version>
                </dependency>
    
                <!-- json -->
                <dependency>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                    <version>${json.version}</version>
                </dependency>
    
                <!-- google json -->
                <dependency>
                    <groupId>com.google.code.gson</groupId>
                    <artifactId>gson</artifactId>
                    <version>${gson.version}</version>
                </dependency>
    
                <!-- Lombok -->
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                    <scope>provided</scope>
                </dependency>
    
                <!-- lang3 Java 第二 API -->
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                    <version>${lang3.version}</version>
                </dependency>
    
                <!-- dom4j -->
                <dependency>
                    <groupId>org.dom4j</groupId>
                    <artifactId>dom4j</artifactId>
                    <version>${dom4j.version}</version>
                </dependency>
    
                <!-- commons-io -->
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>${commons-io.version}</version>
                </dependency>
    
                <!-- guava 執行緒池技術 -->
                <dependency>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                    <version>${guava.version}</version>
                </dependency>
    
                <!-- druid -->
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                    <version>${druid.version}</version>
                </dependency>
    
                <!-- MySQL -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.version}</version>
                </dependency>
    
                <!-- MyBatis -->
                <dependency>
                    <groupId>org.mybatis.spring.boot</groupId>
                    <artifactId>mybatis-spring-boot-starter</artifactId>
                    <version>${mybatis.version}</version>
                </dependency>
                <!-- endregion -->
    
                <!-- Zookeeper -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
                    <version>${zk.version}</version>
                </dependency>
    
                <!-- Consul -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
                    <version>${consul.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project>
    
  4. 打包方式改為 pom

  5. 建立 Module,每個 Module 都是一個獨立的微服務