本地搭建eureka 註冊中心及高可用服務

快速搭建一個eureka 註冊中心步驟說明

eureka server端

pom.xml文件中加入eureka 服務所需要的配置

<!-- 添加eureka server依賴包-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
			<version>1.4.4.RELEASE</version>
		</dependency>

application.properties文件

#由於該應用爲註冊中心,所以設置爲false,表示不向註冊中心註冊自己
eureka.client.fetch-registry=false
#註冊中心的職責是維護實例,並不需要去檢索服務,所以設置爲false
eureka.client.register-with-eureka=false
#服務註冊中心地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.instance.hostname=127.0.0.1
server.port=8081

啓動類:

必須加上@EnableEurekaServer 註解,表示啓動一個服務註冊中心提供給其他應用進行對話

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaApplication.class, args);
	}
}

 

eureka 客戶端

pom.xml引入eureka 依賴包,需要注意的是,版本號必須與服務端一致

<!-- 添加eureka server依賴包 註冊中心-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
			<version>1.4.4.RELEASE</version>
		</dependency>

application.properties文件

注意端口號必須與服務端的一致

eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8081/eureka/
spring.application.name=hello-service

啓動類

@EnableDiscoveryClient 註解,激活Eureka中的DiscoveryClient實現(服務自動註冊到註冊中心,創建DiscoverClient接口針對Eureka客戶端的EurekaDiscoverClient實例)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class ServiceStart {

	public static void main(String[] args) {
		SpringApplication.run(ServiceStart.class, args);
	}
}
Controller類

啓動服務註冊中心

啓動出現如下信息,說明啓動成功

瀏覽器訪問:http://127.0.0.1:8081,會出現如下界面,這只是一個空的註冊中心

啓動eureka客戶端

再次刷新服務註冊中心,會發現hello-service已成功註冊

下面來搭建高可用註冊中心

在剛纔的eureka服務端項目中新增,application-peer1.properties、application-peer2.properties兩個配置文件,記住必須是新增,否則項目在打包編譯時會報錯:

application-peer1.properties

註冊中心指向peer2

spring.application.name=eurekaServer
server.port=8081
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:8082/eureka/

application-peer2.properties

註冊中心指向peer1

spring.application.name=eurekaServer
server.port=8082
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:8081/eureka/

即兩個節點相互註冊,形成集羣

因爲是在本地搭建的多個節點註冊在同一臺服務器上,所以還需要在C:\Windows\System32\drivers\etc\hosts文件中添加peer1,peer2的轉換,即peer1、peer2都指向本地IP

修改完如上配置後重新clean、編譯打包eureka服務端項目,通過java -jar分別啓動不同的端口號

點擊IDEA中的Terminal即可進入命令啓動窗口

啓動指定端口號的註冊服務:

java -jar D:\myInfos\springEureka_server\target\eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1

注意:jar包路徑必須是絕對路徑,不然會報如下錯誤:

啓動peer1:

出現如下界面,證明已成功啓動:

瀏覽器訪問:http://peer1:8081

你會發現與單節點註冊中心不一樣,DS Replicas 指向了peer2,registered-replicas 也指向了pee2

重新開啓一個Terminal窗口,點擊啓動pee1 Terminal窗口中的+號,如下圖,打開新的Terminal窗口

pee2啓動步驟及檢查方式請參考pee1

修改Eureka客戶端配置,註冊到多個註冊中心

eureka.client.serviceUrl.defaultZone=http://peer1:8081/eureka/, http://peer2:8082/eureka/
spring.application.name=hello-service

重新啓動Eureka客戶端應用,刷新peer1、peer2的頁面,會發現hello-service已同時註冊到peer1、peer2上

peer1出現EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE. eureka自我保護機制的告警

原因分析:

這個是Eureka的自我保護機制。Eureka Server在運行期間,會統計心跳失敗的比例在15分鐘之內是否低於85%,如果出現低於的情況(在單機調試的時候很容易滿足,實際在生產環境上通常是由於網絡不穩定導致),Eureka Server會將當前的實例註冊信息保護起來,同時提示這個警告。

Eureka server和client之間每隔30秒會進行一次心跳通信,告訴server,client還活着。由此引出兩個名詞: 
Renews threshold:server期望在每分鐘中收到的心跳次數 
Renews (last min):上一分鐘內收到的心跳次數

禁止註冊server自己爲client,不管server是否禁止,閾值(threshold)是1。client個數爲n,閾值爲1+2*n(此爲一個server且禁止自注冊的情況) 
如果是多個server,且開啓了自注冊,那麼就和client一樣,是對於其他的server來說就是client,是要*2的

閾值:1+2*1 
renews: 
1)自注冊 2 + 2*1 
2)非自注冊:2*1

Eurake有一個配置參數eureka.server.renewalPercentThreshold,定義了renews 和renews threshold的比值,默認值爲0.85。當server在15分鐘內,比值低於percent,即少了15%的微服務心跳,server會進入自我保護狀態,Self-Preservation。在此狀態下,server不會刪除註冊信息,這就有可能導致在調用微服務時,實際上服務並不存在。 
這種保護狀態實際上是考慮了client和server之間的心跳是因爲網絡問題,而非服務本身問題,不能簡單的刪除註冊信息

stackoverflow上,有人給出的建議是: 
1、在生產上可以開自注冊,部署兩個server 
2、在本機器上測試的時候,可以把比值調低,比如0.49 
3、或者簡單粗暴把自我保護模式關閉

eureka.server.enableSelfPreservation=false

總結:

1.不管是單節點註冊中心還是集羣,都必須保證客戶端配置的註冊中心地址與Eureka Server(註冊中心)的一致

2.集羣的好處是其中一個節點宕機後服務能正常被調用,爲了安全起見,集羣服務器最好是多臺機器(生產上一般是多臺機器),這樣即使服務器出現異常問題,也能保證服務正常

3.如果我們不想使用主機名來定義註冊中心的地址,也可以使用IP地址的形式,但是需要配置文件中增加配置參數eureka.instance.prefer-ip-address=true,該默認爲false。然後當應用程序向eureka註冊時,它將使用IP地址而不是主機名

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章