Spring Cloud實戰系列(一) - 服務註冊與發現Eureka

零壹技術棧發表於2019-01-26

相關

  1. Spring Cloud實戰系列(一) - 服務註冊與發現Eureka

  2. Spring Cloud實戰系列(二) - 客戶端呼叫Rest + Ribbon

  3. Spring Cloud實戰系列(三) - 宣告式客戶端Feign

  4. Spring Cloud實戰系列(四) - 熔斷器Hystrix

  5. Spring Cloud實戰系列(五) - 服務閘道器Zuul

  6. Spring Cloud實戰系列(六) - 分散式配置中心Spring Cloud Config

  7. Spring Cloud實戰系列(七) - 服務鏈路追蹤Spring Cloud Sleuth

  8. Spring Cloud實戰系列(八) - 微服務監控Spring Boot Admin

  9. Spring Cloud實戰系列(九) - 服務認證授權Spring Cloud OAuth 2.0

  10. Spring Cloud實戰系列(十) - 單點登入JWT與Spring Security OAuth

前言

Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模組來實現 服務註冊和發現Eureka 採用了 C-S設計架構Eureka Server 作為 服務註冊中心,系統中的 其他微服務,使用 Eureka客戶端 連線到 Eureka Server,並通過 心跳連線 檢測服務的 存活狀態

正文

  • Eureka Server: 作為 服務註冊中心,提供 服務註冊和發現

  • Eureka Client: 所有註冊到 服務中心 的服務。

    • Service Provider: 把 自身的服務 註冊到 Eureka Server,從而使 服務消費方 能夠找到。

    • Service Consumer: 從 Eureka Server 獲取 服務註冊列表,從而能夠 消費服務

1. 建立服務註冊中心

建立 2 個專案 Module,一個 Module(即 Spring Boot)工程作為 服務註冊中心,即 Eureka Server,另一個作為 Eureka Client

Eureka Server 建立完後的工程 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.ostenant.github.springcloud</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
複製程式碼

2. 啟動服務註冊中心

Eureka 是一個 高可用 的元件,它沒有 後端快取。每一個 例項 註冊之後,需要 定時註冊中心 傳送 心跳(因此可以在記憶體中完成)。在預設情況下 Eureka Server 也是一個 Eureka Client,必須要指定一個 Server。在啟動之前,首先對 Eureka Server 配置 application.yml 檔案。

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
複製程式碼
  • eureka.client.register-with-eureka:

設定是否將自己作為 Eureka Client 註冊到 Eureka Server,預設為 true

  • eureka.client.fetch-registry

設定是否從 Eureka Server 獲取 註冊資訊,預設為 true。因為本例是一個 單點Eureka Server,不需要 同步 其他 Eureka Server 節點的資料,所以設定為 false

  • eureka.client.service-url.defaultZone

設定的是與 Eureka Server互動地址查詢註冊服務 都依賴這個地址,如果有多個可以使用 英文逗號分隔

然後再把註解 @EnableEurekaServer 加在 Spring Boot 工程的啟動類 Application 上面:

@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaserverApplication.class, args);
    }
}
複製程式碼

Eureka Server 是有介面的,啟動專案後,開啟瀏覽器訪問 http://localhost:8761 即可檢視。

3. 建立服務提供者

當一個 Eureka ClientEureka Server 發起 註冊 時,它會提供一些 後設資料,例如 主機 等等。Eureka Server 從每個 Eureka Client 例項接收 心跳訊息。 如果 心跳超時,則通常將該例項從 Eureka Server 中刪除。

建立一個 service-hiModule,建立完成後的 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.ostenant.github.springcloud</groupId>
    <artifactId>service-hi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-hi</name>
    <description>Demo project for Spring Boot</description>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-cloud-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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
複製程式碼

通過 註解 @EnableEurekaClient 表明自己是一個 Eureka Client

@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {
    @Value("${server.port}")
    private String port;

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

    @RequestMapping("/hi")
    public String home(@RequestParam String name) {
        return "Hi " + name + ", I am from port: "  + port;
    }
}
複製程式碼

僅僅 @EnableEurekaClient 是不夠的,還需要在 配置檔案 中註明的 服務註冊中心 的地址,application.yml 配置檔案如下:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8763
spring:
  application:
    name: service-hi
複製程式碼

Eureka 客戶端 需要指明 spring.application.name,用於服務的 唯一標識服務之間 相互呼叫會基於這個 name

啟動並訪問 Eureka Server 的地址 http://localhost:8761,會發現服務名稱為 SERVICE-HI,埠為7862 的服務,已註冊到 Eureka Server 的列表上。

3. 高可用Eureka Server

在一個 分散式系統 中,服務註冊中心 是最重要的基礎部分,必須處於 可以提供服務 的狀態。為了維持其 可用性,使用 叢集 是很好的解決方案。

Eureka 通過節點 對等註冊 的方式實現 高可用的部署,所以只需要為每一個 Eureke Server 配置 其他可用的 Eureke ServerserviceUrl,就能實現高可用部署。

spring:
  profiles:
    active: peer1 #peer2

---

spring:
  profiles: peer1
server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://localhost:8762/eureka/

---

spring:
  profiles: peer2
server:
  port: 8762
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
複製程式碼

更改 Eureka Server 的配置檔案,再分別以 spring.profiles.active=peer1spring.profiles.active=peer2 作為引數,啟動兩次 Eureka Server 即可。

  • 訪問 http://localhost:8761/。可以發現,Eureka Client 已經向 埠號8761Eureka Server 發起註冊。

  • 服務提供者配置檔案 並沒有向 埠號8762Eureka Server 註冊。訪問 http://localhost:8762/。可以發現,服務提供者 的資訊已經向 8762 發起註冊了,即 8761註冊資訊 已經同步到 8762 節點。

參考

  • 方誌朋《深入理解Spring Cloud與微服務構建》

相關文章

  1. Spring Cloud實戰系列(一) - 服務註冊與發現Eureka

  2. Spring Cloud實戰系列(二) - 客戶端呼叫Rest + Ribbon

  3. Spring Cloud實戰系列(三) - 宣告式客戶端呼叫Feign


歡迎關注技術公眾號: 零壹技術棧

零壹技術棧

本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。

相關文章