Why Eureka
Eureka來自生産環境,Spring Cloud對Eureka支援非常好。
What Eureka
Eureka是Netflix開發的服務發現架構,本事是一個基于REST的服務,主要用于定位運作在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。Spring Cloud将它內建在其子項目spring-cloud-netflix中,以實作Spring Cloud的服務發現功能。
Eureka項目相當活躍,代碼更新相當頻繁,面前最新的版本是1.5.5.Eureka 2.0的版本也正在緊鑼密鼓地開發中,2.0将會帶來更好的擴充性,并且使用細粒度的訂閱模型,但是還沒有Release.
更多詳情了解官方資料:https://github.com/Netflix/eureka/wiki/Eureka-2.0-Motivations
How Enreka
官方架構圖:https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance

以上大緻描述了Eureka叢集的工作過程。簡單介紹一下:
Application Servce就相當于之前介紹到的服務提供者(使用者微服務),Application Client就相當于服務消費者(電影微服務);
Make Remote Call,可以簡單了解為調用RESTful的接口;
us-east-1c、us-east-1d、us-east-1e等是zone,它們都屬于us-east-1這個region。
關于region和zone的關系,csdn論壇上講得很好。http://bbs.csdn.net/topics/390800408
上圖可以看出Eureka包含兩個元件,Eureka Server和Eureka Client。
Eureka Server提供服務注冊服務,各個節點啟動後,會在Eureka Server中進行注冊,這樣Eureka Server中的服務系統資料庫中将會存儲所有可用服務節點的資訊,服務節點的資訊可以在界面中直覺的看到。
Eureka Client是一個Java用戶端,用于簡化與Eureka Server的互動,用戶端同時也具備一個内置的、使用輪詢(round-robin)負載算法的負載均衡器。
在應用啟動後,将會向Eureka Server發送心跳(預設周期為30秒)。如果Eureka Server在多個心跳周期内沒有接收到某個節點的心跳,Eureka Server将會從服務系統資料庫中把這個服務結點移除(預設90秒)。
Eureka Server之間将會通過複制的方式完成資料的同步。
Eureka還提供了用戶端緩存的機制,即使所有的Eureka Server都挂掉,用戶端依然可以利用緩存中的資訊消費其他服務的API。
綜上,Eureka通過心跳檢測、健康檢查、用戶端緩存等機制,確定了系統的高可用性、靈活性和可伸縮性。
Demo
實作一個Eureka Server
1、建立一個maven project,右鍵->new->maven project
2、點選下一步,然後填寫相關資訊
3、建立完成後,修改pom檔案。
<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>com.itmuch.cloud</groupId>
<artifactId>microservice-spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>microservice-discovery-eureka</artifactId>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</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-security</artifactId>
</dependency>
</dependencies>
</project>
4、在resouces下添加application.yml檔案
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 8761
eureka:
client:
# healthcheck:
# enabled: true
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:[email protected]:8761/eureka
5、編寫EurekaApplication.java
package com.itmuch.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication
{
public static void main(String[] args )
{
SpringApplication.run(EurekaApplication.class, args);
}
}
6、parent的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>com.itmuch.cloud</groupId>
<artifactId>microservice-spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>microservice-consumer-movie</module>
<module>microservice-provider-user</module>
<module>microservice-discovery-eureka</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR1</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>
7、啟動并在url中輸入網址:localhost:8761。
輸入使用者名user密碼password123,可以看到Eureka頁面。
總結一下:
這裡有總結的知識點,也有在實踐中遇到的問題和總結的小技巧。避免踩坑!
1、pom檔案抽取到parent
我們可以看到,将所有的依賴和插件都抽在parent中,就可以統一管理jar包依賴的版本。在這裡spring cloud所用版本為Camden.SR1,剛開始用Finchley.M1怎麼都下載下傳不下來。
将其整合到一塊,當微服務特别多的時候便于統一管理,統一打包部署。
2、安全憑證
Eureka的登入頁面設定使用者名和密碼才能相對安全一些,總不能誰都能通路吧。
具體做法:
1、引jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、application.yml的配置
設定使用者名和密碼
security:
basic:
enabled: true
user:
name: user
password: password123
使用:
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:[email protected]:8761/eureka
3、小技巧:将關閉的項目隐藏
當你的項目特别多的時候,不需要的項目可以關閉隐藏。
4、新添加的檔案讓其成為源檔案
在搭建項目的時候我建立了一個resources檔案夾,然後在其中新添了一個appliation.yml檔案,但是運作項目卻讀取不到。原因是其沒有同步到源檔案中。這個時候有兩種解決方法。
第一種:重新導入,導入之前隻保留src和pom檔案,其它像target,.settings生成的檔案全都删除。
第二種:通過build path将其加入源檔案。
如上圖,将resources勾選上便可以。
5、簡單聲明一個EurekaServer
一個是在啟動類中加入類的注解@EnableEurekaServer
然後在application.yml中配置:将register-with-eureka和fetch-registry設定為false,目的是不把自己當做client。
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:[email protected]:8761/eureka
完整的源碼将在後期部落格完善後一并分享,後面将繼續總結微服務如何注冊到Eureka Server中,敬請期待。。。