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

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