一、介紹
對於微服務的治理而言,其核心就是服務的註冊和發現。在SpringCloud 中提供了多種服務註冊與發現組件:Eureka,Consul,Zookeeper。官方推薦使用Eureka。
說明:Eureka是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的組件之一。管理的服務包含了Spring Cloud的其餘服務組件如:熔斷、負載、降級等。java
二、理解
以往服務間資源的獲取都是經過相互調用,好比A獲取B相關資源,A調用B提供的API獲取相關資源 。加入Eureka以後,則B提供服務資源須要在Eureka服務中心註冊一遍,A獲取服務資源也須要在Eureka服務中心註冊一遍,從而獲取B服務的資源。監控Eureka服務中心能夠監控AB服務調用的使用狀況。node
三、核心內容
上文說過,對於服務治理而言,其核心部分就是服務的發現與註冊,而Spring Cloud推薦使用的是Eureka。由於在分佈式系統中,有一個CAP定理,即 Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可兼得。Zookeeper是Hadoop的子項目,它的做用也多做爲服務的發現與註冊。 Zookeeper在CAP定理中知足的CP,也就是一致性和分區容錯性,可是它不能保證服務的可用性。好比,服務消費者經過註冊列表獲取數據時,假若,Zookeeper正在選主致使服務不可用,亦或者大多數服務宕機。在通常分佈式系統的數據存儲場景,數據一致性應該是首先被保證的。然而在服務發現的場景中,服務消費者可以消費纔是首先保證的,即服務的可用性纔是首先保證。git
3.一、Eureka組件
Eureka由多個instance(服務實例)組成,這些服務實例能夠分爲兩種:Eureka Server和Eureka Client。爲了便於理解,咱們將Eureka client再分爲Service Provider(服務提供者)和Service Consumer(服務消費者)。
Eureka Server:服務的註冊中心,負責維護註冊的服務列表。
Service Provider:服務提供方,做爲一個Eureka Client,向Eureka Server作服務註冊、續約和下線等操做,註冊的主要數據包括服務名、機器ip、端口號、域名等等。
Service Consumer:服務消費方,做爲一個Eureka Client,向Eureka Server獲取Service Provider的註冊信息,並經過遠程調用與Service Provider進行通訊。 github
3.二、Eureka Server
Eureka Server做爲一個獨立的部署單元,以REST API的形式爲服務實例提供了註冊、管理和查詢等操做。同時,Eureka Server也爲咱們提供了可視化的監控頁面,能夠直觀地看到各個Eureka Server當前的運行狀態和全部已註冊服務的狀況。web
Eureka Server節點啓動後,會首先嚐試從鄰近節點獲取全部實例註冊表信息,完成初始化。Eureka Server經過getEurekaServiceUrls()方法獲取全部的節點,而且會經過心跳續約的方式按期更新。 默認配置下,若是Eureka Server在必定時間內沒有接收到某個服務實例的心跳,Eureka Server將會註銷該實例(默認爲90秒,經過eureka.instance.lease-expiration-duration-in-seconds配置)。當Eureka Server節點在短期內丟失過多的心跳時(好比發生了網絡分區故障),那麼這個節點就會進入自我保護模式。spring
自我保護模式: 默認配置下,若是Eureka Server每分鐘收到心跳續約的數量低於一個閾值(instance的數量(60/每一個instance的心跳間隔秒數)自我保護係數),而且持續15分鐘,就會觸發自我保護。在自我保護模式中,Eureka Server會保護服務註冊表中的信息,再也不註銷任何服務實例。當它收到的心跳數從新恢復到閾值以上時,該Eureka Server節點就會自動退出自我保護模式。它的設計理念就是寧肯保留錯誤的服務註冊信息,也不盲目註銷任何可能健康的服務實例。該模式能夠經過eureka.server.enable-self-preservation = false來禁用,同時eureka.instance.lease-renewal-interval-in-seconds能夠用來更改心跳間隔,eureka.server.renewal-percent-threshold能夠用來修改自我保護係數(默認0.85)。瀏覽器
3.三、Eureka Client
服務註冊 :啓動時,會調用服務註冊方法,向Eureka Server註冊本身的信息。Eureka Server會維護一個已註冊服務的列表。當實例狀態發生變化時(如自身檢測認爲Down的時候),也會向Eureka Server更新本身的服務狀態,同時用replicateToPeers()向其它Eureka Server節點作狀態同步。緩存
續約與剔除 :服務實例啓動後,會週期性地向Eureka Server發送心跳以續約本身的信息,避免本身的註冊信息被剔除。續約的方式與服務註冊基本一致,首先更新自身狀態,再同步到其它Peer。若是Eureka Server在一段時間內沒有接收到某個微服務節點的心跳,Eureka Server將會註銷該微服務節點(自我保護模式除外)。服務器
服務消費 :Service Consumer本質上也是一個Eureka Client。它啓動後,會從Eureka Server上獲取全部實例的註冊信息,包括IP地址、端口等,並緩存到本地。這些信息默認每30秒更新一次。前文提到過,若是與Eureka Server通訊中斷,Service Consumer仍然能夠經過本地緩存與Service Provider通訊。網絡
三處緩存:
Eureka Server對註冊列表進行緩存,默認時間爲30s。
Eureka Client對獲取到的註冊信息進行緩存,默認時間爲30s。
Ribbon會從上面提到的Eureka Client獲取服務列表,將負載均衡後的結果緩存30s。
四、代碼實現
咱們作三個角色
Eureka Server :提供服務註冊和發現;
Service Provider :服務提供方,將自身服務註冊到Eureka,從而使服務消費方可以找到;
Service Consumer: 服務消費方,從Eureka獲取註冊服務列表,從而可以消費服務。
五、Eureka Server
maven項目的pom.xml文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/>
</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>
<!--Eureka服務端-->
<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>
項目的啓動配置文件:application.properties
spring.application.name=eureka-server
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
配置說明:其中serviceUrl表明註冊中心,集羣多個,逗號分隔,fetch-registry(默認開啓)表示從註冊中中心獲取服務;register-with-eureka(默認開啓):是否將自身註冊到服務中心。
開啓Eureka服務:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
瀏覽器訪問Eureka後臺:http://localhost:8761/
箭頭方向能夠看出目前服務註冊中心沒有實例
六、Eureka Provider
maven項目的pom.xml文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.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>
<!-- spring boot實現Java Web服務-->
<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>
項目啓動配置文件application.properties:
#應用(服務)名稱
spring.application.name=eureka-provider
server.port=8762 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
註解@EnableDiscoveryClient服務化:
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaProviderApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaProviderApplication.class).web(true).run(args);
}}
訪問控制器:
@RestController
public class ProviderNode1Controller {
@GetMapping({"","/"})
public String index(){
return "Hi,dy_bom! this is provider-node1 of peer!";
}
查看註冊中心後臺 :
能夠看到服務提供者已經成功的註冊到了服務中心。
說明:圖中紅色警告是由於Eureka開啓了自我保護機制,Eureka Server在運行期間,會統計心跳失敗的比例在15分鐘以內是否低於85%,我這裏是由於以前沒有開啓BUS服務的rabbit形成的,你也能夠設置自我保護enable-self-preservation爲false
七、Eureka與Spring Cloud Security 結合作權限認證
在pom.xml中加入Security的依賴
<!--權限認證-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
properties定義權限的用戶名密碼
#權限認證(默認就是開啓的)
security:
basic:
enabled: true
user:
name: eureka
password: 123456
訪問Eureka的後臺,須要輸入對應的用戶名密碼
八、Eureka集羣
properties配置文件
#對等意識,集羣Eureka服務器配置
---
spring:
application:
name: spring-cloud-eureka
profiles: peer1
server:
port: 8001
eureka:
instance:
hostname: peer1
client:
serviceUrl:defaultZone: http://peer2:8002/eureka/,http://peer3:8003/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: peer2
server:
port: 8002
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8001/eureka/,http://peer3:8003/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: peer3
server:
port: 8003
eureka:
instance:
hostname: peer3
client:
serviceUrl:
defaultZone: http://peer1:8001/eureka/,http://peer2:8001/eureka/
啓動後,咱們能夠看到三個節點是兩兩互相註冊的。各個節點沒有主次之分,對等。
代碼地址:https://github.com/rubenYuan/Spring-Cloud-Samples
PPT:http://download.csdn.net/download/ruben95001/9974839--------------------- 轉自:https://blog.csdn.net/ruben95001/article/details/77198419