1. 程式人生 > >springcloud-eureka搭建高可用服務註冊叢集

springcloud-eureka搭建高可用服務註冊叢集

服務的註冊和發現可以說是微服務架構中最核心的地方,微服務的服務註冊中心有很多個,之前選了consul作為註冊中心,之所以選擇它是因為它有非常強大的功能,除了服務的註冊發現之外還支援KV儲存、具有多語言能力、支援多資料中心等等,後來發現這些都沒有什麼用,畢竟我們的服務是純Java的,另外還要花費精力去維護一個consul的叢集,應用過程中出現了任何問題都需要去維護,這是一個可以預期的成本,基於以上的考量就把consul這個註冊中心給換掉了。最後經過一番選擇,使用了Eureka,這個最大的好處是不需要維護單獨的叢集,註冊中心本身就作為一個專案存在,可以像維護一個服務一樣去維護。Eureka本身作為一個服務,需要引入以下jar包
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>
		
		<dependencyManagement>
			<dependencies>
				<dependency>
					<groupId>org.springframework.cloud</groupId>
					<artifactId>spring-cloud-dependencies</artifactId>
					<version>Brixton.RELEASE</version>
					<type>pom</type>
					<scope>import</scope>
				</dependency>
			</dependencies>
		</dependencyManagement>
並在啟動類上新增@EnableEurekaServer註解,這樣就可以開啟服務註冊中心的功能了,在配置檔案中新增以下內容就可以其中註冊中心這個服務了。
server.port=8080
#由於該應用為註冊中心,所以設定為false, 代表不向註冊中心註冊自己
eureka.client.register-with-eureka=false
#由於註冊中心的職責就是維護服務例項,它並不需要去檢索服務, 所以也設定為false
eureka.client.fetch-registry=false
#指定服務註冊中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
通過localhost:8080就可以檢視註冊中心的頁面資料情況,如下圖所示

Eureka在設計思想中,所有的節點既是服務提供方也是服務消費方,服務的註冊中心也是如此,這樣就可以解決註冊中心的高可用問題,實現高可用的思想是:單機的Eureka註冊中心向其他的註冊中心註冊自己,這樣就可以形成互相註冊的註冊中心,實現高可用,windows條件下將單機的專案複製3份,每一份的配置檔案內容如下:
#server1
spring.application.name=eureka-server
server.port=8095
eureka.instance.hostname=127.0.0.1:8095
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8096/eureka/,http://127.0.0.1:8097/eureka/

#server2
spring.application.name=eureka-server
server.port=8096
eureka.instance.hostname=127.0.0.1:8096
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8095/eureka/,http://127.0.0.1:8097/eureka/

#server3
spring.application.name=eureka-server
server.port=8097
eureka.instance.hostname=127.0.0.1:8097
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8095/eureka/,http://127.0.0.1:8096/eureka/
只是將原來單機的配置檔案內容修改為現在的以上這三種形式,就可以執行專案了,執行結果如下,eureka.instance.hostname可以是peer1、peer2、peer3這樣的名字,但是這樣就得修改hosts配置檔案,對IP做對映,看來Eureka內部是根據eureka.instance.hostname獲取相應的IP,然後根據IP去做的註冊

服務中心的叢集註冊完成之後,就可以在上邊註冊和發現服務了,首先看一下服務的註冊,在服務的註冊端新增以下jar包
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		
		<dependencyManagement>
			<dependencies>
				<dependency>
					<groupId>org.springframework.cloud</groupId>
					<artifactId>spring-cloud-dependencies</artifactId>
					<version>Brixton.RELEASE</version>
					<type>pom</type>
					<scope>import</scope>
				</dependency>
			</dependencies>
		</dependencyManagement>
修改配置檔案為以下內容
spring.application.name=compute-service
server.port=8081
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8095/eureka/,http://127.0.0.1:8096/eureka/,http://127.0.0.1:8097/eureka/

然後在主類上新增@EnableDiscoveryClient註解,開啟服務的註冊發現功能,這樣這個服務的所有對外提供的功能都被註冊到服務註冊中心。下圖是兩個server註冊後的服務在頁面上的展示:



然後看一下服務的發現,消費端使用的是Robbin,所以要額外新增以下兩個jar包

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		
		<dependencyManagement>
			<dependencies>
				<dependency>
					<groupId>org.springframework.cloud</groupId>
					<artifactId>spring-cloud-dependencies</artifactId>
					<version>Brixton.RELEASE</version>
					<type>pom</type>
					<scope>import</scope>
				</dependency>
			</dependencies>
		</dependencyManagement>
在主類上新增@EnableDiscoveryClient註解,開啟服務發現的功能,同時,由於服務消費端去請求資料的時候,需要Http請求,這裡需要生成一個http請求的物件,在主類中新增以下程式碼,這裡有一個客戶端負載的功能,後續的文章問研究這個的原因,這裡不做說明
	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
修改配置檔案為以下內容
spring.application.name=ribbon-consumer
server.port=8082
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8095/eureka/,http://127.0.0.1:8096/eureka/,http://127.0.0.1:8097/eureka/
啟動專案後就可以通過以下方式呼叫服務了
    public String add() {
        return restTemplate.getForEntity("http://compute-service/add?a=10&b=20", String.class).getBody();
    }

compute-service為服務提供者註冊的服務的名字,至此搭建高可用的服務註冊中心和驗證過程就完畢了。

………………………………………………………………………………………………………………………………………………………………………………………

更新:

#關閉自我保護,可以定期清理失效的服務
eureka.server.enable-self-preservation=false
# 清理間隔(單位毫秒,預設是60*1000):
eureka.server.eviction-interval-timer-in-ms=1000