開發環境
系統: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值保持一緻
以上,純屬個人總結,如有不對之處,或不同的了解,還請大神留言告之,不盡感激。