本文首發於我的的公衆號:Java技術大雜燴,歡迎關注共同窗習,有Spring , Mybatis, Redis, JDK 等源碼分析的文章java
本文將從如下方面進行介紹git
前言
例子
搭建集羣github
Eureka 主要是用於進行服務的註冊和發現,今天就來學習一下如何使用 Eureka,關於 Eureka的更多信息能夠參考 Netflix / eureka 和 Spring-Eurekaweb
Eureka 的主要架構圖以下所示:spring
Eureka 主要有三種角色,Eureka Server, Eureka Client,其中 Eureka Client 包括 Service Provider 和 Service Consumerapache
一、Eureka Server :註冊中心,提供服務註冊和發現,註冊中心能夠搭建成集羣模式來實現服務的高可用json
二、Service Provider : 服務提供方,將自身服務註冊到Eureka,從而使服務消費方可以找到瀏覽器
三、Service Consumer:服務消費方,從Eureka獲取註冊服務列表,從而可以消費服務bash
接下來,根據 Spring Eureka 的 官方文檔 來手動寫一個例子。服務器
先來實現 Eureka Server 註冊中心,首先新建 Spring 的 maven 項目, 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> <groupId>com.tsmyk</groupId> <artifactId>eureka_server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka_server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <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> <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>
而後在 application.properties 配置文件中添加以下配置:
spring.application.name=spring-cloud-eureka # 端口 server.port=8761 # IP server.ip=localhost #表示是否將本身註冊到Eureka Server,默認爲true。 eureka.client.register-with-eureka=false #表示是否從Eureka Server獲取註冊信息,默認爲true。 eureka.client.fetch-registry=false #設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。 eureka.client.serviceUrl.defaultZone=http://${server.ip}:${server.port}/eureka/ logging.level.com.netflix.eureka=OFF logging.level.com.netflix.discovery=OFF
由於它是一個服務註冊中心,本身不須要向本身註冊,也不須要中註冊中心獲取服務,因此須要把這兩項設爲false:eureka.client.register-with-eureka,eureka.client.fetch-registry
以後,在啓動類上面加上註解 @EnableEurekaServer ,運行:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
在瀏覽器中輸入:http://localhost:8761/ 顯示以下頁面,就表示 Eureka Server 註冊中心就搭建好了:
因爲咱們尚未註冊任何的實例,因此在 Instances currently registered with Eureka 中顯示沒有可用的實例。
接下來,寫一個 Eureka 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>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.tsmyk</groupId> <artifactId>eureka_client_2</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka_client_2</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <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-test</artifactId> <scope>test</scope> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
配置文件 application.properties 的配置以下:
#端口號 server.port=8765 #服務名 spring.application.name=eureka-client-2 #註冊到eureka中心,獲取到配置服務 eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ #設置實例的ID爲ip:port eureka.instance.instance-id=localhost:${server.port} # 心跳時間,即服務續約間隔時間(缺省爲30s) eureka.instance.lease-renewal-interval-in-seconds=5 # 發呆時間,即服務續約到期時間(缺省爲90s) eureka.instance.lease-expiration-duration-in-seconds=10
以後,在啓動類加上註解 @EnableDiscoveryClient,運行:
@EnableDiscoveryClient @SpringBootApplication public class EurekaClient2Application { public static void main(String[] args) { SpringApplication.run(EurekaClient2Application.class, args); } }
此時,在瀏覽器中輸入上面的網址:http://localhost:8761/,以下:
此時能夠看到,咱們的 Eureka-client 已經註冊上了,狀態爲 UP,地址爲:locahost:8765.
以上就是一個簡單的服務的註冊於發現的例子。
爲了保證註冊中心的高可用,Eureka Server 註冊中心通常須要搭建爲集羣模式,如今,就來搭建三個Eureka Server註冊中心實現集羣模式。每一個註冊中心的 eureka.client.service-url.defaultZone 須要指向其餘兩個 Eureka Server 註冊中心地址。
新建三個Spring項目,分別爲三個 Eureka Server 註冊中心,代碼和上面的同樣,只不過配置文件有所不一樣
第一個Eureka Server 註冊中心的配置文件:
spring.application.name=spring-cloud-eureka # 端口 server.port=8761 eureka.instance.hostname=eureka-server-peer1 #表示是否將本身註冊到Eureka Server,默認爲true。 eureka.client.register-with-eureka=true #表示是否從Eureka Server獲取註冊信息,默認爲true。 eureka.client.fetch-registry=true #設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。 eureka.client.serviceUrl.defaultZone=http://eureka-server-peer2:8762/eureka/,http://eureka-server-peer3:8763/eureka/ logging.level.com.netflix.eureka=OFF logging.level.com.netflix.discovery=OFF
其中,須要把 eureka.client.register-with-eureka,eureka.client.fetch-registry 設爲 true,而後,eureka.client.serviceUrl.defaultZone 指向其餘兩個註冊中心的地址。
第二個Eureka Server 註冊中心的配置文件:
spring.application.name=spring-cloud-eureka # 端口 server.port=8762 eureka.instance.hostname=eureka-server-peer2 #表示是否將本身註冊到Eureka Server,默認爲true。 eureka.client.register-with-eureka=true #表示是否從Eureka Server獲取註冊信息,默認爲true。 eureka.client.fetch-registry=true #設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。 eureka.client.serviceUrl.defaultZone=http://eureka-server-peer1:8761/eureka/,http://eureka-server-peer3:8763/eureka/ #爲false,關閉自我保護 eureka.server.enable-self-preservation=false #清理間隔, 單位毫秒,默認是60*1000 eureka.server.eviction-interval-timer-in-ms=4000 logging.level.com.netflix.eureka=OFF logging.level.com.netflix.discovery=OFF
第三個 Eureka Server 註冊中心的配置文件:
spring.application.name=spring-cloud-eureka # 端口 server.port=8763 eureka.instance.hostname=eureka-server-peer3 #表示是否將本身註冊到Eureka Server,默認爲true。 eureka.client.register-with-eureka=true #表示是否從Eureka Server獲取註冊信息,默認爲true。 eureka.client.fetch-registry=true #設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。 eureka.client.serviceUrl.defaultZone=http://eureka-server-peer1:8761/eureka/,http://eureka-server-peer2:8762/eureka/ logging.level.com.netflix.eureka=OFF logging.level.com.netflix.discovery=OFF
如今,再寫兩個 Eureka Clinet 分別向 eureka-server-peer1 和 eureka-server-peer3 進行註冊,
第一個 Eureka Clinet 配置文件:
#端口號 server.port=8764 #服務名 spring.application.name=eureka-client-1 #註冊到eureka中心,獲取到配置服務 eureka.client.service-url.defaultZone=http://eureka-server-peer1:8761/eureka/ #設置實例的ID爲ip:port eureka.instance.instance-id=localhost:${server.port} # 心跳時間,即服務續約間隔時間(缺省爲30s) eureka.instance.lease-renewal-interval-in-seconds=5 # 發呆時間,即服務續約到期時間(缺省爲90s) eureka.instance.lease-expiration-duration-in-seconds=10
eureka.client.service-url.defaultZone=http://eureka-server-peer1:8761/eureka/ 表示向第一個中註冊中心進行註冊。
第二個 Eureka Clinet 配置文件:
#端口號 server.port=8765 #服務名 spring.application.name=eureka-client-2 #註冊到eureka中心,獲取到配置服務 #eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ eureka.client.service-url.defaultZone=http://eureka-server-peer3:8763/eureka/ #設置實例的ID爲ip:port eureka.instance.instance-id=localhost:${server.port} # 心跳時間,即服務續約間隔時間(缺省爲30s) eureka.instance.lease-renewal-interval-in-seconds=5 # 發呆時間,即服務續約到期時間(缺省爲90s) eureka.instance.lease-expiration-duration-in-seconds=10
eureka.client.service-url.defaultZone=http://eureka-server-peer3:8763/eureka/ 表示向第三個中註冊中心進行註冊。
而後在 hosts 文件中加入以下信息:
127.0.0.1 eureka-server-peer1 127.0.0.1 eureka-server-peer2 127.0.0.1 eureka-server-peer3
如今運行這 5 個項目,瀏覽器中輸入 : http://localhost:8761/,以下所示:
有兩個服務已經註冊上來了:
註冊中心的副本有兩個,可用的註冊中心也有兩個:
當咱們把第二個註冊中心停掉以後,它就會變爲不可用:
當把第二個註冊中心停掉以後,它並不會立馬變爲不可用狀態,這是因爲Eureka擁有自我保護機制,當其註冊表裏服務由於網絡或其餘緣由出現故障而關停時,Eureka不會立馬剔除服務註冊,而是等待其修復。可是能夠經過參數來關閉自我保護:
#爲false,關閉自我保護 eureka.server.enable-self-preservation=false #清理無效節點的時間間隔, 單位毫秒,默認是60*1000 eureka.server.eviction-interval-timer-in-ms=4000
上述除了一些經常使用配置外,Eureka Client 還配置了
eureka.instance.lease-renewal-interval-in-seconds=5 eureka.instance.lease-expiration-duration-in-seconds=10
eureka.instance.lease-renewal-interval-in-seconds 表示心跳時間,即服務續約間隔時間(缺省爲30s)
eureka.instance.lease-expiration-duration-in-seconds 表示發呆時間,即服務續約到期時間(缺省爲90s)
心跳時間的意思就是,客戶端須要每隔多少時間向註冊中心發下心跳來代表本身還活着,這個時間默認是 30 秒。
發呆時間的意思就是,eureka服務器在接受到實例最後一次發出的心跳後,須要等待多久才能夠將此實例刪除,這個時間默認是 90 秒。
此外,Eureka Client 還能夠配置間隔多少時間去 Eureka Server 註冊中心拉取註冊信息,這個默認時間是 30 秒,經過如下參數進行配置:
以上就是 Spring Eureka 服務註冊於發現的例子。