Spring Cloud
封裝了 Netflix
公司開發的 Eureka
模塊來實現 服務註冊和發現。Eureka
採用了 C-S
的 設計架構。Eureka Server
做爲 服務註冊中心,系統中的 其餘微服務,使用 Eureka
的 客戶端 鏈接到 Eureka Server
,並經過 心跳鏈接 檢測服務的 存活狀態。
Eureka Server: 做爲 服務註冊中心,提供 服務註冊和發現。
Eureka Client: 全部註冊到 服務中心 的服務。
Service Provider: 把 自身的服務 註冊到 Eureka Server
,從而使 服務消費方 可以找到。
Service Consumer: 從 Eureka Server
獲取 服務註冊列表,從而可以 消費服務。
建立 2
個項目 Module
,一個 Module
(即 Spring Boot
)工程做爲 服務註冊中心,即 Eureka Server
,另外一個做爲 Eureka Client
。
Eureka Server
建立完後的工程 pom.xml
文件以下:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.ostenant.github.springcloud</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR1</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>
複製代碼
Eureka
是一個 高可用 的組件,它沒有 後端緩存。每個 實例 註冊以後,須要 定時 向 註冊中心 發送 心跳(所以能夠在內存中完成)。在默認狀況下 Eureka Server
也是一個 Eureka Client
,必需要指定一個 Server
。在啓動以前,首先對 Eureka Server
配置 application.yml
文件。
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
複製代碼
設置是否將本身做爲 Eureka Client
註冊到 Eureka Server
,默認爲 true
。
設置是否從 Eureka Server
獲取 註冊信息,默認爲 true
。由於本例是一個 單點 的 Eureka Server
,不須要 同步 其餘 Eureka Server
節點的數據,因此設置爲 false
。
設置的是與 Eureka Server
的 交互地址,查詢 和 註冊服務 都依賴這個地址,若是有多個可使用 英文逗號分隔。
而後再把註解 @EnableEurekaServer
加在 Spring Boot
工程的啓動類 Application
上面:
@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
複製代碼
Eureka Server
是有界面的,啓動項目後,打開瀏覽器訪問 http://localhost:8761
便可查看。
當一個 Eureka Client
向 Eureka Server
發起 註冊 時,它會提供一些 元數據,例如 主機 和 端口 等等。Eureka Server
從每一個 Eureka Client
實例接收 心跳消息。 若是 心跳超時,則一般將該實例從 Eureka Server
中刪除。
建立一個 service-hi
的 Module
,建立完成後的 pom.xml
以下:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.ostenant.github.springcloud</groupId>
<artifactId>service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-hi</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR1</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-cloud-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>
複製代碼
經過 註解 @EnableEurekaClient
代表本身是一個 Eureka Client
。
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {
@Value("${server.port}")
private String port;
public static void main(String[] args) {
SpringApplication.run(ServiceHiApplication.class, args);
}
@RequestMapping("/hi")
public String home(@RequestParam String name) {
return "Hi " + name + ", I am from port: " + port;
}
}
複製代碼
僅僅 @EnableEurekaClient
是不夠的,還須要在 配置文件 中註明的 服務註冊中心 的地址,application.yml
配置文件以下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8763
spring:
application:
name: service-hi
複製代碼
Eureka
客戶端 須要指明 spring.application.name
,用於服務的 惟一標識,服務之間 相互調用會基於這個 name
。
啓動並訪問 Eureka Server
的地址 http://localhost:8761
,會發現服務名稱爲 SERVICE-HI
,端口爲7862
的服務,已註冊到 Eureka Server
的列表上。
在一個 分佈式系統 中,服務註冊中心 是最重要的基礎部分,必須處於 能夠提供服務 的狀態。爲了維持其 可用性,使用 集羣 是很好的解決方案。
Eureka
經過節點 對等註冊 的方式實現 高可用的部署,因此只須要爲每個 Eureke Server
配置 其餘可用的 Eureke Server
的 serviceUrl
,就能實現高可用部署。
spring:
profiles:
active: peer1 #peer2
---
spring:
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://localhost:8762/eureka/
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
複製代碼
更改 Eureka Server
的配置文件,再分別以 spring.profiles.active=peer1
和 spring.profiles.active=peer2
做爲參數,啓動兩次 Eureka Server
便可。
訪問 http://localhost:8761/
。能夠發現,Eureka Client
已經向 端口號 爲 8761
的 Eureka Server
發起註冊。
服務提供者 的 配置文件 並無向 端口號 爲 8762
的 Eureka Server
註冊。訪問 http://localhost:8762/
。能夠發現,服務提供者 的信息已經向 8762
發起註冊了,即 8761
的 註冊信息 已經同步到 8762
節點。
歡迎關注技術公衆號: 零壹技術棧
本賬號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分佈式和微服務,架構學習和進階等學習資料和文章。