1. 程式人生 > >SpringCloud框架Eureka服務發現與高可用

SpringCloud框架Eureka服務發現與高可用

1.Spring Cloud 簡介

Spring Cloud是在Spring Boot的基礎上構建的,用於簡化分散式系統構建的工具
集,為開發人員提供快速建立分散式系統中的一些常見的模式。
例如:配置管理(configuration management),服務發現(service
discovery),斷路器(circuit breakers),智慧路由( intelligent routing),
微代理(micro-proxy),控制匯流排(control bus),一次性令牌( one-time
tokens),全域性鎖(global locks),領導選舉(leadership election),分散式
會話(distributed sessions),叢集狀態(cluster state)。
Spring Cloud 包含了多個子專案:
例如:Spring Cloud Config、Spring Cloud Netflix等
Spring Cloud 專案主頁:

http://projects.spring.io/spring-cloud/
Talk is cheep, show me the code.下面我們將以程式碼與講解結合的方式,為大家講
解Spring Cloud中的各種元件。

2.示例規劃

在這裡插入圖片描述

3.建立父專案

在進入主題之前,我們首先建立一個父專案(spring-cloud-microservice-study),
這樣可以對專案中的Maven依賴進行統一的管理。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="ht tp://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m aven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.itmuch.cloud</groupId> <artifactId>spring-cloud-microservice-study</artifactId>
<version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>microservice-discovery-eureka</module> <module>microservice-provider-user</module> <module>microservice-consumer-movie-ribbon</module> <module>microservice-consumer-movie-feign</module> <module>microservice-consumer-movie-ribbon-with-hystrix</module> <module>microservice-consumer-movie-feign-with-hystrix</module> <module>microservice-hystrix-dashboard</module> <module>microservice-consumer-movie-feign-with-hystrix-stream</module> <module>microservice-hystrix-turbine</module> <module>microservice-config-server</module> <module>microservice-config-client</module> <module>microservice-config-server-eureka</module> <module>microservice-config-client-eureka</module> <module>microservice-api-gateway</module> </modules> <!-- 使用最新的spring-boot版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

4.服務發現

在微服務架構中,服務發現(Service Discovery)是關鍵原則之一。手動配置每個
客戶端或某種形式的約定是很難做的,並且很脆弱。Spring Cloud提供了多種服務
發現的實現方式,例如:Eureka、Consul、Zookeeper。
Spring Cloud支援得最好的是Eureka,其次是Consul,最次是Zookeeper。

1.Eureka

在生產環境下,我們往往會為每個應用配置一個host,使用host而非IP進行訪
問。為了更加貼近生產環境,以及後文Docker章節的講解,我們首先配置一下
Host

127.0.0.1 discovery

建立一個Maven工程(microservice-discovery-eureka),並在pom.xml中加入
如下內容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht
tp://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m
aven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>microservice-discovery-eureka</artifactId>
<packaging>jar</packaging>
<parent>
	<groupId>com.itmuch.cloud</groupId>
	<artifactId>spring-cloud-microservice-study</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka-server</artifactId>
	</dependency>
</dependencies>
</project>

編寫Spring Boot啟動程式:通過@EnableEurekaServer申明一個註冊中心:

/**
* 使用Eureka做服務發現。
* @author eacdy
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
	public static void main(String[] args) {
		SpringApplication.run(EurekaApplication.class, args);
	}
}

在預設情況下,Eureka會將自己也作為客戶端嘗試註冊,所以在單機模式下,
我們需要禁止該行為,只需要在application.yml中如下配置:

server:
	port: 8761 # 指定該Eureka例項的埠
eureka:
	instance:
		hostname: discovery # 指定該Eureka例項的主機名
client:
	registerWithEureka: false
	fetchRegistry: false
	serviceUrl:
		defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 參考文件:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode
# 參考文件:http://my.oschina.net/buwei/blog/618756

啟動工程後,訪問:http://discovery:8761/ ,如下圖。我們會發現此時還沒有
服務註冊到Eureka上面。
在這裡插入圖片描述

2.Eureka的高可用

按照前文對Eureka的講解,我們即可構建出一個簡單的註冊中心。但此時的Eureka
是單點的,不適合於生產環境,那麼如何實現Eureka的高可用呢?
新增主機名:
127.0.0.1 peer1 peer2
修改application.yml

---
spring:
	profiles: peer1 # 指定profile=peer1
server:
	port: 8761
eureka:
	instance:
		hostname: peer1 # 指定當profile=peer1時,主機名
client:
	serviceUrl:
		defaultZone: http://peer2:8762/eureka/ # 將自己註冊到peer2這個Eureka上面去
---
spring:
	profiles: peer2
server:
	port: 8762
eureka:
	instance:
		hostname: peer2
client:
	serviceUrl:
		defaultZone: http://peer1:8761/eureka/

分別啟動兩個Eureka應用:

java -jar microservice-discovery-eureka-0.0.1-SNAPSHOT.jar --spr
ing.profiles.active=peer1
java -jar microservice-discovery-eureka-0.0.1-SNAPSHOT.jar --spr
ing.profiles.active=peer2

訪問 http://peer1:8761 ,我們會發現 registered-replicas 中已經
有 peer2 節點了,同樣地,訪問 http://peer2:8762 ,也能發現其中
的 registered-replicas 有 peer1 節點,如下圖:
在這裡插入圖片描述

我們嘗試將 peer2 節點關閉,然後訪問http://peer1:8761,會發現此
peer2會被新增到unavaliable-replicas 一欄中。

該示例中的 hostname 並非必須的,如果不配置,預設將會使用IP進行查詢。

3.將服務註冊到高可用的Eureka

如果註冊中心是高可用的,那麼各個微服務配置只需要將 defaultZone 改為如下
即可:

eureka:
	client:
		serviceUrl:
			defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka

參考文件:http://cloud.spring.io/spring-cloud-static/Brixton.SR5/#spring-cloud-eurekaserver