天天看點

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

Spring Cloud Eureka

服務治理

  是微服務架構中最核心最基本的子產品。用于實作各個微服務執行個體的自動化注冊與發現。

  服務注冊:

    在服務治理架構中,都會建構一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,将主機和端口号、版本号、通信協定等一些附加資訊告知注冊中心,注冊中心按服務名分類組織服務清單。

    服務注冊中心還需要以心跳的方式去監測清單中的服務是否可用,若不可用,需從服務清單中剔除,達到清楚障礙的目的。

  服務發現:

    服務的調用通過向服務名發起請求調用實作。調用方向服務注冊中心咨詢服務,并擷取所有服務的執行個體清單,實作對具體服務執行個體的通路。

Netflix Eureka

  Spring Cloud Eureka 使用Netflix Eureka來實作服務注冊于發現。既包含服務端元件也包含用戶端元件,且均采用java編寫,是以Eureka适用于java實作的分布式系統,或與JVM相容語言建構的系統。

  因為Eureka服務端的服務治理機制提供了完備的RESTful API,也支援非java語言建構的微服務應用納入Eureka的服務治理體系中去。

  Eureka服務端:

    服務注冊中心,支援高可用配置。依托于強一緻性提供良好的服務執行個體可用性,應用于不同的故障場景。

    以叢集部署,分片出現故障時,Eureka進入自我保護模式,其他分片提供服務的發現與注冊,當故障分片恢複時,叢集中的其他分片會把故障分片的狀态再次同步回來。

  Eureka用戶端:

    處理服務的注冊于發現。

    在程式運作時,Eureka用戶端向注冊中心注冊自身提供的服務并周期性地發送心跳來更新它的服務租約。也可以從注冊中心查詢目前注冊的服務資訊并把他們緩存到本地周期性地重新整理服務狀态。

搭建服務注冊中心

  pom依賴:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
     </dependencies>    

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>           

複制

  然後在主類上加上注解@EnableEurekaServer

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

  在application.properties上加入:

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

  eureka.client.register-with-eureka:這是向注冊中心注冊自己,由于本身就是注冊中心,是以設定為false

  eureka.client.fetch-registry:注冊中心就是維護服務執行個體,不需要檢索服務,設定為false

  eureka.client.service-url.defaultZone這個實際上就是注冊中心的位址。

注冊服務提供者

  pom檔案:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>           

複制

  在主類上添加注解@EnableDiscoveryClient

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

  然後在配置檔案中添加:

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

  即可在配置中心中找到服務:

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

高可用注冊中心

  之前我們通過下面兩個參數讓服務中心不注冊自己:

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

  eureka server 的高可用實際上就是将自己作為服務向其他服務注冊中心注冊自己,這樣就可以形成一組互相注冊的服務注冊中心,以實作服務清單的互相同步,達到高可用的效果。

  注:配置檔案還需要添加上面兩個參數,以防止服務中心對自己進行注冊。

建立配置檔案application-peer1.properties,作為peer1配置中心,且執行peer2配置中心:

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

建立配置檔案application-peer2.properties,作為peer2配置中心,且執行peer1配置中心:

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

通過指令行分别啟動peer1和peer2:

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka
SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

這時服務注冊的時候,需要在eureka.client.service-url.defaultZone分别注冊peer1與peer2,用逗号分開。

服務發現與消費

  通過前文已經完成了服務注冊中心與服務提供者了。

  我們現在需要建構一個服務消費者,它主要有兩個目标:服務發現與消費服務。

  服務發現是由eureka的用戶端完成,服務消費是由Ribbon完成。

  Ribbon是一個基于HTTP和TCP的用戶端負載均衡器。

  建立一個SpringBoot的基本工程來實作服務消費者,取名為ribbon-consumer。pom如下:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>           

複制

 在主類上加@EnableDiscoveryClient注解,讓該應用注冊為Eureka用戶端,擷取發現服務能力。同時在主類中注入RestTemplate的Spring Bean執行個體。并通過@LoadBalanced注解開啟用戶端負載均衡。

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

  建立對應的接口控制器:

  注:可以看到通路的位址是一個服務名,而不是一個具體的位址,在服務治理架構中,這是非常重要的特性。

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka

  在配置檔案中配置eureka注冊中心的位置。

SpringCloud微服務實戰——第三章服務治理Spring Cloud Eureka