EurekaServer:服務注冊功能的伺服器,是服務的注冊中心,系統中的其他微服務,使用Eureka的用戶端連接配接到Eureka Server并維持心跳連接配接,系統的維護人員可以通過Eureka Server來監控系統中各個微服務是否正常運作,
Eureka Server注冊中心需要引入Eureka Server的jar
在注冊中心中添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
Eureka Server注冊中心yml配置
eureka:
instance:
hostname: localhost #eureka服務端的執行個體名字
client:
#false表示不向注冊中心注冊自己
register-with-eureka: false
#false表示自己端就是注冊中心,我的職責就是維護執行個體,不需要去檢索執行個體
fetch-registry: false
service-url:
#設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動配置中心服務後通路localhost:7001會有如下界面
但此時并沒有服務注冊在Eureka上面,下面将一個微服務添加到Eureka的中策中心上
将一個服務添加到Eureka注冊中心上
① 在微服務的pom上引入Eureka Client的jar包依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
②在微服務的yml檔案上填寫EurekaClient的相關配置
eureka:
client:
register-with-eureka: true #表示是否将自己注冊進EurekaServer 預設是true
fetch-registry: true #是否從EurekaServer抓取已有的注冊資訊,預設true.單節點無所謂,叢集必須設定true才能配合ribbon使用負載均衡
service-url:
defaultZone: http://localhost:7001/eureka #表示注冊在這個位址的注冊中心上
③别忘了在微服務的啟動類上添加
@EnableEurekaClient
注解哈
啟動服務注冊中心和剛才配好的微服務,通路注冊中心位址:localhost:7001,就會發現頁上發現了剛剛配置好的服務名字了
以上就是單機版的Eureka注冊與發現的配置
配置Eureka叢集
EurekaServer的叢集配置實際上就是将多個Eureka互相注冊
和上面的單機版配置差不多,隻是需要注意注意Eureka的服務端名字不能重複
在建立一個EurekaServer,yml檔案的配置如下:
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服務端的執行個體名字
client:
#false表示不向注冊中心注冊自己
register-with-eureka: false
#false表示自己端就是注冊中心,我的職責就是維護執行個體,不需要去檢索執行個體
fetch-registry: false
service-url:
#設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001.com:7001/eureka/
向Eureka Server叢集中添加微服務,隻需将需要添加的服務yml配置檔案中的注冊位址增加EurekaServer的位址即可:
這樣這個服務就會注冊到EurekaServer的叢集中了
至此,服務注冊中心叢集已經有多個了,一般實際中不可能兩三個EurekaServer全都挂吧,已經滿足使用要求了,上面我們将服務提供注冊到叢集,但是也要設想一下,萬一服務提供者挂了怎麼辦?是以有必要将服務提供者也設計成叢集的模式.
将服務提供者設定成叢集(多個)
隻需将服務提供者再複制一份即可,但要注意改端口号
多個服務提供者注冊到EurekaServer叢集中,為消費者提供服務,對外暴露的是相同的服務名稱,消費者根據服務者提供的服務名稱進行通路.至于通路的是哪個具體服務,需要有負載均衡機制來決定(預設的負載均衡是輪詢機制).是以需要在消費者端添加負載均衡注解;并且消費者通路的也不在是具體的服務位址和端口号了,而應該改成具體的服務名稱;
此時,在通路的話,會是輪詢的方式通路服務提供者
有時為了友善管理,我們可能需要定義主機名字.以及讓通路路徑顯示ip位址
可以通過配置yml檔案中添加如下内容
eureka:
instance:
instance-id: payemnt8002 #自定義的主機名
prefer-ip-address: true #通路路徑可以顯示ip位址
上面的操作還需要在pom中添加
<!--spring-boot-starter-web和spring-boot-starter-actuato這兩個幾乎永遠在一起,圖形化界面用的-->
<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>
服務發現Discovery
服務發現:對于注冊進Eureka裡面的微服務,可以通過服務發現來獲得該服務的資訊
①在啟動類上添加
@DiscoveryClient
②通過DiscoveryClient 獲得相關資訊,例如:
@Resource
private DiscoveryClient discoveryClient;
public Object discover(){
List<String> services = discoveryClient.getServices();//得到服務清單清單
for (String element:services
) {
log.info("**********element"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for(ServiceInstance instance:instances){
log.info(instance.getInstanceId()+"\t"+instance.getUri()+"\t"+instance.getPort());
}
return this.discoveryClient;
}
Eureka的自我保護機制
保護模式主要用于一組用戶端和EurekaServer之間存在網絡分區場景下的保護.一旦進入保護模式,EurekaServer将會嘗試保護其服務系統資料庫中的資訊,不再删除服務系統資料庫中的資料,也就是不會登出任何微服務.