搭建Eureka集羣
搭建Eureka註冊中心集羣
說明
:網上的基本是使用本地改Host文件來搭建多個虛擬域名指向本機。先使用兩臺阿里雲主機來搭建Eureka集羣。
eureka搭建集羣其實就是把N個eureka節點進行相互註冊(Eureka can be made even more resilient and available by running multiple instances and asking them to register with each other).
單個節點
- 導入依賴
<?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>2.1.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.ooyhao.cloud</groupId>
<artifactId>cloud_eureka_1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud_eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<!--添加SpringMVC插件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加Eureka服務器端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--添加Springcloud依賴-->
<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>
- 主程序註解信息
@SpringBootApplication
@EnableEurekaServer //標誌爲Eureka服務
public class CloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(CloudEurekaApplication.class, args);
}
}
- application.properties
# 應用端口號
server.port=8081
# 應用名
spring.application.name=eureka_server
# eureka實例名
eureka.instance.appname=center
# eureka實例的主機名
eureka.instance.hostname=120.79.167.88
# 不要向註冊中心註冊自己(因爲正常業務中只是把當前應用作爲一個服務註冊中心)
# 表示是否將自己註冊在EurekaServer上,默認爲true。由於當前應用就是EurekaServer,所以置爲false
eureka.client.register-with-eureka=false
# 表示表示是否從EurekaServer獲取註冊信息(服務列表,這裏作爲註冊中心,不需要拉取服務列表)
# 默認爲true。單節點不需要同步其他的EurekaServer節點的數據
eureka.client.fetch-registry=false
# 註冊中心地址(服務彼此註冊)
#eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
eureka.client.service-url.defaultZone=http://47.101.47.127:8080/eureka
# 關閉自我保護
eureka.server.enable-self-preservation=false
以上,就可以啓動,作爲單個節點的註冊中心了。但是,在實際開發中,爲了實現高可用,我們需要搭建多節點的服務註冊中心,由於eureka對端口不敏感,所以不能通過端口來部署不同的註冊中心節點,所以我這是通過兩臺aliyun服務器來搭建兩個節點的註冊中心集羣,如下。
多節點集羣
其他不需要改變,主要是兩個服務的配置文件不同,如下:
- application.properties
# 應用端口號
server.port=8081
# 應用名
spring.application.name=eureka_server
# eureka實例名
eureka.instance.appname=center
# eureka實例的主機名
eureka.instance.hostname=120.79.167.88
# 不要向註冊中心註冊自己(因爲正常業務中只是把當前應用作爲一個服務註冊中心)
# 表示是否將自己註冊在EurekaServer上,默認爲true。由於當前應用就是EurekaServer,所以置爲false
eureka.client.register-with-eureka=true
# 表示表示是否從EurekaServer獲取註冊信息(服務列表,這裏作爲註冊中心,不需要拉取服務列表)
# 默認爲true。單節點不需要同步其他的EurekaServer節點的數據
eureka.client.fetch-registry=true
# 註冊中心地址(服務彼此註冊)
#eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
eureka.client.service-url.defaultZone=http://47.101.47.127:8080/eureka
# 關閉自我保護
eureka.server.enable-self-preservation=false
- application.properties
server.port=8080
spring.application.name=eureka_server
eureka.instance.appname=center
eureka.instance.hostname=47.101.47.127
# 不要向註冊中心註冊自己(因爲正常業務中只是把當前應用作爲一個服務註冊中心)
# 表示是否將自己註冊在EurekaServer上,默認爲true。由於當前應用就是EurekaServer,所以置爲false
eureka.client.register-with-eureka=true
# 表示表示是否從EurekaServer獲取註冊信息(服務列表,這裏作爲註冊中心,不需要拉取服務列表)
# 默認爲true。單節點不需要同步其他的EurekaServer節點的數據
eureka.client.fetch-registry=true
# 註冊中心地址
#eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
eureka.client.service-url.defaultZone=http://120.79.167.88:8081/eureka
# 關閉自我保護
eureka.server.enable-self-preservation=false
注意:爲了保證集羣中每一個節點都有其他節點信息,在集羣搭建時,配置文件中eureka.client.service-url.defaultZone屬性通過逗號分隔來配置多個節點,保證兩兩互相註冊(例如3個節點:節點1中註冊節點2和節點3;節點2中註冊節點1和節點3;節點3中註冊節點1和節點2)。
在啓動過程中如果發現先啓動的服務器中報找不到主機異常是正常現象,因爲在集羣搭建的過程中,不管是先啓動哪一個節點,在其他節點未啓動的情況下,節點在檢測其他節點不存在是都會報出異常。
通過修改Host文件或是多個主機搭建的集羣效果圖(以兩個不同主機作爲集羣節點爲例)
- 120.79.167.88節點
- 47.101.47.127節點
replica:副本,由於Eureka集羣中的Eureka實例之間相互同步註冊信息,Eureka實例稱其他Eureka實例爲自己的replica。
這個下面的信息是這個Eureka Server相鄰節點,互爲一個集羣。
註冊服務
啓動一個服務,並註冊到其中一個節點上:
- 依賴
<?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>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ooyhao.cloud</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加Eureka客戶端端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--SpringCloud的項目-->
<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>
- 主程序註解標註爲eureka客戶端
@SpringBootApplication
@EnableEurekaClient //標註爲當前程序爲eureka客戶端
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
- application.properties配置文件
#應用程序端口
server.port=8084
#應用程序的名稱
spring.application.name=feign-consumer
#註冊處中心地址 (註冊時,只需要將自身註冊到註冊中心集羣中的任一一個節點即可,其他節點會自動複製)
eureka.client.service-url.defaultZone=http://47.101.47.127:8080/eureka
#服務以IP地址的形式顯示
eureka.instance.prefer-ip-address=true
效果:
-
47.101.47.127主機控制檯信息。
-
120.79.167.88主機控制檯信息
雖然上面client客戶端只註冊到一個節點上,但是eureka集會自動進行復制,可以複製到其他節點上,但是不建議只註冊到單個節點上,因爲如果當前客戶端註冊的節點宕機了,則客戶端無法註冊到集羣中,導致無法提供服務。推薦的方式是每一個服務(eureka客戶端)都註冊到每一個集羣節點上。這樣可以保證服務正常的註冊到註冊中心集羣中,從而提供服務。