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 專案主頁:
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