Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件的一部分,基於 Netflix Eureka 做了二次封裝,主要負責完成微服務架構中的服務治理功能,服務治理可以說是微服務架構中最為核心和基礎的模塊,他主要用來實現各個微服務實例的自動化注冊與發現
- 服務注冊:在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,將主機與端口號、版本號、通信協議等一些附加信息告知注冊中心,注冊中心按照服務名分類組織服務清單,服務注冊中心還需要以心跳的方式去監控清單中的服務是否可用,若不可用需要從服務清單中剔除,達到排除故障服務的效果。
- 服務發現:由於在服務治理框架下運行,服務間的調用不再通過指定具體的實例地址來實現,而是通過向服務名發起請求調用實現。
Spring Cloud Eureka 使用 Netflix Eureka 來實現服務注冊與發現,即包括了服務端組件,也包含了客戶端組件,並且服務端和客戶端均采用Java編寫,所以Eureka主要適用與通過Java實現的分布式系統,或是與JVM兼容語言構建的系統,但是,由於Eureka服務端的服務治理機制提供了完備的RESTful API,所以他也支持將非Java語言構建的微服務納入Eureka的服務治理體系中來。
- Eureka服務端:我們也稱為服務注冊中心,他同其他服務注冊中心一樣,支持高可用配置。
- Eureka客戶端:主要處理服務的注冊和發現,客戶端服務通過注冊和參數配置的方式,嵌入在客戶端應用程序的代碼中,在應用程序運行時,Eureka客戶端向注冊中心注冊自身提供的服務並周期性的發送心跳來更新他的服務租約。
-
搭建服務注冊中心
創建一個基礎的 Spring Boot 工程,在 pom.xml 中引入必須的依賴內容 spring-cloud-starter-eureka-server ,通過 @EnableEurekaServer 注解啟動一個服務注冊中心提供給其他應用進行對話,示例代碼如下:
-
POM代碼:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.drsoft.webservice</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>eureka-server</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
-
Java代碼:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}
}
-
基本配置:
默認設置下,該服務注冊中心也會將自己作為客戶端來嘗試注冊自己,所以需要禁用他的客戶端注冊行為,需要在 application.properties 中增加如下配置
server.port=1111
spring.application.name=eureka-server
eureka.instance.hostname=eureka-server
# 由於該應用為注冊中心,所以設置為false,代表不向注冊中心注冊自己
eureka.client.register-with-eureka =false
# 由於注冊中心的職責就是維護服務實例,他並不需要去檢索服務,所以也設置為false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
完成配置后,啟動應用並訪問 http://localhost:1111/ 可以看到如下圖所示的 Eureka 信息面板(其中 Instances currently registered with Eureka 應該為空,說明還沒有注冊服務):

-
-
注冊服務提供者
要使微服務應用向注冊中心發布自己,首先需要在 pom.xml 配置文件中增加對 spring-boot-starter-eureka 的依賴,然后在主類中增加 @EnableDiscoveryClient 注解來啟動服務注冊(必須在項目中實現了RESTful 服務),示例代碼如下:
-
POM代碼:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.drsoft.eureka</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
-
Java代碼:
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
-
REST服務代碼:
@RestController
@RequestMapping ("/hello")
public class HelloController {
@RequestMapping (value = "get", method = RequestMethod.GET)
public String get() {
return "get ok";
}
}
最后我們需要在 application.properties 配置文件中,通過 spring.application.name 屬性來為服務命名,比如命名為 hello-service,在通過 eureka.client.service-url.defaultZone 屬性來指定服務注冊中心的地址,完整配置如下:
spring.application.name=hello-service
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
然后分別啟動服務注冊中心以及服務提供者,在 hello-service 服務控制台中,Tomcat 啟動之后,能夠看到向注冊中心注冊服務,如下:
2017-07-31 22:48:53.733 INFO 15456 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/Lixue-PC:hello-service - registration status: 204
我們也可以通過訪問Eureka的信息面板,在 Instances currently registered with Eureka 欄中看到服務的注冊信息,如下圖:

-
