1 簡介
Spring Cloud Eureka是Spring Cloud Netflix專案下的服務治理模塊,Netflix完整的服務治理包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等,
2實戰
2.1父專案創建
首先,創建一個Spring Cloud專案名為microservices,并在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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zy</groupId>
<artifactId>microservices</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>microservices</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--配置SpringCloud版本、Java版本和專案的編碼-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<java.version>1.8</java.version>
</properties>
<!--開啟springcloud支持-->
<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>
<modules>
</modules>
</project>
- packaging設定為pom表示該專案僅作為其他專案的聚合,
- dependencyManagement規定了子專案在使用其內部宣告的依賴時不需要指定版本,
- modules用來宣告所有格的子專案,
2.2創建注冊中心
在microservices專案下新建一個名為eureka-service的module,建完之后,做以下改動:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.eureka</groupId>
<artifactId>eureka-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-service</name>
<packaging>jar</packaging>
<!--子專案依賴父專案-->
<parent>
<groupId>com.zy</groupId>
<artifactId>microservices</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!--加入eureka的服務-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
改完之后,回到父專案,將父專案的pom.xml修改為:
<!-- 在父工程添加子工程名稱-->
<modules>
<module>eureka-service</module>
</modules>
2.2.1開啟注冊功能
eureka-service專案作為注冊中心來使用,在eureka-service專案的啟動類上增加注解@EnableEurekaServer,即開啟注冊中心功能,
@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
在開啟注冊功能后,該專案就變成了注冊中心,但同時注冊中心會把自己也當做客戶端,如果不希望這樣可以在配置中剔除,見下文,
2.2.2配置決議
eureka.server前綴的配置項
# 是否允許開啟自我保護模式,預設:true
# 當Eureka服務器在短時間內丟失過多客戶端時,自我保護模式可使服務端不再洗掉失去連接的客戶端
#一般生產環境是開啟的,防止網路原因導致被注冊中心剔除,除錯環境關閉
eureka.server.enable-self-preservation = false
# Peer節點更新間隔,單位:毫秒
eureka.server.peer-eureka-nodes-update-interval-ms =
# Eureka服務器清理無效節點的時間間隔,單位:毫秒,預設:60000,即60秒
eureka.server.eviction-interval-timer-in-ms = 60000
eureka.instance前綴的配置項
# 服務名,默認取 spring.application.name 配置值,如果沒有則為 unknown
eureka.instance.appname = eureka-client
# 實體ID
eureka.instance.instance-id = eureka-client-instance1
# 應用實體主機名
eureka.instance.hostname = localhost
# 客戶端在注冊時使用自己的IP而不是主機名,預設:false
eureka.instance.prefer-ip-address = false
# 應用實體IP
eureka.instance.ip-address = 127.0.0.1
# 服務失效時間,失效的服務將被剔除,單位:秒,默認:90
eureka.instance.lease-expiration-duration-in-seconds = 90
# 服務續約(心跳)頻率,單位:秒,預設30
eureka.instance.lease-renewal-interval-in-seconds = 30
# 狀態頁面的URL,相對路徑,默認使用 HTTP 訪問,如需使用 HTTPS則要使用絕對路徑配置,預設:/info
eureka.instance.status-page-url-path = /info
# 健康檢查頁面的URL,相對路徑,默認使用 HTTP 訪問,如需使用 HTTPS則要使用絕對路徑配置,預設:/health
eureka.instance.health-check-url-path = /health
eureka.client前綴
# Eureka服務器的地址,型別為HashMap,預設的Key為 defaultZone;預設的Value為 http://localhost:8761/eureka
# 如果服務注冊中心為高可用集群時,多個注冊中心地址以逗號分隔,
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
# 是否向注冊中心注冊自己,預設:true
# 一般情況下,Eureka服務端是不需要再注冊自己的
eureka.client.register-with-eureka = true
# 是否從Eureka獲取注冊資訊,預設:true
# 一般情況下,Eureka服務端是不需要的
eureka.client.fetch-registry = true
# 客戶端拉取服務注冊資訊間隔,單位:秒,預設:30
eureka.client.registry-fetch-interval-seconds = 30
# 是否啟用客戶端健康檢查
eureka.client.health-check.enabled = true
#
eureka.client.eureka-service-url-poll-interval-seconds = 60
# 連接Eureka服務器的超時時間,單位:秒,預設:5
eureka.client.eureka-server-connect-timeout-seconds = 5
# 從Eureka服務器讀取資訊的超時時間,單位:秒,預設:8
eureka.client.eureka-server-read-timeout-seconds = 8
# 獲取實體時是否只保留狀態為 UP 的實體,預設:true
eureka.client.filter-only-up-instances = true
# Eureka服務端連接空閑時的關閉時間,單位:秒,預設:30
eureka.client.eureka-connection-idle-timeout-seconds = 30
# 從Eureka客戶端到所有Eureka服務端的連接總數,預設:200
eureka.client.eureka-server-total-connections = 200
# 從Eureka客戶端到每個Eureka服務主機的連接總數,預設:50
eureka.client.eureka-server-total-connections-per-host = 50
2.2.3配置說明
spring.application.name和eureka.instance.appname
同時配置時,eureka.instance.appname優先級更高,
如果沒有配置eureka.instance.appname,則使用spring.application.name的值,如果連spring.application.name都沒有配置,則取unknown,
該配置項對應Eureka界面下圖紅框的內容:

eureka.instance.instance-id
配置項eureka.instance.instance-id的值決定了下圖右側紅框中的顯示內容:

