Spring Cloud之服务治理——Spring Cloud Eureka

[TOC]

前言

服务治理是微服务架构中最为核心和基础都模块,主要用来实现微服务实例服务注册与发现。目前比较流行充当服务注册与发现方案有ZooKeeperConsulEureka

Eureka介绍

Eureka是一个基于REST(Representational State Transfer)的服务,主要用于AWS cloud,提供服务定位(locating services)、负载均衡(load balancing)、故障转移(failover of middle-tier servers)的服务套件(Eureka Server)。Eureka也提供基于Java的客户端——Eureka-Client。Eurka-Client内置负载均衡。Spring Cloud Eureka使用Netflix Eureka来实现服务注册与发现,它包含服务端及客户端组件(均Java编写)。

Eureka服务端

Eureka服务端也称为服务注册中心。它与其它(Zookeeper、Consul)一样支持高可用配置。如果Eureka以集群模式部署,当集群中有分片发生故障时,Eureka会转入自我保护模式。它允许分片故障期间继续提供服务注册与发现,当故障分片恢复后,集群中的其它分片会把它们的状态同步回来。

Eureka客户端

Eureka客户端主要处理服务注册与发现。客户端通过注解和参数配置都方式,嵌入微服务应用中。在应用运行时,Eureka客户端向注册中心注册自身提供都服务并周期性发送心跳来更新服务租约。同时也从服务端(注册中心)查询当前的服务注册信息缓存到本地并周期性刷新服务状态。

Spring Cloud Eureka

搭建服务注册中心

  1. 创建一个maven项目,pom配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?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.github</groupId>
<artifactId>spring-cloud-learning</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>eureka-server</module>
</modules>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>

<description>
Spring Cloud学习
</description>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
  1. 在该maven项目下新建一个maven模块eureka-server,pom配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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">
<parent>
<artifactId>spring-cloud-learning</artifactId>
<groupId>com.github</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>eureka-server</artifactId>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
  1. 新建启动类EurekaServerApplication
1
2
3
4
5
6
7
8
9
10
11
12

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}
}
  1. 添加配置文件application.yaml或application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
port: 1111

spring:
application:
name: eureka-server

eureka:
instance:
hostname: localhost
server:
# 是否开启自我保护机制
enable-self-preservation: false
client:
# 不向注册中心注册自己
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

logging:
file: logs/${spring.application.name}.log
level: debug
  1. 运行应用访问http://localhost:1111。如无意外可以正常访问,由于没有注册任何服务,Instances current registered with Eureka栏是空的。

高可用注册中心

Eureka Server在设计之初就考虑到了高可用,在Eureka的服务治理设计中,所有都节点即是服务提供方,也是服务消费方,服务注册中心也不例外。回顾上一节的两个配置参数

1
2
3
4
5
eureka:
client:
# 不向注册中心注册自己
register-with-eureka: false
fetch-registry: false

Eureka Server的高可用实际上就是向其它注册中心注册自己,从而形成一组相互注册都服务注册中心,以实现服务清单都相互同步,达到高可用的效果。

  • 将上一节中的配置文件去掉上述两个参数后复制两份分别命名为application-server1.yaml和application-server2.yaml

  • 将application-2.yaml都端口改为1112

  • 将两个配置文件中defaultZone配置项中的${server.port}分别改成对方的端口,即1111中都配1112,1112中的配1111

  • 指定配置文件启动

    1
    2
    java -jar eureka-server-1.0-SNAPSHOT.jar --spring.profiles.active=server1
    java -jar eureka-server-1.0-SNAPSHOT.jar --spring.profiles.active=server2
  • 分别访问两个端口,可以看到Instances current registered with Eureka栏分别有对方都信息

Spring Cloud Eureka常用配置

服务端常用配置

参数 默认值 说明
eureka.server.enable-self-preservation false 关闭注册中心的保护机制,Eureka 会统计15分钟之内心跳失败的比例低于85%将会触发保护机制,不剔除服务提供者,如果关闭服务注册中心将不可用的实例正确剔除

服务实例配置

参数 默认值 说明
eureka.instance.prefer-ip-address false 不使用主机名来定义注册中心的地址,而使用IP地址的形式,如果设置了
eureka.instance.ip-address IP地址
eureka.instance.hostname 设置当前实例主机名称
eureka.instance.appname ${spring.application.name} 服务名,默认取 spring.application.name 配置值, 如果没有则为 unknown
eureka.instance.lease-renewal-interval-in-seconds 30 定义服务续约任务(心跳)的调用间隔,单位:秒
eureka.instance.lease-expiration-duration-in-seconds 90 服务失效的时间,单位:秒
eureka.instance.status-page-url-path /info 状态页面的URL,相对路径。默认使用 HTTP 访问,如果需要使用 HTTPS则需要使用绝对路径配置
eureka.instance.status-page-url 状态页面的URL,绝对路径
eureka.instance.health-check-url-path /health 健康检查页面都URL,相对路径。 默认使用 HTTP 访问,如果需要使用 HTTPS则需要使用绝对路径配置
eureka.instance.health-check-url 健康检查页面都URL,绝对路径

客户端常用配置

参数 默认值 说明
eureka.client.service-url. 指定服务注册中心地址,类型为 HashMap,并设置有一组默认值,默认的Key为 defaultZone;默认的Value为 http://localhost:8761/eureka ,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。如果服务注册中心加入了安全验证,这里配置的地址格式为:http://:@localhost:8761/eureka 其中 为安全校验的用户名; 为该用户的密码
eureka.client.fetch-registery true 检索服务
eureka.client.registery-fetch-interval-seconds 30 从Eureka服务器端获取注册信息的间隔时间,单位:秒
eureka.client.register-with-eureka true 启用eureka服务注册
eureka.client.eureka-server-connect-timeout-seconds 5 连接 Eureka Server 的超时时间,单位:秒
eureka.client.eureka-server-read-timeout-seconds 8 读取 Eureka Server 信息的超时时间,单位:秒
eureka.client.filter-only-up-instances true 获取实例时是否过滤,只保留UP状态的实例
eureka.client.eureka-connection-idle-timeout-seconds 30 Eureka 服务端连接空闲关闭时间,单位:秒
eureka.client.eureka-server-total-connections 200 从Eureka 客户端到所有Eureka服务端的连接总数
eureka.client.eureka-server-total-connections-per-host 50 从Eureka客户端到每个Eureka服务主机的连接总数
-------------本文结束感谢您的阅读-------------