推薦:微服務彙總
Spring Cloud 之Eureka初使用
首先建立一個Spring Boot項目作為Eureka Server,畢竟Spring Cloud是基于Spring Boot的。
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>
<groupId>com.kaven</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.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.SR2</spring-cloud.version>
</properties>
<dependencies>
<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>
</project>
application.yml
如下:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8761
register-with-eureka
是表示該服務是否需要注冊到Eureka Server上(以Eureka Client的身份),因為它本身是Eureka Server,是以這裡設定為
false
,實際上它也是Eureka Client,也可以提供服務。
enable-self-preservation
是表示該服務是否開啟自我保護模式(以Eureka Server的身份),預設是開啟,之後會對這個配置進行示範。
按Ctrl點選配置項,比如
service-url
,就可以看到源碼如下:
/**
* Map of availability zone to list of fully qualified URLs to communicate with eureka
* server. Each value can be a single URL or a comma separated list of alternative
* locations.
*
* Typically the eureka server URLs carry protocol,host,port,context and version
* information if any. Example:
* http://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/
*
* The changes are effective at runtime at the next service url refresh cycle as
* specified by eurekaServiceUrlPollIntervalSeconds.
*/
private Map<String, String> serviceUrl = new HashMap<>();
{
this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
}
它是一個
Map<String, String>
型資料,
key
為
DEFAULT_ZONE
,
value
為
DEFAULT_URL
。
public static final String DEFAULT_URL = "http://localhost:8761" + DEFAULT_PREFIX
+ "/";
public static final String DEFAULT_ZONE = "defaultZone";
DEFAULT_ZONE
為
"defaultZone"
。
public static final String DEFAULT_PREFIX = "/eureka";
DEFAULT_URL
為
"http://localhost:8761/eureka"
。
是以我們這裡配置
defaultZone: http://localhost:8761/eureka/
(也可以設定成其他的端口,這裡隻是習慣配置為8761),如果有多個
service-url
需要配置,可以這樣寫:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
使用這種方式來部署多個Eureka Server,以便實作Eureka的高可用,這裡就不示範了,之後的部落格再詳細說明。
配置項應該如何配置?就像上面一樣,點進去看源碼即可,其他配置項就不說明了。
啟動類:
package com.kaven.eureka;
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);
}
}
作為Eureka Server要在啟動類上加
@EnableEurekaServer
注解。
這樣Eureka Server就完成了,運作啟動類,通路
http://localhost:8761/
,可以看到如下畫面:
再來建立Eureka Client。
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>
<groupId>com.kaven</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.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.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
</project>
application.yml
如下:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-client
server:
port: 8080
啟動類:
package com.kaven.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
作為Eureka Client要在啟動類上加
@EnableDiscoveryClient
注解。
再運作Eureka Client的啟動類,再等一小會就可以看到如下畫面:
再将Eureka Server的配置檔案
application.yml
修改一下:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
register-with-eureka: false
server:
enable-self-preservation: true
spring:
application:
name: eureka
server:
port: 8761
就是将
enable-self-preservation
設定為
true
,之前說過要示範一下這個配置。
再去看一下界面,警告是不是沒有了。
我們停止Eureka Client,再等一段時間。
Eureka Server進入自我保護模式,并且發出警告了,但Eureka Client并沒有被删除(不管多久)。
Eureka Server和Eureka Client之間每隔30秒會進行一次心跳通信,以便告訴Eureka Server,這個Eureka Client還活着。
當Eureka Server在短時間内丢失了過多Eureka Client的連接配接時(比如網絡故障或頻繁的啟動關閉Eureka Client),那麼Eureka Server就會進入自我保護模式,一旦進入到該模式,Eureka Server就會保護服務系統資料庫中的資訊,不再删除服務系統資料庫中的資料(即不會登出任何微服務),當網絡故障恢複後,該Ereaka Server就會自動退出自我保護模式。
關閉自我保護模式後(
enable-self-preservation
為
false
),如果Ereaka Server在一段時間内沒有接受到某個微服務(Eureka Client)的心跳,便會登出該執行個體(預設90秒),而一旦進入自我保護模式,那麼即使你關閉了某個微服務,仍然會發現Ereaka Server的注冊執行個體中會存在被關閉的微服務。
enable-self-preservation
為
false
時,關閉Eureka Client後一段時間,Eureka Client會被Ereaka Server登出,如下圖: