1. 程式人生 > >SpringCloud實戰1-Eureka

SpringCloud實戰1-Eureka

熟悉微服務架構或Dubbo框架的都知道,微服務中最核心、最基礎的元件就是註冊中心了。下面利用Spring Cloud Eureka實現服務註冊中心。並註冊一個簡單的服務提供者。

首先先建立一個spirngboot工程,並新增公用依賴。

如下:

複製程式碼

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

複製程式碼

引入spring-cloud-starter-eureka-server依賴

如下:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
        <version>1.3.5.RELEASE</version>
</dependency>

啟動類新增@EnableEurekaServer,啟用註冊中心服務

如下:

複製程式碼

@EnableEurekaServer
@SpringBootApplication
public class RegisterApplication {
    public static void main(String[] args) {
        SpringApplication.run(RegisterApplication.class,args);
    }
}

複製程式碼

配置application.yml

如下:

複製程式碼

#埠號
server:
  port: 8888
#Eureka例項名,叢集中根據這裡相互識別
eureka:
  instance:
    hostname: eureka
#客戶端
  client:
#是否開啟註冊服務,因為這裡如果為true表示自己註冊自己,而自己就是一個服務註冊方,沒必要自己註冊自己
register-with-eureka: false
#是否拉取服務列表,這裡我只提供服務給別的服務。
fetch-registry: false
#註冊中心地址
    service-url:
      defaultZone: http://localhost:8888/eureka/

複製程式碼

然後啟動springboot工程,從瀏覽器訪問http://localhost:8888/,可以看到如下介面,因為還沒有註冊服務,所以應用列表是空的

到這裡,註冊中心就搭建好了。接下來我們就建立兩個服務提供者,註冊到註冊中心。

註冊服務

新建provider1,provider2兩個子模組,用作服務提供者。

如下圖:

新增eureka客戶端依賴

兩個服務提供者的pom.xml都是一樣的,如下:

複製程式碼

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

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

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

複製程式碼

 修改兩個application.yml檔案,圖下圖:

複製程式碼

#埠號
server:
  port: 8080
#Eureka例項名,叢集中根據這裡相互識別
spring:
  application:
    name: hello-service

eureka:
#客戶端
  client:
#註冊中心地址
    service-url:
      defaultZone: http://localhost:8888/eureka/

複製程式碼

 第二provider如下:

複製程式碼

#埠號
server:
  port: 8081
#Eureka例項名,叢集中根據這裡相互識別
spring:
  application:
    name: hello-service

eureka:
#客戶端
  client:
#註冊中心地址
    service-url:
      defaultZone: http://localhost:8888/eureka/

複製程式碼

兩個分別在啟動類上加如下@EnableDiscoveryClient註解,如下所示:

複製程式碼

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class Provider1Application {

    public static void main(String[] args) {
        SpringApplication.run(Provider1Application.class, args);
    }
}

複製程式碼

然後分別啟動這兩個服務,如下圖所示:

看到有兩個HELLO-SERVICE證明兩個服務已經註冊成功了。

構建高可用的註冊中心

註冊中心

在服務治理框架中,通常都會構建一個註冊中心,每個服務單元向註冊中心登記自己提供的服務,包括服務的主機與埠號、服務版本號、通訊協議等一些附加資訊。註冊中心按照服務名分類組織服務清單,

同時還需要以心跳檢測的方式去監測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。

在實際的專案中,單機往往是不夠的,而需要註冊中心叢集,實現註冊中心的高可用。如下圖所示:

服務註冊

在服務治理框架中,通常都會構建一個註冊中心,每個服務單元向註冊中心登記自己提供的服務,包括服務的主機與埠號、服務版本號、通訊協議等一些附加資訊。註冊中心按照服務名分類組織服務清單,同時還需要以心跳檢測的方式去監測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。

服務發現

