1 Eureka注冊(cè)中心
1.1 需求分析
在前后端分離架構(gòu)中,服務(wù)層被拆分成了很多的微服務(wù),微服務(wù)的信息如何管理?Spring Cloud中提供服務(wù)注冊(cè)中心來管理微服務(wù)信息。
為什么 要用注冊(cè)中心?
1、微服務(wù)數(shù)量眾多,要進(jìn)行遠(yuǎn)程調(diào)用就需要知道服務(wù)端的ip地址和端口,注冊(cè)中心幫助我們管理這些服務(wù)的ip和端口。
2、微服務(wù)會(huì)實(shí)時(shí)上報(bào)自己的狀態(tài),注冊(cè)中心統(tǒng)一管理這些微服務(wù)的狀態(tài),將存在問題的服務(wù)踢出服務(wù)列表,客戶端獲取到可用的服務(wù)進(jìn)行調(diào)用。
1.3 Eureka注冊(cè)中心
1.3.1 Eureka介紹
Spring Cloud Eureka 是對(duì)Netflix公司的Eureka的二次封裝,它實(shí)現(xiàn)了服務(wù)治理的功能,Spring Cloud Eureka提
供服務(wù)端與客戶端,服務(wù)端即是Eureka服務(wù)注冊(cè)中心,客戶端完成微服務(wù)向Eureka服務(wù)的注冊(cè)與發(fā)現(xiàn)。服務(wù)端和客戶端均采用Java語言編寫。下圖顯示了Eureka Server與Eureka Client的關(guān)系:

1、Eureka Server是服務(wù)端,負(fù)責(zé)管理各各微服務(wù)結(jié)點(diǎn)的信息和狀態(tài)。
2、在微服務(wù)上部署Eureka Client程序,遠(yuǎn)程訪問Eureka Server將自己注冊(cè)在Eureka Server。
3、微服務(wù)需要調(diào)用另一個(gè)微服務(wù)時(shí)從Eureka Server中獲取服務(wù)調(diào)用地址,進(jìn)行遠(yuǎn)程調(diào)用。
1.3.2 Eureka Server搭建
1、創(chuàng)建xc-govern-center工程:
包結(jié)構(gòu):com.xuecheng.govern.center
2、添加依賴
在父工程添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在Eureka Server工程添加:
<dependencies>
<!-- 導(dǎo)入Eureka服務(wù)的依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
3、啟動(dòng)類
@EnableEurekaServer//標(biāo)識(shí)這是一個(gè)Eureka服務(wù)
@SpringBootApplication
public class GovernCenterApplication {
public static void main(String[] args) {
SpringApplication.run(GovernCenterApplication.class, args);
}
}
4、@EnableEurekaServer
需要在啟動(dòng)類上用@EnableEurekaServer標(biāo)識(shí)此服務(wù)為Eureka服務(wù)
5、application.yml的配置內(nèi)容如下:
server:
port: 50101 #服務(wù)端口
spring:
application:
name: xc‐govern‐center #指定服務(wù)名
eureka:
client:
registerWithEureka: false #服務(wù)注冊(cè),是否將自己注冊(cè)到Eureka服務(wù)中
fetchRegistry: false #服務(wù)發(fā)現(xiàn),是否從Eureka中獲取注冊(cè)信息
serviceUrl: #Eureka客戶端與Eureka服務(wù)端的交互地址,高可用狀態(tài)配置對(duì)方的地址,單機(jī)狀態(tài)配置自己(如果不配置則默認(rèn)本機(jī)8761端口)
defaultZone: http://localhost:50101/eureka/
server:
enable‐self‐preservation: false #是否開啟自我保護(hù)模式
eviction‐interval‐timer‐in‐ms: 60000 #服務(wù)注冊(cè)表清理間隔(單位毫秒,默認(rèn)是60*1000)
registerWithEureka:被其它服務(wù)調(diào)用時(shí)需向Eureka注冊(cè)
fetchRegistry:需要從Eureka中查找要調(diào)用的目標(biāo)服務(wù)時(shí)需要設(shè)置為true
serviceUrl.defaultZone 配置上報(bào)Eureka服務(wù)地址高可用狀態(tài)配置對(duì)方的地址,單機(jī)狀態(tài)配置自己
enable-self-preservation:自保護(hù)設(shè)置,下邊有介紹。
eviction-interval-timer-in-ms:清理失效結(jié)點(diǎn)的間隔,在這個(gè)時(shí)間段內(nèi)如果沒有收到該結(jié)點(diǎn)的上報(bào)則將結(jié)點(diǎn)從服務(wù)列表中剔除。
5、啟動(dòng)Eureka Server
啟動(dòng)Eureka Server,瀏覽50101端口。

