1. 程式人生 > >Spring-cloud微服務 Eureka學習教程-單伺服器配置之快速搭建EurekaServer、EurekaClient(基礎)

Spring-cloud微服務 Eureka學習教程-單伺服器配置之快速搭建EurekaServer、EurekaClient(基礎)

以下例項程式碼下載地址:https://github.com/wades2/EurekaDemo       

Eureka是Spring Cloud Netflix的一個子模組,也是核心模組之一。用於雲端服務發現,一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。

        什麼是服務發現:服務發現是微服務基礎架構的關鍵原則之一。試圖著手配置每個客戶端或某種格式的約定可以說是非常困難的和非常脆弱的。Eureka是Netflix服務發現的一種服務和客戶端。這種服務是可以被高可用性配置的和部署,並且在註冊的服務當中,每個服務的狀態可以互相複製給彼此。  
    
        什麼是服務註冊:當一個客戶端註冊到Eureka,它提供關於自己的元資料(諸如主機和埠,健康指標URL,首頁等)Eureka通過一個服務從各個例項接收心跳資訊。如果心跳接收失敗超過配置的時間,例項將會正常從註冊裡面移除。【引】

        所以在配置Eureka的時候,我們需要配置Eureka-Service端,用於監聽各個註冊在shan上面的客戶端,也需要的客戶端去實現這個註冊。此篇文章作為一個入門,先談談怎麼單點配置。由於Spring-cloud是基於Spring Boot的一整個生態,所以搭建Eureka也是基於spring-boot的(建議對spring-boot相對生疏的可以先從spring-boot入門)。      

       首先我們需要配置的是Service端:

       以下是我service端的pom配置:

       

<?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>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

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

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

    <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-server</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>

spring-cloud-starter-eureka-server,這個就是eureka註冊中心。

然後是service端的配置檔案:

# 應用程式的名稱
spring.application.name=eureka-server2
#修改啟動埠
server.port=8083
# 是否將該例項的註冊資訊註冊到Eureka伺服器上,在只有一個Eureka伺服器的情況下沒必要,只是用於例項的發現
eureka.client.register-with-eureka=false

# 是否向Eureka伺服器獲取註冊資訊,在單例項的Eureka中共沒必要
eureka.client.fetch-registry=false
#Eureka Server能夠迅速有效地踢出已關停的節點,但是新手由於Eureka自我保護模式,以及心跳週期長的原因,常常會遇到Eureka Server不踢出已關停的節點的問題
# 設為false,關閉自我保護
eureka.server.enable-self-preservation=false
#清理間隔
eureka.server.eviction-interval-timer-in-ms=60000

eureka.client.serviceUrl.defaultZone=http://localhost:8083/eureka
eureka.server.enable-self-preservation

這裡有關service的配置,一般不建議關閉自我保護,這裡只是留著後期做個測試。如果正常配置,

eureka.server.enable-self-preservation依舊為true。

然後我們嘗試寫執行zhu主程式:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

在這裡可能會有一部分坑,就是沒有EnableEurekaServer,這個原因就是相關依賴的jar包沒有匯入進去,進POM檔案裡面,推薦新增上版本號。然後重新MAVEN匯入下就好了。

現在我們執行起來,可以看到頁面是這個樣子的:

因為我們還沒有例項註冊進去,所以可以看到裡面什麼例項都沒有。接下來我們可以開始Client端,也是注入例項。

我們重新new一個模組出來。我個人的demo是這樣的:

Client端配置:

POM檔案引入配置:

<?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>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

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

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

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

        <!--<dependency>-->
            <!--<groupId>org.springframework.cloud</groupId>-->
            <!--<artifactId>spring-cloud-netflix-eureka-client</artifactId>-->
            <!--<version>1.3.6.RELEASE</version>-->
        <!--</dependency>-->

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


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


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


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>

然後是配置檔案application.properties:

spring.application.name=eureka_client

#eureka.client.allow-redirects=false
#修改啟動埠
server.port=8084
eureka.client.serviceUrl.defaultZone=http://localhost:8083/eureka
eureka.client.register-with-eureka=true

這裡的defaultzone就是註冊service的預設地址。

然後是啟動項:

package com.example.demo;

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

@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

我們這裡用的註解是EnableDiscoveryClient,當然也可以選擇EnableEurekaClient。

EnableDiscoveryClient基於spring-cloud-commons, EnableEurekaClient基於spring-cloud-netflix。如果選用的註冊中心是eureka,那麼就推薦@EnableEurekaClient,如果是其他的註冊中心,那麼推薦使用@EnableDiscoveryClient。

啟動Client之後,我們可以看到,例項下有了資料: