Eureka簡介和作用
Spring Cloud Eureka是Spring Cloud Netflix微服務套件中的一部分,它基于Netflix Eureka做了二次封裝。主要負責完成微服務架構中的服務治理功能。
服務治理是微服務架構中最為核心和基礎的模塊,它主要用來實現(xiàn)各個微服務實例的自動化注冊和發(fā)現(xiàn)。
Eureka服務端
Eureka服務端,即服務注冊中心。它同其他服務注冊中心一樣,支持高可用配置。依托于強一致性提供良好的服務實例可用性,可以應對多種不同的故障場景。
Eureka服務端支持集群模式部署,當集群中有分片發(fā)生故障的時候,Eureka會自動轉入自我保護模式。它允許在分片發(fā)生故障的時候繼續(xù)提供服務的發(fā)現(xiàn)和注冊,當故障分配恢復時,集群中的其他分片會把他們的狀態(tài)再次同步回來。集群中的的不同服務注冊中心通過異步模式互相復制各自的狀態(tài),這也意味著在給定的時間點每個實例關于所有服務的狀態(tài)可能存在不一致的現(xiàn)象。
服務注冊中心
在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,包括服務的主機與端口號、服務版本號、通訊協(xié)議等一些附加信息。注冊中心按照服務名分類組織服務清單,同時還需要以心跳檢測的方式去監(jiān)測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。
服務注冊管理器
原理如下圖

所有的服務端及訪問服務的客戶端都需要連接到注冊管理器(eureka服務器)。服務在啟動時會自動注冊自己到eureka服務器,每一個服務都有一個名字,這個名字會被注冊到eureka服務器。使用服務的一方只需要使用該名字加上方法名就可以調用到服務。
Spring cloud的服務注冊及發(fā)現(xiàn),不僅僅只有eureka,還支持Zookeeper和Consul。默認情況下是eureka,spring 封裝了eureka,使其非常簡單易用,只需要比傳統(tǒng)應用增加一行代碼就可以使用了,這一行代碼就是一個注解。
使用Eureka進行服務治理
引入Spring Cloud Eureka Server依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
版本對應
引入依賴的時候需要注意SpringCloud和SpringBoot的版本對應
SpringCloud和SpringBoot版本分別是Finchley.RC2和2.0.2.RELEASE
<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.RC2</spring-cloud.version>
</properties>
在之前的一篇文章有提到版本的對應,我這里SpringCloud Finchley版兼容SpringBoot 2.0,所以是沒問題的。
開啟EurekaServer服務
在Springboot項目中的main入口,添加@EnableEurekaServer注解,來開啟服務注冊中心
@SpringBootApplication
@EnableEurekaServer
public class SpringcloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaApplication.class, args);
}
}
還需要在配置文件中加入Eureka Server相關配置
server:
port: 9090
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
eureka-server-u-r-l-context: http://${eureka.instance.hostname}:${server.port}/eureka/
server.port:服務注冊中心端口號
eureka.instance.hostname:服務注冊中心實例的主機名
eureka.client.register-with-eureka:是否向服務注冊中心注冊自己,默認為true。 由于當前應用就是Eureka Server, 因此設為 false;
eureka.client.fetch-registry:是否檢索服務, 默認為true。
如果這是一個單點的 Eureka Server,不需要同步其他節(jié)點的數(shù)據(jù),可以設為false。
eureka.client.eureka-server-u-r-l-context:服務注冊中心的配置內容,指定服務注冊中心的位置
以上是比較常用的屬性,還有
eureka.server.enable-self-preservation:是否開啟自我保護模式,默認為true。關閉了面板會出現(xiàn)提示:THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.Eureka 會統(tǒng)計15分鐘之內心跳失敗的比例低于85%將會觸發(fā)保護機制,不剔除服務提供者,如果關閉服務注冊中心將不可用的實例正確剔除
eureka.instance.prefer-ip-address:是否使用IP地址的方式,默認是false。不使用主機名來定義注冊中心的地址,而使用IP地址的形式
eureka.instance.ip-address:IP地址,使用該屬性配置的IP,否則自動獲取除環(huán)路IP外的第一個IP地址,與eureka.instance.prefer-ip-address一起使用
eureka.instance.appname:服務名,一般取 spring.application.name 配置值,默認為unknown
服務續(xù)約
在注冊服務之后,服務提供者會維護一個心跳用來持續(xù)高速Eureka Server,“我還在持續(xù)提供服務”,否則Eureka Server的剔除任務會將該服務實例從服務列表中排除出去。
eureka.instance.lease-renewal-interval-in-seconds:定義服務續(xù)約任務(心跳)的調用間隔,單位:秒,默認30秒
eureka.instance.lease-expiration-duration-in-seconds:定義服務失效的時間,表示eureka客戶端發(fā)送心跳給服務端的頻率。單位:秒,默認90秒
該值太大,則很可能將流量轉發(fā)過去的時候,該instance已經(jīng)不存活了。
該值太小了,則instance則很可能因為臨時的網(wǎng)絡抖動而被摘除掉。
該值至少應該大于eureka.instance.lease-renewal-interval-in-seconds
啟動了Eureka Server,然后在瀏覽器中輸入Eureka Server的地址后,我這里的地址是http://localhost:9090/,直接回車,就進入了springcloud的服務治理頁面
服務注冊中心頁面

由于現(xiàn)在沒有注冊服務,所以
Instances currently registered with Eureka是沒有服務名的