上圖紅色提示信息:
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OFNETWORK/OTHER PROBLEMS.
自我保護(hù)模式被關(guān)閉。在網(wǎng)絡(luò)或其他問題的情況下可能不會(huì)保護(hù)實(shí)例失效。
Eureka Server有一種自我保護(hù)模式,當(dāng)微服務(wù)不再向Eureka Server上報(bào)狀態(tài),Eureka Server會(huì)從服務(wù)列表將此服務(wù)刪除,如果出現(xiàn)網(wǎng)絡(luò)異常情況(微服務(wù)正常),此時(shí)Eureka server進(jìn)入自保護(hù)模式,不再將微服務(wù)從服務(wù)列表刪除。
在開發(fā)階段建議關(guān)閉自保護(hù)模式
1.3.2.2 高可用環(huán)境搭建
Eureka Server 高可用環(huán)境需要部署兩個(gè)Eureka server,它們互相向?qū)Ψ阶?cè)。如果在本機(jī)啟動(dòng)兩個(gè)Eureka需要注意兩個(gè)Eureka Server的端口要設(shè)置不一樣,這里我們部署一個(gè)Eureka Server工程,將端口可配置,制作兩個(gè)Eureka Server啟動(dòng)腳本,啟動(dòng)不同的端口,如下圖:

1、在實(shí)際使用時(shí)Eureka Server至少部署兩臺(tái)服務(wù)器,實(shí)現(xiàn)高可用。
2、兩臺(tái)Eureka Server互相注冊(cè)。
3、微服務(wù)需要連接兩臺(tái)Eureka Server注冊(cè),當(dāng)其中一臺(tái)Eureka死掉也不會(huì)影響服務(wù)的注冊(cè)與發(fā)現(xiàn)。
4、微服務(wù)會(huì)定時(shí)向Eureka server發(fā)送心跳,報(bào)告自己的狀態(tài)。
5、微服務(wù)從注冊(cè)中心獲取服務(wù)地址以RESTful方式發(fā)起遠(yuǎn)程調(diào)用
配置如下:
1、端口可配置
server:
port: ${PORT:50101} #服務(wù)端口
2、Eureka服務(wù)端的交互地址可配置
eureka:
client:
registerWithEureka: true #服務(wù)注冊(cè),是否將自己注冊(cè)到Eureka服務(wù)中
fetchRegistry: true #服務(wù)發(fā)現(xiàn),是否從Eureka中獲取注冊(cè)信息
serviceUrl: #Eureka客戶端與Eureka服務(wù)端的交互地址,高可用狀態(tài)配置對(duì)方的地址,單機(jī)狀態(tài)配置自己(如果不配置則默認(rèn)本機(jī)8761端口)
defaultZone: ${EUREKA_SERVER:http://eureka02:50102/eureka/}
3、配置hostname
Eureka 組成高可用,兩個(gè)Eureka互相向?qū)Ψ阶?cè),這里需要通過域名或主機(jī)名訪問,這里我們?cè)O(shè)置兩個(gè)Eureka服務(wù)的主機(jī)名分別為 eureka01、eureka02。
完整的eureka配置如下:
eureka:
client:
registerWithEureka: true #服務(wù)注冊(cè),是否將自己注冊(cè)到Eureka服務(wù)中
fetchRegistry: true #服務(wù)發(fā)現(xiàn),是否從Eureka中獲取注冊(cè)信息
serviceUrl: #Eureka客戶端與Eureka服務(wù)端的交互地址,高可用狀態(tài)配置對(duì)方的地址,單機(jī)狀態(tài)配置自己(如果不配置則默認(rèn)本機(jī)8761端口)
defaultZone: ${EUREKA_SERVER:http://eureka02:50102/eureka/}
server:
enable‐self‐preservation: false #是否開啟自我保護(hù)模式
eviction‐interval‐timer‐in‐ms: 60000 #服務(wù)注冊(cè)表清理間隔(單位毫秒,默認(rèn)是60*1000)
instance:
hostname: ${EUREKA_DOMAIN:eureka01}
4、在IDEA中制作啟動(dòng)腳本
啟動(dòng)1:

啟動(dòng)2:

5、在host文件配置
127.0.0.1 eureka01
127.0.0.1 eureka02
運(yùn)行兩個(gè)啟動(dòng)腳本,分別瀏覽:
http://localhost:50101/
http://localhost:50102/
Eureka主畫面如下

1.3.3 服務(wù)注冊(cè)
1.3.3.1 將cms注冊(cè)到Eureka Server
1、在服務(wù)中添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、在application.yml配置
eureka:
client:
registerWithEureka: true #服務(wù)注冊(cè)開關(guān)
fetchRegistry: true #服務(wù)發(fā)現(xiàn)開關(guān)
serviceUrl: #Eureka客戶端與Eureka服務(wù)端進(jìn)行交互的地址,多個(gè)中間用逗號(hào)分隔
defaultZone: ${EUREKA_SERVER:http://localhost:50101/eureka/,http://localhost:50102/eureka/}
instance:
prefer-ip-address: true #將自己的ip地址注冊(cè)到Eureka服務(wù)中
ip-address: ${IP_ADDRESS:127.0.0.1}
instance-id: ${spring.application.name}:${server.port} #指定實(shí)例id
3、在啟動(dòng)類上添加注解
在啟動(dòng)類上添加注解 @EnableDiscoveryClient ,表示它是一個(gè)Eureka的客戶端
4、刷新Eureka Server查看注冊(cè)情況