在服務治理框架下,服務間的呼叫不再通過指定具體的例項地址來實現,而是通過服務名發起請求呼叫實現。服務呼叫方通過服務名從服務註冊中心的服務清單中獲取服務例項的列表清單,通過指定的負載均衡策略取出一個服務例項位置來進行服務呼叫。

Eureka服務端

Eureka服務端,即服務註冊中心。它同其他服務註冊中心一樣,支援高可用配置。依託於強一致性提供良好的服務例項可用性,可以應對多種不同的故障場景。

Eureka服務端支援叢集模式部署,當叢集中有分片發生故障的時候,Eureka會自動轉入自我保護模式。它允許在分片發生故障的時候繼續提供服務的發現和註冊,當故障分配恢復時,叢集中的其他分片會把他們的狀態再次同步回來。叢集中的的不同服務註冊中心通過非同步模式互相複製各自的狀態,這也意味著在給定的時間點每個例項關於所有服務的狀態可能存在不一致的現象。

Eureka客戶端

Eureka客戶端,途中的即服務提供者,主要處理服務的註冊和發現。客戶端服務通過註冊和引數配置的方式,嵌入在客戶端應用程式的程式碼中。在應用程式啟動時,Eureka客戶端向服務註冊中心註冊自身提供的服務,並週期性的傳送心跳來更新它的服務租約。同時,他也能從服務端查詢當前註冊的服務資訊並把它們快取到本地並週期行的重新整理服務狀態。

這裡給讀者解釋一下什麼是註冊,什麼是續約,什麼是下線,什麼是Relicate

  1.註冊,表示服務提供者需要向註冊中心註冊服務,在服務治理框架中,通常都會構建一個註冊中心,每個服務單元向註冊中心登記自己提供的服務,包括服務的主機與埠號、服務版本號、通訊協議等一些附加資訊。

      註冊中心按照服務名分類組織服務清單,同時還需要以心跳檢測的方式去監測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。

  2.續約,這裡類似於心跳檢測機制,預設是每隔90秒,服務提供者需要向註冊中心進行續約,目的是隔一段時間Service Provider呼叫介面,告訴Eureka Server它還活著沒掛,不要把它T了。通俗的說就是它們兩之間的心跳檢測,避免服務提供者被剔除掉

  3.下線,表示服務提供者斷開

為了模擬註冊中心的叢集形式,我這裡再建立一個springcloud-Eureka1註冊中心模組,用於模擬兩臺服務的啟動,如下:

修改第一個Eureka配置如下:

複製程式碼

#埠號
server:
  port: 8888
#Eureka例項名,叢集中根據這裡相互識別
eureka:
  instance:
    hostname: eureka
#客戶端
  client:
    service-url:
      defaultZone: http://localhost:8889/eureka/
  server:
#是否開啟安全保護,預設是開啟的,如果預設開啟,註冊中心的服務列表就算有些服務斷開了,也會繼續儲存
    enable-self-preservation: false
spring:
  application:
    name: eureka-service

複製程式碼

再修改第二個Eureka配置,如下:

複製程式碼

#埠號
server:
  port: 8889
#Eureka例項名,叢集中根據這裡相互識別
eureka:
  instance:
    hostname: eureka1
##續約時間
#    lease-expiration-duration-in-seconds: 90
##定時任務是時間,每個隔多少秒去重新重新整理續約時間
#    lease-renewal-interval-in-seconds: 30
#客戶端
  client:

    service-url:
      defaultZone: http://localhost:8888/eureka/
##每個隔多少秒重新整理獲取服務列表世界
#    registry-fetch-interval-seconds: 30
#服務端:
  server:
    enable-self-preservation: false
spring:
  application:
    name: eureka-service

複製程式碼

其他基本不變,Eureka實現高可用原理其實很簡單,就是兩個Eureka相互註冊,你向我註冊,我向你註冊

然後分別啟動這兩個Eureka

如下:

看一看到,服務列表有兩個同名的EUREKA-SERVICE,證明高可用註冊中心搭建起來了。