前言:由于版本原因棘利,部分關(guān)于Spring Cloud的書中使用的是Spring Boot 1.x 版本广料,很多配置或名稱在新版本中已經(jīng)發(fā)生了改變喇潘。此篇文章記錄的是使用較新的Spring Boot 2.x和Spring Cloud Finchley.RELEASE搭建服務(wù)注冊和發(fā)現(xiàn)組件Eureka的步驟(部分代碼以截圖形式展現(xiàn))嫩痰。
一铲掐、搭建Eureka
1. 編寫 Eureka Server
使用IDEA創(chuàng)建一個新的項目。
選擇maven->Next(無需選擇maven模板)讯檐。
填寫項目的GroupId(公司域名倒寫)和ArtifactId(項目名)
檢查無誤后點擊Finish即可羡疗。
刪除自動創(chuàng)建的src目錄。
編寫pom.xml文件别洪,添加Spring Boot(2.1.2.RELEASE)父項目和Spring Cloud(Finchley.RELEASE)的依賴叨恨。
注意:在添加Spring Cloud依賴時,必須指定type屬性為pom挖垛,否則maven會報錯痒钝。默認(rèn)情況下,type屬性為jar,但當(dāng)依賴的jar包特別多時蝎亚,會導(dǎo)致pom.xml文件過大剑令,這時我們可以將所有的jar包打成一個pom,然后去依賴這一個pom栋荸,就可以依賴所有的jar包。
創(chuàng)建一個maven子模塊凭舶。鼠標(biāo)移到項目名上點擊鼠標(biāo)右鍵->New->Module晌块。
仍然不用做任何選擇直接Next。
填寫子模塊的ArtifactId為eureka-server帅霜,點擊Next匆背。
填寫Module name檢查無誤后點擊Finish即可。
編寫子項目eureka-server的pom.xml文件身冀,添加spring-cloud-starter-netflix-eureka-server的依賴靠汁,當(dāng)前Spring Cloud版本為Finchley.RELEASE蜂大,其它版本如有不同可去mvnrepository查找對應(yīng)ArtifactId。
在子模塊中創(chuàng)建Spring Boot啟動類EurekaServerApplication.java和配置文件application.yml(properties文件也可)蝶怔。
注意:啟動類應(yīng)放置在源碼包下奶浦。
編寫啟動類。添加@SpringBootApplication和@EnableEurekaServer注解踢星。聲明這是一個Spring Boot啟動類同時也是一個Eureka Server澳叉。
編寫main方法。
編寫配置文件application.yml沐悦。
至此成洗,一個Eureka Server就編寫完成。
如果遇到了一些“意料之外”的錯誤藏否,可點擊IDEA右側(cè)的maven工具瓶殃,查看項目依賴是否有誤「鼻可嘗試刷新或重新打開項目遥椿。
運(yùn)行啟動類的main方法,在瀏覽器中輸入application.yml中配置的地址(http://localhost:8761)即可查看此Eureka Server的相關(guān)信息淆储。
可以看得該Instance currently registered with Eureka這一項還沒有任何內(nèi)容冠场,因為還沒有Eureka Client向該注冊中心注冊服務(wù)。下面就來編寫一個Eureka Client本砰。
2. 編寫 Eureka Client
與創(chuàng)建eureka-server模塊步驟相同碴裙。
創(chuàng)建一個maven子模塊。鼠標(biāo)移到項目名上點擊鼠標(biāo)右鍵->New->Module点额。仍然不用做任何選擇直接Next舔株。填寫子模塊的ArtifactId為eureka-client,點擊Next还棱。填寫Module name檢查無誤后點擊Finish即可载慈。
編寫子項目eureka-client的pom.xml文件。
添加spring-cloud-starter-netflix-eureka-client的依賴诱贿,當(dāng)前Spring Cloud版本為Finchley.RELEASE娃肿,其它版本如有不同可去mvnrepository查找對應(yīng)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文件也可)焙蹭。
注意:啟動類應(yīng)放置在源碼包下。
編寫配置文件application.yml嫂伞。應(yīng)用服務(wù)名為eureka-client孔厉,端口號1234拯钻,服務(wù)注冊地址為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就編寫完成污桦。運(yùn)行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 Server集群
1. 編寫雙節(jié)點Eureka Server集群
實際線上生產(chǎn)環(huán)境中,前文編寫的單節(jié)點Eureka Server可靠性不足坝撑。
Eureka Client會定時連接Eureka Server静秆,獲取服務(wù)注冊表中的信息并緩存到本地。微服務(wù)在消費(fèi)遠(yuǎn)程API時總是使用本地緩存中的數(shù)據(jù)绍载,因此一般情況下诡宗,即使單節(jié)點的Eureka Server發(fā)生宕機(jī),也不會影響到各微服務(wù)之間的調(diào)用击儡,但如果當(dāng)Eureka Server發(fā)生宕機(jī)時塔沃,某些微服務(wù)恰好也出現(xiàn)了不可用的情況,此時Eureka Client中的緩存并未進(jìn)行更新阳谍,仍然認(rèn)為服務(wù)可用蛀柴,就會影響到微服務(wù)之間的調(diào)用,甚至影響整個應(yīng)用系統(tǒng)的高可用性矫夯。因此鸽疾,生產(chǎn)環(huán)境中需要部署一個高可用Eureka Server集群。
Eureka Server可通過運(yùn)行多個實例并相互注冊的方式實現(xiàn)高可用训貌。集群中的多個實例會彼此增量的同步數(shù)據(jù)制肮,保證所有節(jié)點數(shù)據(jù)一致性。節(jié)點之間相互注冊是Eureka Server的默認(rèn)行為递沪,無需做任何配置豺鼻。
下面構(gòu)建一個雙節(jié)點Eureka Server集群。
創(chuàng)建一個maven子模塊款慨。鼠標(biāo)移到項目名上點擊鼠標(biāo)右鍵->New->Module儒飒。不做任何選擇直接Next。填寫子模塊的ArtifactId為eureka-server-cluster檩奠,點擊Next桩了。填寫Module name檢查無誤后點擊Finish即可附帽。
編寫子模塊eureka-server-cluster的pom.xml文件。
添加spring-cloud-starter-netflix-eureka-server的依賴井誉,當(dāng)前Spring Cloud版本為Finchley.RELEASE蕉扮,其它版本如有不同可去mvnrepository查找對應(yīng)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文件也可)颗圣。
注意:啟動類應(yīng)放置在源碼包下慢显。
我們要在本地搭建Eureka Server集群環(huán)境,需要運(yùn)行多個Eureka Server實例欠啤,可采用多配置文件格式荚藻,在啟動時指定具體的配置文件。也可利用開發(fā)工具IDEA洁段,在啟動一個實例后应狱,修改配置文件再啟動另一個實例。這樣可以很方便地在本地環(huán)境進(jìn)行測試祠丝。
下面介紹利用開發(fā)工具IDEA啟動多個實例的方法疾呻。
首先需要修改設(shè)置Run/Debug Configurations,點擊Edit Configurations...写半,找到EurekaServerClusterApplication啟動配置岸蜗,勾選Allow parallel run選項。我的IDEA版本為2018.3.3叠蝇。網(wǎng)上看到很多人寫的是去掉Single instance only選項璃岳,應(yīng)該是版本原因。
為了在本地模擬2個Server服務(wù)節(jié)點悔捶,需要修改本地host文件铃慷,Windows系統(tǒng)在C:\Windows\System32\drivers\etc\hosts中修改,其它系統(tǒng)自行百度文件位置蜕该。使用Notpad++或其它記事本軟件以管理員身份打開該文件犁柜,在文件末尾添加如下內(nèi)容后保存(注意文件屬性是否設(shè)置了只讀,否則無法保存)堂淡。
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é)點進(jìn)行相互注冊更啄,在節(jié)點配置1中設(shè)置另一個Eureka Server的地址稚疹,同樣在節(jié)點配置2中也設(shè)置另一個Eureka Server的地址居灯,這樣就實現(xiàn)了相互注冊祭务。
spring:
application:
name: peer-cluster
# 節(jié)點配置1
#server:
# port: 8761
#eureka:
# instance:
# hostname: peer1
# client:
# # 設(shè)置Eureka Server地址
# service-url:
# defaultZone: http://peer2:8762/eureka/
# 節(jié)點配置2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
# 設(shè)置Eureka Server地址
service-url:
defaultZone: http://peer1:8761/eureka/
打開節(jié)點配置1的注釋内狗,將節(jié)點配置2注釋起來,運(yùn)行啟動類中的main方法义锥,此時控制臺會出現(xiàn)報錯信息柳沙,原因是另一個Server節(jié)點還未啟動。修改配置文件application.yml拌倍,將節(jié)點配置1注釋起來赂鲤,打開節(jié)點配置2的注釋,再次運(yùn)行啟動類中的main方法柱恤,運(yùn)行成功后数初,可以看得之前出現(xiàn)報錯信息的控制臺中打印了如下內(nèi)容。
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é)點之間已經(jīng)完成了相互注冊梗顺。訪問http://peer1:8761和http://peer2:8762可查看相關(guān)信息泡孩。
至此,一個雙節(jié)點的Eureka Server就搭建完成寺谤。
下面介紹使用多配置文件的方式啟動多個Eureka Server實例的方法(部分書中使用了該方法)仑鸥。
仍然需要修改本地host文件,上文中已說明相關(guān)步驟变屁。另外創(chuàng)建兩個配置文件application-peer1.yml和application-peer2.yml眼俊。與application.yml在同一目錄。將剛才的節(jié)點配置1的內(nèi)容復(fù)制到application-peer1.yml中粟关,將節(jié)點配置2的內(nèi)容復(fù)制到application-peer2.yml中疮胖,修改application.yml中的配置。三個配置文件代碼如下闷板。
application.yml
spring:
profiles:
active: native
application:
name: peer-cluster
application-peer1.yml
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
# 設(shè)置Eureka Server地址
service-url:
defaultZone: http://peer2:8762/eureka/
application-peer2.yml
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
# 設(shè)置Eureka Server地址
service-url:
defaultZone: http://peer1:8761/eureka/
由于需要打成jar包運(yùn)行获列,在pom.xml文件中添加maven插件。完整的pom.xml內(nèi)容如下蛔垢。
<?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右側(cè)的maven工具,找到eureka-server-cluster項目下的Lifecycle鹏漆,點擊package即可打包巩梢。
生成的jar包在target目錄下。
右擊target目錄艺玲,點擊Open in Terminal進(jìn)入命令行括蝠。
輸入下面的命令指定配置文件為application-peer1.yml按回車鍵。
java -jar eureka-server-cluster-1.0-SNAPSHOT.jar --spring.profiles.active=peer1
運(yùn)行后控制臺會輸出報錯信息饭聚,不用管忌警。再次右擊target目錄,點擊Open in Terminal進(jìn)入第二個命令行秒梳,輸入下面的命令指定配置文件為application-peer2.yml按回車鍵法绵。
java -jar eureka-server-cluster-1.0-SNAPSHOT.jar --spring.profiles.active=peer2
啟動完成后箕速,兩個Server就完成了相互注冊,仍可訪問http://peer1:8761和http://peer2:8762查看相關(guān)信息朋譬。
以上就是使用多配置文件格式搭建雙節(jié)點Eureka Server集群盐茎。
2. 將應(yīng)用注冊到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可看到應(yīng)用已經(jīng)注冊到Eureka Server集群上了狡赐。
當(dāng)然窑业,微服務(wù)即使只配置Eureka Server集群中的某個節(jié)點,也能正常注冊到Eureka Server集群枕屉,因為多個Eureka Server之間的數(shù)據(jù)會相互同步数冬。不過為了適應(yīng)某些極端場景,建議在客戶端配置多個Eureka Server節(jié)點搀庶。