# 服務提供者和消費者
概念:
* 服務提供者:服務的被調用方,即:為其他服務提供服務的服務
* 服務消費者:服務的調用方,即:依賴其他服務的服務
服務發現組件:Eureka
# Eureka 介紹
## 什么是 Eureka

[Eureka Wiki](https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance)
官方的介紹在這里Eureka Wiki。 Eureka 是 Netflix 開源的一個 Restful 服務,主要用于服務的注冊發現。Eureka 由兩個組件組成: Eureka 服務器和 Eureka 客戶端。 Eureka 服務器用作服務注冊服務器。 Eureka 客戶端是一個 Java 客戶端,用來簡化與服務器的交互、作為輪詢負載均衡器,并提供服務的故障切換。 Netflix 在其生產環境中使用的是另外的客戶端,它提供基于流量、資源利用率以及出錯狀態的加權負載均衡。
* 開源: 大家可以對實現一探究竟,甚至修改源代碼。
* 可靠: 經過 Netflix 多年的**生產環境**考驗,使用應該比較靠譜處心。
* 功能齊全: 不但提供了完整的注冊發現服務,還有 Ribbon 等可以配合使用服務。
* 基于 Java: 對于 Java 程序員來說,使用起來,心里比較有底。
* Spring Cloud**可以使用 Spring Cloud,與 Eureka 進行了很好的集成**,使用起來非常方便。
## Eureka 架構:
Netflix 主要是在 AWS 中使用 Eureka 的,雖然同時也支持本地環境,但是了解 AWS 的一些基礎概念對于理解 Eureka 的設計非常有幫助。
## 區域與可用區
首先,我們先熟悉兩個概念:
* 區域(Region): AWS 云服務在全球不同的地方都有數據中心,比如北美、南美、歐洲和亞洲等。與此對應,根據地理位置我們把某個地區的基礎設施服務集合稱為一個區域。通過 AWS 的區域,一方面可以使得 AWS云服務在地理位置上更加靠近我們的用戶,另一方面使得用戶可以選擇不同的區域存儲他們的數據以滿足法規遵循方面的要求。美東(北佛吉尼亞)、美西(俄勒岡)、美西(北加利佛尼亞)、歐洲(愛爾蘭)、亞太(新加坡)、亞太(東京)等。每個區域都有自己對應的編碼,如: 區域 編碼
亞太(東京) ap-northeast-1 亞太(新加坡) ap-southeast-1 亞太(悉尼) ap-southeast-2 歐洲(愛爾蘭) eu-west-1 南美(圣保羅) sa-east-1 美東(北佛杰尼亞) us-east-1 美西(北加利佛尼亞) us-west-1 美西(俄勒岡) us-west-2
* 可用區(Zone): AWS 的每個區域一般由多個可用區(AZ)組成,而一個可用區一般是由多個數據中心組成。AWS引入可用區設計主要是為了提升用戶應用程序的高可用性。因為可用區與可用區之間在設計上是相互獨立的,也就是說它們會有獨立的供電、獨立的網絡等,這樣假如一個可用區出現問題時也不會影響另外的可用區。在一個區域內,可用區與可用區之間是通過高速網絡連接,從而保證有很低的延時。 每次當用戶需要使用 EC2 相關資源的時候,他需要首先選擇目標區域,如美東(北佛杰尼亞)us-east-1。然后在創建 EC2 產例的時候,用戶可以選擇實例所在的可用區,比如可以是 us-east-1a 或 us-east-1b 等。可用區的編碼就是區域后面添加不同的英文字母。
## Eureka 架構說明
下圖是 Eureka Wiki 中提供的架構圖:從上面的架構圖可以看出,主要有三種角色:
Eureka Server \*\*\* 通過 Register, Get,Renew 等 接口提供注冊和發現
Application Service (Service Provider): \*\*\* 服務提供方 \*\*\* 把自身服務實例注冊到 Eureka Server
Application Client (Service Consumer): \*\*\* 服務調用方 \*\*\* 通過 Eureka Server 獲取服務實例,并調用 Application Service
他們主要進行的活動如下:
每個 Region 有一個 Eureka Cluster, Region 中的每個 Zone 都至少有一個 Eureka Server。 Service 作為一個 Eureka Client,通過 register 注冊到 Eureka Server,并且通過發送心跳的方式更新租約(renew leases)。如果 Eureka Client 到期沒有更新租約,那么過一段時間后,Eureka Server 就會移除該 Service 實例。 當一個 Eureka Server 的數據改變以后,會把自己的數據同步到其他 Eureka Server。 Application Client 也作為一個 Eureka Client 通過 Get 接口從 Eureka Server 中獲取 Service 實例信息,然后直接調用 Service 實例。 Application Client 調用 Service 實例時,可以跨可用區調用。
Eureka還提供了客戶端緩存機制,即使所有的Eureka Server都掛掉了,客戶端依然可以利用緩存中的信息消費其他服務的API。
簡單來說,Eureka通過心跳檢查,健康檢查,客戶端緩存機制,確保了系統的高可用性,靈活性和伸縮性。
## Eureka Demo
實際工作中,我們很少會直接使用 Eureka,因為 Spring Cloud 已經把 Eureka 與 Spring Boot 進行了集成,使用起來更為簡單,所以我們使用 Spring Cloud 作為示例。
這里是官方提供的一個示例:spring-cloud-eureka-example
* 啟動 Eureka Server
Eureka Server 非常簡單,只需要三個步驟:
在 pom.xml 中添加依賴:
~~~
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
~~~
實現 Application,添加 annotation。 @EnableEurekaServer、@EnableDiscoveryClient 執行 main 方法啟動 Eureka Server。
~~~
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
~~~
運行 Application 即可啟動 Server,啟動 Server 后打開 http://localhost:8761/,可以看到信息頁面。
* 注冊服務
把一個服務注冊在 server 中需要以下幾個步驟:
添加 eureka 依賴
org.springframework.cloudspring-cloud-starter-eureka
添加 @EnableEurekaClient 注解
~~~
@EnableEurekaClient
public class Application
~~~
3. 在 application.yml 或者 application.properties 中添加配置
~~~
eureka:
client:
service-url:
defaultZone: http://172.17.66.44:8761/eureka/
spring:
application:
name: client
~~~
配置中有兩項需要額外注意:
1. eureka.client.serviceUrl.defaultZone:指定 Eureka 服務端的地址,當客戶端沒有專門進行配置時,就會使用這個默認地址。
2. spring.application.name:服務注冊所使用的名稱,同時其他服務查找該服務時也使用該名稱。我們啟動該服務后,可以在管理頁面中查看到該服務已經在注冊中心中注冊成功了。