本篇文章主講eureka的高可用結構,eureka爲何比傳統的註冊中心性能更佳,eureka是如何進行服務的註冊與發現;在本篇文章中不會教出初學者進行如何搭建聚合工程,而是給出具體的client , server代碼。java
eureka 是 一個服務註冊與發現的組件 ,其可以更好的支持負載均衡和服務中間層,一般有 Eureka server (提供REST服務), Euraka client(消費REST服務),它們之間經過 service 交流更加的簡便。git
傳統的註冊中心工做於暴露的IP地址和主機名,在服務的註冊與發現中進行加載負載均衡的過程會更加的繁瑣;eureka在中間層提供了加載負載均衡機制,彌補了傳統的註冊中心的不足之處,使加載負載均衡更加簡便,性能方面也顯著提升;github
eureka的空間分佈中每一個集羣的一個節點(例如 us-east-lc)就是一個區域(Region),每一個region中有許多的的分區(Zone),分區中存放的是client;每一個eureka server中至少會有一個zone用於處理zone失敗的狀況;web
euraka的region會發現本身區域中的實例(instance)spring
當服務端註冊到 eureka server 時,會每隔30秒發送一次心跳給server 用於從新租約;app
若是客戶端不可以從新租約,那麼90秒後會從服務列表中剔除;負載均衡
集羣節點1的註冊信息會被複制給節點2,以此類推,保證了eueka來自任何zone的客戶端(30秒一次)均可以查找region的信息用於發現可用服務進行遠程調用;spring-boot
這邊使用的是比較新的cloud版本爲Finchley.SR2,boot版本 2.0.6;性能
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.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>
<!-- SpringCloud版本 -->
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
<start-web.version>2.0.4.RELEASE</start-web.version>
</properties>
<!-- cloud工程版本管理 -->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${start-web.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- web啓動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencies>
<!-- Eureka服務端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
application.yml中定義了 application server 的 端口爲10086 ,eureka的實例主機名爲localhost;application server 相對於 eureka server 其也是 client ; 做爲 server 是禁止向本身註冊服務;service-url 表示其餘的 client 能夠經過此路徑,將服務註冊在server 上,或者從 server上發現有那些服務;字體
server:
port: 10086
eureka:
instance:
hostname: localhost
client:
# 做爲server,表示禁止向本身註冊
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
@EnableEurekaServer註解表示開啓eureka server功能,做爲 application server;
/**
* @Author lsc
* <p> eureka 服務端 </p>
*/
@SpringBootApplication
@EnableEurekaServer//表示開啓eureka server功能
public class EurekaServerApp {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApp.class,args);
}
}
訪問路徑也就是是server-url: http://localhost:10086/ ; 以下圖所示,因爲只啓動了server,沒有其它服務向其註冊,因此服務列表的實例爲空;
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
client 的 端口地址爲8090,而且將應用名稱名爲爲 eureka-client,在服務列表便於區分是哪一個實例;服務的註冊地址也就是server的地址;
server:
port: 8090
spring:
application:
name: eureka-client # 應用名稱
eureka:
client:
service-url:
# 服務註冊地址
defaultZone: http://localhost:10086/eureka/
@EnableEurekaClient註解表示開啓 eureka client 做爲 application client;
/**
* @Author lsc
* <p> </p>
*/
@SpringBootApplication
@EnableEurekaClient//表示開啓 eureka client
public class EurekaClientApp {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApp.class,args);
}
}
從頁面中能夠看見咱們向server 註冊了一個名爲 EUREKA-CLIENT的服務,紅色字體目前不用管它,是eureka的健康保護機制,前面提到的若是client 30秒以內未續租,90秒後會被剔除;