javascript
Spring Boot(2.1.2.RELEASE) + Spring Cloud (Finchley.RELEASE)搭建服务注册和发现组件Eureka
前言:由于版本原因,部分關于Spring Cloud的書中使用的是Spring Boot 1.x 版本,很多配置或名稱在新版本中已經發(fā)生了改變。此篇文章記錄的是使用較新的Spring Boot 2.x和Spring Cloud Finchley.RELEASE搭建服務注冊和發(fā)現組件Eureka的步驟(部分代碼以截圖形式展現)。
一、搭建Eureka
1. 編寫 Eureka Server
使用IDEA創(chuàng)建一個新的項目。
搭建Eureka服務注冊和發(fā)現組件1.png
選擇maven->Next(無需選擇maven模板)。
搭建Eureka服務注冊和發(fā)現組件2.png
填寫項目的GroupId(公司域名倒寫)和ArtifactId(項目名)
搭建Eureka服務注冊和發(fā)現組件3.png
檢查無誤后點擊Finish即可。
搭建Eureka服務注冊和發(fā)現組件4.png
刪除自動創(chuàng)建的src目錄。
編寫pom.xml文件,添加Spring Boot(2.1.2.RELEASE)父項目和Spring Cloud(Finchley.RELEASE)的依賴。
注意:在添加Spring Cloud依賴時,必須指定type屬性為pom,否則maven會報錯。默認情況下,type屬性為jar,但當依賴的jar包特別多時,會導致pom.xml文件過大,這時我們可以將所有的jar包打成一個pom,然后去依賴這一個pom,就可以依賴所有的jar包。
搭建Eureka服務注冊和發(fā)現組件5.png
創(chuàng)建一個maven子模塊。鼠標移到項目名上點擊鼠標右鍵->New->Module。
搭建Eureka服務注冊和發(fā)現組件6.png
仍然不用做任何選擇直接Next。
搭建Eureka服務注冊和發(fā)現組件7.png
填寫子模塊的ArtifactId為eureka-server,點擊Next。
搭建Eureka服務注冊和發(fā)現組件8.png
填寫Module name檢查無誤后點擊Finish即可。
搭建Eureka服務注冊和發(fā)現組件9.png
搭建Eureka服務注冊和發(fā)現組件10.png
編寫子項目eureka-server的pom.xml文件,添加spring-cloud-starter-netflix-eureka-server的依賴,當前Spring Cloud版本為Finchley.RELEASE,其它版本如有不同可去mvnrepository查找對應ArtifactId。
搭建Eureka服務注冊和發(fā)現組件11.png
在子模塊中創(chuàng)建Spring Boot啟動類EurekaServerApplication.java和配置文件application.yml(properties文件也可)。
注意:啟動類應放置在源碼包下。
搭建Eureka服務注冊和發(fā)現組件12.png
編寫啟動類。添加@SpringBootApplication和@EnableEurekaServer注解。聲明這是一個Spring Boot啟動類同時也是一個Eureka Server。
編寫main方法。
搭建Eureka服務注冊和發(fā)現組件13.png
編寫配置文件application.yml。
搭建Eureka服務注冊和發(fā)現組件14.png
至此,一個Eureka Server就編寫完成。
如果遇到了一些“意料之外”的錯誤,可點擊IDEA右側的maven工具,查看項目依賴是否有誤。可嘗試刷新或重新打開項目。
搭建Eureka服務注冊和發(fā)現組件15.png
運行啟動類的main方法,在瀏覽器中輸入application.yml中配置的地址(http://localhost:8761)即可查看此Eureka Server的相關信息。
搭建Eureka服務注冊和發(fā)現組件16.png
可以看得該Instance currently registered with Eureka這一項還沒有任何內容,因為還沒有Eureka Client向該注冊中心注冊服務。下面就來編寫一個Eureka Client。
2. 編寫 Eureka Client
與創(chuàng)建eureka-server模塊步驟相同。
創(chuàng)建一個maven子模塊。鼠標移到項目名上點擊鼠標右鍵->New->Module。仍然不用做任何選擇直接Next。填寫子模塊的ArtifactId為eureka-client,點擊Next。填寫Module name檢查無誤后點擊Finish即可。
編寫子項目eureka-client的pom.xml文件。
添加spring-cloud-starter-netflix-eureka-client的依賴,當前Spring Cloud版本為Finchley.RELEASE,其它版本如有不同可去mvnrepository查找對應ArtifactId。
添加spring-boot-starter-web的依賴,client必須添加該依賴,無需指定版本。
<?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>eureka</artifactId><groupId>cn.org.lilu</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-client</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>2.1.2.RELEASE</version></dependency></dependencies> </project>創(chuàng)建Spring Boot啟動類EurekaClientApplication.java和配置文件application.yml(properties文件也可)。
注意:啟動類應放置在源碼包下。
編寫配置文件application.yml。應用服務名為eureka-client,端口號1234,服務注冊地址為http://localhost:8761/eureka/。
server:port: 1234 spring:application:name: eureka-client eureka:client:service-url:defaultZone: http://localhost:8761/eureka/編寫啟動類。添加@EnableEurekaClient注解聲明這是一個Eureka Client。
package cn.org.lilu;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;/*** @Auther: lilu* @Date: 2019/6/28* @Description:*/ @SpringBootApplication @EnableEurekaClient public class EurekaClientApplication {public static void main(String[] args) {SpringApplication.run(EurekaClientApplication.class,args);} }至此,一個Eureka Client就編寫完成。運行EurekaClientApplication類的main方法。成功后控制臺會打印:
INFO 70912 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_EUREKA-CLIENT/localhost:eureka-client:1234 - registration status: 204而Eureka Server端的控制臺會打印:
INFO 73316 --- [nio-8761-exec-5] c.n.e.registry.AbstractInstanceRegistry : Registered instance EUREKA-CLIENT/localhost:eureka-client:1234 with status UP (replication=false)此時Eureka Client已向Eureka Server注冊了,訪問http://localhost:8761,可看到Instance currently registered with Eureka這項下已有一個實例注冊。
搭建Eureka服務注冊和發(fā)現組件17
二、搭建高可用Eureka Server集群
1. 編寫雙節(jié)點Eureka Server集群
實際線上生產環(huán)境中,前文編寫的單節(jié)點Eureka Server可靠性不足。
Eureka Client會定時連接Eureka Server,獲取服務注冊表中的信息并緩存到本地。微服務在消費遠程API時總是使用本地緩存中的數據,因此一般情況下,即使單節(jié)點的Eureka Server發(fā)生宕機,也不會影響到各微服務之間的調用,但如果當Eureka Server發(fā)生宕機時,某些微服務恰好也出現了不可用的情況,此時Eureka Client中的緩存并未進行更新,仍然認為服務可用,就會影響到微服務之間的調用,甚至影響整個應用系統(tǒng)的高可用性。因此,生產環(huán)境中需要部署一個高可用Eureka Server集群。
Eureka Server可通過運行多個實例并相互注冊的方式實現高可用。集群中的多個實例會彼此增量的同步數據,保證所有節(jié)點數據一致性。節(jié)點之間相互注冊是Eureka Server的默認行為,無需做任何配置。
下面構建一個雙節(jié)點Eureka Server集群。
創(chuàng)建一個maven子模塊。鼠標移到項目名上點擊鼠標右鍵->New->Module。不做任何選擇直接Next。填寫子模塊的ArtifactId為eureka-server-cluster,點擊Next。填寫Module name檢查無誤后點擊Finish即可。
編寫子模塊eureka-server-cluster的pom.xml文件。
添加spring-cloud-starter-netflix-eureka-server的依賴,當前Spring Cloud版本為Finchley.RELEASE,其它版本如有不同可去mvnrepository查找對應ArtifactId。
<?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>eureka</artifactId><groupId>cn.org.lilu</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-server-cluster</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><version>2.1.2.RELEASE</version></dependency></dependencies> </project>創(chuàng)建Spring Boot啟動類EurekaServerClusterApplication.java和配置文件application.yml(properties文件也可)。
注意:啟動類應放置在源碼包下。
我們要在本地搭建Eureka Server集群環(huán)境,需要運行多個Eureka Server實例,可采用多配置文件格式,在啟動時指定具體的配置文件。也可利用開發(fā)工具IDEA,在啟動一個實例后,修改配置文件再啟動另一個實例。這樣可以很方便地在本地環(huán)境進行測試。
下面介紹利用開發(fā)工具IDEA啟動多個實例的方法。
首先需要修改設置Run/Debug Configurations,點擊Edit Configurations...,找到EurekaServerClusterApplication啟動配置,勾選Allow parallel run選項。我的IDEA版本為2018.3.3。網上看到很多人寫的是去掉Single instance only選項,應該是版本原因。
搭建Eureka服務注冊和發(fā)現組件18
搭建Eureka服務注冊和發(fā)現組件19
為了在本地模擬2個Server服務節(jié)點,需要修改本地host文件,Windows系統(tǒng)在C:\Windows\System32\drivers\etc\hosts中修改,其它系統(tǒng)自行百度文件位置。使用Notpad++或其它記事本軟件以管理員身份打開該文件,在文件末尾添加如下內容后保存(注意文件屬性是否設置了只讀,否則無法保存)。
127.0.0.1 peer1 127.0.0.1 peer2編寫啟動類。添加@EnableEurekaServer注解聲明這是一個Eureka Server。
package cn.org.lilu;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;/*** @Auther: lilu* @Date: 2019/6/27* @Description:*/ @SpringBootApplication @EnableEurekaServer public class EurekaServerClusterApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerClusterApplication.class,args);} }編寫配置文件application.yml。由于在一臺電腦上部署,Server節(jié)點的端口不能相同。為了讓兩個節(jié)點進行相互注冊,在節(jié)點配置1中設置另一個Eureka Server的地址,同樣在節(jié)點配置2中也設置另一個Eureka Server的地址,這樣就實現了相互注冊。
spring:application:name: peer-cluster# 節(jié)點配置1 #server: # port: 8761 #eureka: # instance: # hostname: peer1 # client: # # 設置Eureka Server地址 # service-url: # defaultZone: http://peer2:8762/eureka/# 節(jié)點配置2 server:port: 8762 eureka:instance:hostname: peer2client:# 設置Eureka Server地址service-url:defaultZone: http://peer1:8761/eureka/打開節(jié)點配置1的注釋,將節(jié)點配置2注釋起來,運行啟動類中的main方法,此時控制臺會出現報錯信息,原因是另一個Server節(jié)點還未啟動。修改配置文件application.yml,將節(jié)點配置1注釋起來,打開節(jié)點配置2的注釋,再次運行啟動類中的main方法,運行成功后,可以看得之前出現報錯信息的控制臺中打印了如下內容。
INFO 38848 --- [nio-8762-exec-2] c.n.e.registry.AbstractInstanceRegistry : Registered instance PEER-CLUSTER/localhost:peer-cluster:8761 with status UP (replication=false)此時兩個Server節(jié)點之間已經完成了相互注冊。訪問http://peer1:8761和http://peer2:8762可查看相關信息。
搭建Eureka服務注冊和發(fā)現組件20.png
搭建Eureka服務注冊和發(fā)現組件21.png
至此,一個雙節(jié)點的Eureka Server就搭建完成。
下面介紹使用多配置文件的方式啟動多個Eureka Server實例的方法(部分書中使用了該方法)。
仍然需要修改本地host文件,上文中已說明相關步驟。另外創(chuàng)建兩個配置文件application-peer1.yml和application-peer2.yml。與application.yml在同一目錄。將剛才的節(jié)點配置1的內容復制到application-peer1.yml中,將節(jié)點配置2的內容復制到application-peer2.yml中,修改application.yml中的配置。三個配置文件代碼如下。
application.yml
spring:profiles:active: nativeapplication:name: peer-clusterapplication-peer1.yml
server:port: 8761 eureka:instance:hostname: peer1client:# 設置Eureka Server地址service-url:defaultZone: http://peer2:8762/eureka/application-peer2.yml
server:port: 8762 eureka:instance:hostname: peer2client:# 設置Eureka Server地址service-url:defaultZone: http://peer1:8761/eureka/由于需要打成jar包運行,在pom.xml文件中添加maven插件。完整的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"><parent><artifactId>eureka</artifactId><groupId>cn.org.lilu</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-server-cluster</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><version>2.1.2.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>可直接使用IDEA提供的maven工具打包。點擊IDEA右側的maven工具,找到eureka-server-cluster項目下的Lifecycle,點擊package即可打包。
搭建Eureka服務注冊和發(fā)現組件22.png
生成的jar包在target目錄下。
搭建Eureka服務注冊和發(fā)現組件23.png
右擊target目錄,點擊Open in Terminal進入命令行。
搭建Eureka服務注冊和發(fā)現組件24.png
輸入下面的命令指定配置文件為application-peer1.yml按回車鍵。
java -jar eureka-server-cluster-1.0-SNAPSHOT.jar --spring.profiles.active=peer1運行后控制臺會輸出報錯信息,不用管。再次右擊target目錄,點擊Open in Terminal進入第二個命令行,輸入下面的命令指定配置文件為application-peer2.yml按回車鍵。
java -jar eureka-server-cluster-1.0-SNAPSHOT.jar --spring.profiles.active=peer2啟動完成后,兩個Server就完成了相互注冊,仍可訪問http://peer1:8761和http://peer2:8762查看相關信息。
以上就是使用多配置文件格式搭建雙節(jié)點Eureka Server集群。
2. 將應用注冊到Eureka Server集群上
修改模塊eureka-client的配置文件application.yml,配置多個Eureka Server地址,使用英文逗號分隔。
server:port: 1234 spring:application:name: eureka-client eureka:client:service-url:defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/啟動eureka-client模塊,訪問http://peer1:8761或http://peer2:8762可看到應用已經注冊到Eureka Server集群上了。
搭建Eureka服務注冊和發(fā)現組件25.png
當然,微服務即使只配置Eureka Server集群中的某個節(jié)點,也能正常注冊到Eureka Server集群,因為多個Eureka Server之間的數據會相互同步。不過為了適應某些極端場景,建議在客戶端配置多個Eureka Server節(jié)點。
總結
以上是生活随笔為你收集整理的Spring Boot(2.1.2.RELEASE) + Spring Cloud (Finchley.RELEASE)搭建服务注册和发现组件Eureka的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot2.1+Spring
- 下一篇: JSON学习笔记(一)- 语法