包含所有基本要素的完整Spring Cloud demo系列一

脫毛程式猿發表於2018-01-19

1. 概述

本文實現了包含spring cloud的所有的基本要素的完整demo。配置中心、服務註冊和發現中心、通過eureka實現服務的註冊和發現、通過feign+hystrix呼叫服務。

1.1 Demo概述

下圖 包含所有基本要素的完整Spring Cloud demo系列一



  • 配置中心:通過git/svn/本地中獲取公共配置檔案,並通過REST方式供其它服務獲取配置資訊

  • 服務註冊中心:提供服務註冊和發現

  • 服務群(服務提供者):提供服務。服務啟動時,從配置中心獲取公共配置資訊,並將本服務通過eureka註冊到註冊中心。在註冊時,需要配置本服務的名稱,呼叫者通過此名稱呼叫此服務

  • 客戶端(服務呼叫者):客戶端啟動時,從配置中心獲取公共配置資訊,通過要訪問的服務註冊到服務註冊中心的名稱呼叫對應的服務。如果服務註冊的方式是eureka,則客戶端也需要使用eureka訪問。通過ribbon可以實現對服務群的均衡負載。hystrix作為斷路器。feign方式簡化了服務的呼叫方式。

  • 服務路由:通過zuul實現服務的路由。 zuul的作用類似Nginx,這個模組在spring cloud不是必須的。

  • 具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的可以加群。java架構群:591240817 一起交流。

下文介紹如何通過spring cloud實現如上的一個簡單的demo,不含zuul部分。

3. 父工程

工程:cloud-parent
在pom.xml中定義所有服務的公共依賴jar

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 使用spring cloud必須引入 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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

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

    <!-- logback + slf4j -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

    <!-- 測試模組,包括JUnit、Hamcrest、Mockito -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.37</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>
            spring-boot-configuration-processor
        </artifactId>
    </dependency>
</dependencies>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061複製程式碼

3. 配置中心

工程名稱: cloud-config-center
配置中心的配置檔案方式有git,本地檔案(native),svn,這裡只演示前2者的使用方式。

3.1. 配置檔案使用git方式

工程名稱: cloud-config-center
application.properties

server.port=88881複製程式碼

application-gitsimple.properties

# 指定配置檔案所在的git工程路徑
spring.cloud.config.server.git.uri=https://github.com/hryou0922/spring_cloud.git
# 表示將搜尋該資料夾下的配置檔案
spring.cloud.config.server.git.searchPaths=cloud-config-git/simple1234複製程式碼

CloudGitConfigServerApplication

  • @EnableConfigServer :啟用該應用為配置檔案伺服器:讀取遠端配置檔案,轉換為rest介面服務
@SpringBootApplication
@EnableConfigServer // 啟用該應用為配置檔案伺服器:讀取遠端配置檔案,轉換為rest介面服務
public class CloudGitConfigServerApplication {

    public static void main(String[] args) {
        args = new String[1];
        args[0] = "--spring.profiles.active=gitsimple";
        SpringApplication.run(CloudGitConfigServerApplication.class, args);
    }
}12345678910複製程式碼

執行CloudGitConfigServerApplication即可啟動服務

Git的配置檔案放置在這個工程中:cloud-config-git
在simple有兩個檔案,名稱和內容如下:

cloud-config-dev.properties:

simple.config.name=git-dev
simple.config.age=112

#註冊服務的zone
registercenter.eureka.defaultzone=http://localhost:8761/eureka/12345複製程式碼

cloud-config-test.properties:

simple.config.name=git-test
simple.config.age=1

#註冊服務的zone
registercenter.eureka.defaultzone=http://localhost:8761/eureka/12345複製程式碼
  • simple.config.name和simple.config.age做為測試資料,用於後續服務和客戶讀取配置。
  • registercenter.eureka.defaultzone:服務註冊到服務註冊的zone

3.2 配置方式使用native方式

工程名稱: cloud-config-center
在resoucres的目錄下config/simple的建立配置檔案
cloud-config-dev.properties

simple.config.name=native_dev
simple.config.age=113

# 註冊服務的zone
registercenter.eureka.defaultzone=http://localhost:8761/eureka/12345複製程式碼

cloud-config-test.properties

simple.config.name=native_test
simple.config.age=1

# 註冊服務的zone
registercenter.eureka.defaultzone=http://localhost:8761/eureka/12345複製程式碼

application-nativesimple.properties

server.port=8888
# native:啟動從本地讀取配置檔案,必須指定active的值,才可以使用本場配置模式
spring.profiles.active=native
# 自定義配置檔案路徑
spring.cloud.config.server.native.searchLocations=classpath:/config/simple/12345複製程式碼

CloudNativeConfigServerApplication

@SpringBootApplication
@EnableConfigServer // 啟用該應用為配置檔案伺服器:讀取遠端配置檔案,轉換為rest介面服務
public class CloudNativeConfigServerApplication {

    public static void main(String[] args) {
        args = new String[1];
        // 使用native不可以使用spring.profiles.active的方式使用native模式
    //  args[0] = "--spring.profiles.active=nativesimple";
        args[0] = "--spring.config.name=application-nativesimple";
        SpringApplication.run(CloudNativeConfigServerApplication.class, args);
    }
}123456789101112複製程式碼

執行CloudGitConfigServerApplication即可啟動服務

4. 註冊中心

工程名稱:cloud-registration-center
提供服務的註冊和發現

4.1 pom.xml

pom.xml除了繼承cloud-parent的父pom.xml外,還需要加上如下依賴jar

<dependencies>
    <!-- eureka -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

</dependencies>
1234567891011121314151617181920212223242526272829303132333435複製程式碼

4.2 application.properties

應用啟動配置
application.properties

server.port=87611複製程式碼

application-simple.properties

# eureka : 主要配置屬性在EurekaInstanceConfigBean和EurekaClientConfigBean中
eureka.instance.hostname=127.0.0.1
#eureka.client.enabled=false
# 表示是否註冊自身到eureka伺服器,因為當前這個應用就是eureka伺服器,沒必要註冊自身
eureka.client.registerWithEureka=false
# 表示是否從eureka伺服器獲取註冊資訊
eureka.client.fetchRegistry=false
# 設定eureka伺服器所在的地址,查詢服務和註冊服務都需要依賴這個地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/123456789複製程式碼

4.3 應用入口

SimpleCloudRegistrationCenterApplication

  • @EnableEurekaServer:啟動Eureka
@SpringBootApplication
@EnableEurekaServer
public class SimpleCloudRegistrationCenterApplication {

    public static void main(String[] args) {
        args = new String[1];
        args[0] = "--spring.profiles.active=simple";
        SpringApplication.run(SimpleCloudRegistrationCenterApplication.class, args);
    }

}複製程式碼

包含所有基本要素的完整Spring Cloud demo系列一想要了解更可以關注我的微信公眾號


相關文章