天天看點

spring-cloud學習之eureka叢集搭建

開發環境

系統:windows 10

Java:jdk-11.0.2

IDE:IDEA 2019.1

項目結構

demo-spring-cloud

--demo-spring-cloud-eureka

項目代碼

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>

    <groupId>org.mrding.demo</groupId>
    <artifactId>demo-spring-cloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>demo-spring-cloud-eureka</module>
        <module>demo-spring-cloud-service-one</module>
        <module>demo-spring-cloud-service-two</module>
        <module>demo-spring-cloud-service-api</module>
    </modules>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--actuator監控中心-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--jaxb子產品引用(用于解決啟動報錯) - start-->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--jaxb子產品引用 - end-->
        <!--測試-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>           

demo-spring-cloud-eureka

<?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">
    <parent>
        <artifactId>demo-spring-cloud</artifactId>
        <groupId>org.mrding.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-spring-cloud-eureka</artifactId>

    <dependencies>
        <!--Eureka伺服器端依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>org.mrding.demo.spring.cloud.eureka.EurekaServerApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>           

啟動類

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

application.yml

server:
  #服務端口
  port: 8001
spring:
  application:
    #應用名稱
    name: spring-cloud-eureka-server
eureka:
  server:
    #關閉自我保護【用于本地測試時配置-快速剔除失效服務】
    enable-self-preservation: false
    #檢查失效服務間隔【用于本地測試時配置-快速剔除失效服務】
    eviction-interval-timer-in-ms: 9000
  instance:
    #執行個體主機名(建議使用IP)
    hostname: 127.0.0.1
    #自定義執行個體ID(預設為 主機名:應用名:端口号)
    instance-id: ${eureka.instance.hostname}:${server.port}
  client:
    #非叢集服務配置,不将自己當用戶端注冊到自己
    register-with-eureka: false
    #非叢集服務配置,不從服務端拉取服務清單
    fetch-registry: false
    #指定eureka叢集所有服務位址,逗号分隔
    #如果目前服務是eureka服務端,目前服務位址也要包含在内,服務位址結構:http://[hostname]:[port]/eureka/
    #其中hostname建議最好與配置中的eureka.instance.hostname對應,因為服務端會根據hostname從service-url中區分
    #出本機服務url和叢集其它夥伴服務url,如果不對應,會将自身也當成夥伴服務,夥伴服務清單在eureka首頁上
    #DS Replicas部分展示
    service-url:
      defaultZone: http://127.0.0.1:8001/eureka/
management:
  endpoints:
    web:
      exposure:
        #actuator監控中心,開放所有權限
        include: '*'
#################################### eureka 叢集配置示例 start #################################
#eureka:
#  server:
#    #關閉自我保護【用于本地測試時配置-快速剔除失效服務】
#    enable-self-preservation: false
#    #檢查失效服務間隔【用于本地測試時配置-快速剔除失效服務】
#    eviction-interval-timer-in-ms: 1000
#  instance:
#    #執行個體主機名(建議使用IP)
#    hostname: 127.0.0.1
#    #自定義執行個體ID
#    instance-id: ${eureka.instance.hostname}:${server.port}
#    #續約更新時間間隔【用于本地測試時配置-快速剔除失效服務】
#    lease-renewal-interval-in-seconds: 3
#    #續約到期時間【用于本地測試時配置-快速剔除失效服務】
#    lease-expiration-duration-in-seconds: 9
#  client:
#    #指定eureka叢集所有服務位址,逗号分隔
#    #如果目前服務是eureka服務端,目前服務位址也要包含在内,服務位址結構:http://[hostname]:[port]/eureka/
#    #其中hostname建議最好與配置中的eureka.instance.hostname對應,因為服務端會根據hostname從service-url中區分
#    #出本機服務url和叢集其它夥伴服務url,如果不對應,會将自身也當成夥伴服務,夥伴服務清單在eureka首頁上
#    #DS Replicas部分展示
#    service-url:
#      defaultZone: http://127.0.0.1:8001/eureka/,http://localhost:8002/eureka/,http://192.168.10.110:8003/eureka/
#################################### eureka 叢集配置示例 end #################################

           

說明

好了,看起來就是這麼簡單,一些查自網上及個人了解的資訊,都在注釋裡了,這裡針對叢集配置這塊再說明一下:

eureka預設是叢集配置的,是以預設情況下會将自己注冊到叢集所有其它節點上,同時從其它節點上同步拉取服務注冊資訊,單機情況下,叢集内就一個節點,就是本身,不需要注冊到其它節點,也不需要從其它節點拉取注冊資訊,是以有如下配置

#非叢集服務配置,不将自己當用戶端注冊到自己
    register-with-eureka: false
    #非叢集服務配置,不從服務端拉取服務清單
    fetch-registry: false           

而service-url表示叢集服務url集合,不能為空,否則會有一個預設值:

http://localhost:8761/eureka/

, 如果此時你的服務端口不是8761,且eureka.instance.hostname的值不是localhost,那麼服務啟動後會報錯,為什麼呢?

因為eureka會根據eureka.instance.hostname的值,與service-url中各位址的hostname部分對比(結構:

http://[hostname]:[port]/eureka/

),如果不比對,就認為不是自身節點,而是叢集中其它節點,既然同為叢集中的節點,那麼它就會去嘗試和這個節點通信,同步注冊資訊,結果通路不通,當然就報異常了...

上面的結論是我多次修改配置,測試總結出來的,而基于這一結論,我認為service-url這個屬性的配置,不論叢集還是單機,都應該配置上所有eureka服務的位址(單機時就是目前服務位址),且每個eureka服務的位址中的hostname部分一定要與它自身的eureka.instance.hostname值保持一緻

以上,純屬個人總結,如有不對之處,或不同的了解,還請大神留言告之,不盡感激。