Spring Cloud Eureka 是 Spring Cloud 中的一個組件,它是基於 Netflix Eureka 作了二次封裝,主要是負責完成微服務框架中服務治理的功能。Spring Cloud經過爲 Eureka 增長了 Spring Boot 風格的自動化配置,咱們只須要經過簡單的引用依賴和註解就能讓 Spring Boot 夠將的微服務應用輕鬆的與 Eureka 服務治理體系進行整合。java
服務治理是微服務框架中最爲核心和基礎的模塊,它主要是用來實現各個微服務實例的自動化註冊與發現。
最初開始,可能構建的微服務系統服務並非不少,咱們能夠經過一些靜態配置來完成服務的調用。好比有兩個服務 A 和 B,其中 A 服務須要調用 B 服務來完成一個業務操做時,爲了實現 B 服務的高可用,不管咱們採用服務端的複雜均衡,仍是客戶端的負載均衡,咱們都須要手工的來維護一份 B 的實例列表。可是隨着業務的發展,系統功能愈來愈複雜,相應的微服務也是愈來愈多,這種靜態手工維護的難度會愈來愈高。
爲了解決這種問題,產生了大量的服務治理的框架和產品。這些框架其實都是圍繞着服務註冊和服務發現機制來完成對微服務應用實例的自動化管理。git
在服務治理框架中,一般都會構建一個服務註冊中心,每一個服務實例單元向註冊中心登記本身的服務,將實例主機位置、端口號、版本號、通訊協議等一系列附加信息告訴註冊中心,註冊中心按服務名分類組織服務清單。github
因爲在服務治理框架下操做,服務間的通訊與調用再也不是經過指定具體的實例地址來實現,而是經過向服務名發起請求調用實現。因此,服務調用方在調用服務提供方的接口時,並不知道具體的服務實例位置。所以,須要先向註冊中心發起查詢請求,獲取實例清單,以實現對具體服務實例的訪問。web
咱們以後的全部開發都會基於以上版本進行操做,須要注意的是:Sring Cloud 使用的是 SNAPSHOT 版,因此須要在 pom 文件中指定倉庫的地址。
首先,咱們新建一個 Spring Boot 工程,命名爲:spring-cloud-eureka,並在 pom 中添加必要的依賴,具體 pom 文件以下:spring
<?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.sagesource</groupId> <artifactId>spring-cloud-eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-cloud-eureka</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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>Finchley.BUILD-SNAPSHOT</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-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> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
經過 @EnableEurekaServer 註解啓動一個服務註冊中心提供給其餘應用進行對話。這一步很是簡單,只需在一個普通的 Spring Boot 應用中添加這個註解就能開啓此功能:apache
@SpringBootApplication @EnableEurekaServer public class ApplicationEurekaServer { public static void main(String[] args) { SpringApplication.run(ApplicationEurekaServer.class, args); } }
在默認的配置下,註冊中心服務端也會將本身做爲一個客戶端來註冊自身,通常狀況下,咱們須要禁用這個功能,修改後的 application.yml 以下:安全
# spring config spring: application: name: spring-boot-eureka # server config server: port: 9871 # eureka config eureka: instance: hostname: localhost client: register-with-eureka: false #不向註冊中心註冊本身 fetch-registry: false #不檢索服務 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
因爲咱們都是在本地運行,爲了後續的服務區分,咱們將服務註冊中心的端口經過 server.port 設置運行端口爲:9871
在完成上述配置後,啓動應用並訪問 http://localhost:9871。能夠看到以下頁面,其中 Instance currently registered with Eureka 的列表是空的,說明尚未服務註冊到該註冊中心。網絡
我想你們都注意到上面那兩行醒目的紅字:app
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
緣由:自我保護機制。Eureka Server在運行期間,會統計心跳失敗的比例在15分鐘以內是否低於85%,若是出現低於的狀況(在單機調試的時候很容易知足,實際在生產環境上一般是因爲網絡不穩定致使),Eureka Server會將當前的實例註冊信息保護起來,同時提示這個警告。
因爲在單機狀況下很容易出現該問題,按照網上的配置關閉掉自我保護後,Eureka 仍會報警,提示安全模式關閉,沒法保證明例正確性。因此,咱們暫時忽略該問題,後期集羣部署時便可解決。負載均衡
在完成了註冊中心服務的搭建後,接下來咱們能夠嘗試將一個既有的 Spring Boot 應用加入到Eureka 的服務治理體系中去。
咱們仍然以以前的 spring-cloud-server 爲例,咱們只須要修改 application.yml如下配置:
# 應用名稱 spring: application: name: spring-cloud-server # eureka 註冊中心位置 eureka: client: service-url: defaultZone: http://localhost:9871/eureka/
修改完成後,便可啓動服務,這時咱們在刷新 eureka 的管理頁面,看到Instance currently registered with Eureka的列表信息以下:
這代表,咱們的服務已經成功註冊在註冊中心。