Spring Cloud 服務註冊與發現、高可用(Eureka)

Spring Cloud 服務註冊與發現、高可用(Eureka)java

1、服務發現

1.1 服務發現

在微服務架構中,服務發現組件是很關鍵的一個組件,服務發現組件就是去管理各服務的網絡地址等信息web

服務提供者、服務消費者、服務發現組件的關係spring

  • 服務啓動時,會將本身的網絡地址等信息註冊到服務發現組件中,讓服務發現組件去存儲管理這些信息
  • 服務消費者從服務發現組件這裏查詢服務提供者的網路地址信息,並使用該地址去調用服務提供者的接口
  • 各服務和服務發現組件經過必定的機制通訊(心跳)

Spring Cloud 支持多種服務發現組件,如 Eureka、Consul 和 Zookeeper 等,這裏主要介紹 Spring Cloud Eureka 的使用緩存

1.2 Eureka 簡介

Eureka 是 Netflix 開源的服務治理模塊,自己是一個基於 Rest 的服務。Spring Cloud 中將 Eureka 集成在 Spring Cloud Netflix 項目中,另外 Spring Cloud Netflix 還提供了自配置的Netflix OSS整合。提供的模塊包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等服務器

Eureka 架構圖網絡

Eureka 是包含兩個組件的: Eureka ServerEureka Client架構

  • Eureka Server 提供服務發現的功能,服務啓動後,向 Eureka Server 註冊本身的地址信息(IP、端口、服務名)
  • Eureka Client 是一個客戶端,用於與 Eureka 的交互
  • 服務啓動後,與 Eureka Server 經過 心跳 機制通訊,默認週期爲 30 秒
  • 當 Eureka Server 在必定時間內接收不到某個服務實例的心跳,將會註銷該實例,默認時間爲 90 秒
  • 默認狀況下 Eureka Server 同時也是 Eureka Client。多個 Eureka Server 實例經過複製的方式來實現服務註冊
  • Eureka Client 有 緩存機制,會緩存服務註冊表中的信息。服務不須要每次請求都查詢 Eureka Server,這樣既下降了 Server 的壓力,同時即使 Eureka Server 的節點都宕機了,也可使用緩存查詢到服務提供者的信息完成調用

2、服務註冊中心 Eureka Server

建立一個 Spring Boot 項目,依賴項 dependencies 添加 Eureka Server , pom.xml 文件部份內容以下:app

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cindy</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>

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

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

要啓動一個服務註冊中心,咱們要使用註解 @EnableEurekaServer負載均衡

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

這個時候若是咱們直接啓動,會發現有個鏈接異常,那是由於默認設置下,服務註冊中心也會把本身當作客戶端來註冊本身,也就是說 eureka server 同時也是一個 eureka client,須要指定一個 server。而一般咱們只須要它做爲註冊中心,可使用 eureka.client.registerWithEureka=falseeureka.client.fetchRegistry:false 來禁用客戶端註冊行爲spring-boot

spring:
  application:
    name: eureka-server

server:
  port: 8761

eureka:
  client:
  	# 是否將本身註冊到 Eureka Server
    registerWithEureka: false
    # 是否從 Eureka Server 獲取註冊信息
    fetchRegistry: false

eureka server 有一個UI的主頁,而且 /eureka/* 下有正常 Eureka 功能的HTTP API端點。

啓動工程,訪問 http://localhost:8761能夠看到如下頁面,因爲尚未註冊服務,因此沒有被發現的服務

3、註冊服務

上面建立了服務註冊中心

接下來咱們來建立服務客戶端,也就是咱們要去註冊的服務

仍是去建立一個 Spring Boot 工程,要添加的依賴爲 Eureka Discovery

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cindy</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>product</name>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>

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

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

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

一樣的,要使用服務註冊須要主類上添加註解,註解爲 @EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class ProductApplication {

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

上面的註解也可以使用 @EnableEurekaClient,而 @EnableDiscoveryClientspring-cloud-commons 項目的註解,是一個高度的抽象,對各類服務發現組件都提供了支持,如 Zookeeper 和 Consul 也支持

這時須要在客戶端這邊配置服務註冊中心的一些信息,defaultZone 是與 Eureka Server 交互地址,用於查詢服務和註冊服務 (默認端口是 8761),若是要向多個服務中心註冊用逗號隔開

spring:
  application:
    name: product
server:
  port: 8081

eureka:
  client:
    serviceUrl:
      # 這裏默認是 http://localhost:8761/eureka/
      defaultZone: http://localhost:8761/eureka/

若是想要 IP 地址註冊,而不是主機名。能夠設置 eureka.instance.preferIpAddress=true

先啓動 Eureka Server,再啓動該工程,咱們打開 Eureka Server 的 UI 界面,能夠看到咱們的 product 服務已經註冊成功了

4、Eureka 的高可用

儘管 Eureka 的客戶端具備緩存機制,即便 Eureka Server 宕機,服務之間也能夠經過緩存調用,可是在 Eureka Server 宕機的時候,一些微服務也可能出現不可用的問題,而這些狀況沒有被更新到緩存中,就可能會影響到某些微服務的調用

生產中一般會部署一個高可用的 Eureka Server 集羣,由上面的 Eureka 架構圖也能夠看出能夠經過運行多個 Eureka Server 實例並讓他們相互註冊來實現高可用部署。

咱們來改一下上面的 eureka-server ,同時啓動兩個實例,來構建雙節點的服務註冊中心

這裏咱們要讓 Eureka Server 相互註冊,因此 registerWithEurekafetchRegistry 就不設置未 false 了,而 serviceUrl.defaultZone 則須要填入其餘 Eureka Server 的服務地址

spring:
  application:
    name: eureka-server

--- 
server:
  port: 8761

eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8762/eureka/
      
---
server:
  port: 8762

eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/

這裏咱們起兩臺服務器,端口號分別爲 8761 和 8762

啓動以後咱們再啓動註冊服務

端口號爲 8762 的 server也能獲取端口號爲 8761 server 的服務註冊信息,儘管咱們的註冊服務只寫了 http://127.0.0.1:8761/eureka/, 這裏咱們要註冊的服務最好把全部的 Eureka Server 地址都添加上,避免在某些狀況下服務重啓會註冊不到

若是要構建多個節點的集羣,其實也是很簡單的,只要它們至少一個邊緣彼此鏈接,也就是兩兩相互註冊就能夠了,同時服務同時向他們進行註冊

相關文章
相關標籤/搜索