如果沒有設定eureka.instance.instance-id,那么顯示的值將是一個由Eureka自動判斷生成的編號:

eureka.instance.prefer-ip-address、eureka.instance.hostname、eureka.instance.ip-address
在eureka.instance.prefer-ip-address = true時,實體優先使用eureka.instance.ip-address的值進行注冊,如果沒有配置eureka.instance.ip-address,則使用第一個非回環IP地址進行注冊,
此時,我們打開Eureka的界面,在實體上右鍵,復制鏈接地址;或將滑鼠放在下圖右上方的鏈接上(不點擊),就可以獲取實體的地址,如下圖左下角,可見此時實體注冊的是IP:

而當eureka.instance.prefer-ip-address = false時,同樣的方式可以查看實體注冊地址采用了主機名eureka.instance.hostname的值:

2.2.4最終配置
server:
port: 7000
spring:
application:
name: enreka-server
eureka:
server:
#生產環境一般開啟,防止網路原因導致的服務被踢掉
enable-self-preservation: false #當Eureka服務器在短時間內丟失過多客戶端時,自我保護模式可使服務端不再洗掉失去連接的客戶端,false表示注冊中心能及時洗掉下線服務
instance:
hostname: eureka1 #實體主機名
prefer-ip-address: false #
health-check-url-path: /health
status-page-url: /info
client:
register-with-eureka: true # 向注冊中心注冊自己
fetch-registry: true # 獲取注冊中心的注冊過的服務,此選項為true時一般配合register-with-eureka: true 實作eureka的高可用集群
service-url:
# 注冊地址,將當前服務注冊到此地址的注冊中心中
defaultZone: http://eureka2:7001/eureka/
2.3創建服務提供者
新建一個名為account-service的Spring Cloud專案,并修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.account</groupId>
<artifactId>account-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>account-service</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<parent>
<groupId>com.zy</groupId>
<artifactId>microservices</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!--作為enreka的客戶端,-->
<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-web</artifactId>
</dependency>
<!--監控支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
為當前專案的啟動類增加@EnableDiscoveryClient注解:
@SpringBootApplication
@EnableDiscoveryClient//開啟服務發現,也可以使用@EnableEurekaClient,該@EnableDiscoveryClient注解更通用,可以替換為其他注冊中心
public class AccountServiceApplication {
public static void main(String[] args) {
SpringApplication.run(AccountServiceApplication.class, args);
}
}
還需要配置一下當前專案的eureka:
eureka:
instance:
prefer-ip-address: true
client:
register-with-eureka: true #將自己注冊到eureka中
fetch-registry: true #實時從eureka獲取注冊成功的服務
service-url:
# 注冊中心的地址,多個地址使用逗號隔開
defaultZone: http://localhost:7000/eureka/
2.4啟動專案
分別啟動eureka的注冊中心和服務提供者,啟動后可以發現服務提供者可以正常在eureka顯示:

3Eureka集群
在實際生產環境中,eureka作為服務的注冊發現中心,承擔著至關重要的作用,所以需要多點集群部署,下面介紹這種方式,
3.1注冊中心集群搭建
在eureka中,集群采用多個注冊中心相互注冊的方式,首先第一個注冊中心實體的application.yml組態檔如下:
server:
port: 7000
spring:
application:
name: enreka-server
eureka:
server:
#生產環境一般開啟,防止網路原因導致的服務被踢掉
enable-self-preservation: false #當Eureka服務器在短時間內丟失過多客戶端時,自我保護模式可使服務端不再洗掉失去連接的客戶端,false表示注冊中心能及時洗掉下線服務
instance:
hostname: eureka1 #實體主機名
prefer-ip-address: false #
instance-id: service-1
client:
register-with-eureka: true # 向注冊中心注冊自己
fetch-registry: true # 獲取注冊中心的注冊過的服務,此選項為true時一般配合register-with-eureka: true 實作eureka的高可用集群
service-url:
# 注冊地址,將當前服務注冊到此地址的注冊中心中
defaultZone: http://eureka2:7001/eureka/
第二個注冊中心實體的application.yml組態檔如下:
server:
port: 7001
spring:
application:
name: enreka-server
eureka:
server:
#生產環境一般開啟,防止網路原因導致的服務被踢掉
enable-self-preservation: false #當Eureka服務器在短時間內丟失過多客戶端時,自我保護模式可使服務端不再洗掉失去連接的客戶端,false表示注冊中心能及時洗掉下線服務
instance:
hostname: eureka2 #實體主機名
prefer-ip-address: false #
instance-id: service-2
client:
register-with-eureka: true # 向注冊中心注冊自己
fetch-registry: true # 獲取注冊中心的注冊過的服務,此選項為true時一般配合register-with-eureka: true 實作eureka的高可用集群
service-url:
# 注冊地址,將當前服務注冊到此地址的注冊中心中
defaultZone: http://eureka1:7000/eureka/
需要注意的點如下:
-
搭建
eureka集群時需要使用不同的IP或不同域名,當IP相同時認為不是集群,所以這里采用不同域名進行模擬,其中域名eureka1和eureka2是在Hosts檔案中手動配置的:127.0.0.1 eureka1 127.0.0.1 eureka2實際生產時,ip肯定是不相同的,所以可以直接使用IP方式進行集群
-
將hostname修改為各自的域名
-
register-with-eureka和fetch-registry同時設定為true,表示向注冊中心注冊自己,這樣集群才能感應到
-
defaultZone:互相寫對方的注冊地址,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/494132.html
標籤:Java
