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

相關

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

  2. Spring Cloud實戰系列(二) - 客戶端調用Rest + Ribbon java

  3. Spring Cloud實戰系列(三) - 聲明式客戶端Feign git

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

  5. Spring Cloud實戰系列(五) - 服務網關Zuul web

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

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

  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


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

零壹技術棧

本賬號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分佈式和微服務,架構學習和進階等學習資料和文章。

相關文章
相關標籤/搜索