Eureka簡介
Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。
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通過心跳檢查、客戶端緩存等機制,確保了系統的高可用性、靈活性和可伸縮性,類似zookeeper,Eureka也是一個服務註冊和發現組件,是SpringCloud的一個優秀子項目,不過比較坑的是,Eureka2版本已經停止更新了,但是Eureka1版本還是很穩定,功能足夠用,所以還是有必要學習下
幾個常用的服務註冊與發現組件對比:
Eureka GitHub地址: https://github.com/Netflix/eureka
爲什麼需要服務治理組件
之前每個應用都是一個CPU,一個主機上的單一系統。隨着大數據和雲計算時代的到來,任何獨立的程序都可以運行在多個計算機上,並且隨着業務的發展,訪問用戶量的增加,開發人員或小組的增加,系統會被拆分成多個功能模塊,拆分後每個功能模塊可以作爲一個獨立的子系統提供其職責範圍內的功能;而多個子系統中,由於職責不同並且會存在相互調用,同時可能每個子系統還需要多個實例部署在多臺服務器或者鏡像中,導致子系統間的相互調用形成了一個錯綜複雜的網狀結構,下面用幾幅圖來說明一下
單體應用:
隨着業務的發展,經過了多個系統架構的演變,變成了這樣(拿百度的功能舉個栗子):
圖中,每個網頁搜索子系統和百度地圖子系統的實例都可以視同爲一個微服務,網頁搜索子系統爲百度地圖子系統提供了“用戶查詢內容、用戶IP地址”等信息提供的服務接口,爲百度地圖子系統定位用戶地理信息情況提供數據依據
百度地圖子系統提供了“根據內容查詢出地圖信息”的接口提供給其他子系統調用,而這裏網頁搜索子系統調用了這個接口,獲取地圖相關信息
網頁搜索子系統和百度地圖子系統又提供了各自對外用戶調用的網頁搜索、地圖搜索等各自的對外服務。這個過程就形成了以上錯綜複雜的網狀結構;而實際上這樣還遠遠不夠,因爲每個子系統往往會提供多個對內的其他子系統調用的服務接口,同時也會調用多個不同子系統提供的多個服務接口,還會對外提供多個各自的服務接口。所以實際中上圖的網狀調用結構將會成幾何倍的擴張,而且隨着用戶量的增加,每個子系統還需要繼續增加更多的實例來提供服務,從而導致了凌亂的加劇。對於微服務之間錯綜複雜的調用關係,通過Eureka來進行管理,可以讓每個服務之間不用關心如何調用的問題,專注於自己的業務功能實現
Eureka的初步使用
- 搭建Eureka服務註冊中心
前面說過Eureka是c/s模式的,server服務端就是服務註冊中心,其他的都是client客戶端,服務端用來管理所有服務,客戶端通過註冊中心,來調用具體的服務,先來搭建下服務端,也就是服務註冊中心:
創建一個簡單的springboot模塊(microservice-eureka-server-2001)
在pom文件中加入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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ue</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-eureka-server-2001</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
在yml文件中添加Eureka服務端相關信息,application.yml如下:
server:
port: 2001
context-path: /
eureka:
instance:
#Eureka註冊中心實例名稱
hostname: localhost
client:
#由於該應用爲註冊中心,所以設置爲false,代表不向註冊中心註冊自己
register-with-eureka: false
#由於註冊中心的職責就是維護服務實例,它並不需要去檢索服務,所以也設置爲false
fetch-registry: false
service-url:
#設置與Eureka註冊中心交互的地址,查詢服務和註冊服務時用到
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
在啓動類中添加@EnableEurekaServer註解,MicroserviceEurekaServer2001Application.java如下:
package com.ue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class MicroserviceEurekaServer2001Application {
public static void main(String[] args) {
SpringApplication.run(MicroserviceEurekaServer2001Application.class, args);
}
}
搭建成功截圖如下:
- 向Eureka中註冊服務提供者
這裏在原來的服務提供者項目microservice-student-provider-1001的基礎上直接修改,首先修改pom.xml,加上Eureka客戶端依賴:
<!--添加註冊中心Eureka相關配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
然後application.yml里加上配置:
eureka:
instance:
#eureka客戶端主機實例名稱
hostname: localhost
#客戶端服務名
appname: microservice-student
#客戶端實例名稱
instance-id: microservice-student:1001
#顯示IP
prefer-ip-address: true
client:
service-url:
#把服務註冊到eureka註冊中心
defaultZone: http://localhost:2001/eureka
注:這裏的defaultZone要和前面服務註冊中心的暴露地址一致
最後在啓動類加上一個註解@EnableEurekaClient:
然後測試下,先啓動服務註冊中心,再啓動服務提供者,然後用瀏覽器訪問http://localhost:2001,服務提供者成功註冊截圖如下:
這裏有個問題,點擊實例狀態結果如下:
解決方案如下:
首先在服務提供者項目pom.xml里加入actuator監控依賴:
<!-- actuator監控引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然後在服務提供者項目application.yml加上info配置:
info:
groupId: com.ue.microservice
artifactId: microservice-student-provider-1001
version: 1.0-SNAPSHOT
負責人: Tom
聯繫電話: 123456
結果圖如下: