一、前言
众所周知,SpringCloud是一系列框架的有序集合,在基于SpringBoot基础设施框架之上,巧妙的统一了一套完整的微服务解决方案全家桶,其组建如服务发现注册eureka、配置中心Config、消息总线Bus、负载均衡Ribbon、断路器Hystrix、服务网关Zuul、、数据监控Actuator等一系列组件,那么Eureka组件就是其中的一个。Eureka是Netflix公司开源的一个RESTful服务框架组件,主要用于服务的注册发现等服务治理,被SpringCloud所整合,形成一个巨大的SpringCloud微服务生态圈。
二、什么是Eureka
1. Eureka介绍
Eureka是SpringCloud微服务解决方案框架中的一个组件Eureka注册中心, 由Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件,
它主要包括两个组件: Eureka Server 和 Eureka Client
- Eureka Client:一个Java客户端,用于简化与 Eureka Server 的交互(通常就是微服务中的客户端和服务端)
- Eureka Server:提供服务注册和发现的能力(通常就是微服务中的注册中心)
2. Eureka特点
在各个微服务启动时,会通过 Eureka Client 向 Eureka Server 注册自己,Eureka Server 会存储该服务的信息
也就是说,每个微服务的客户端和服务端,都会注册到 Eureka Server,这就衍生出了微服务相互识别的话题
- 同步:每个 Eureka Server 同时也是 Eureka Client(逻辑上的)
多个 Eureka Server 之间通过复制的方式完成服务注册表的同步,形成 Eureka 的高可用 - 识别:Eureka Client 会缓存 Eureka Server 中的信息
即使所有 Eureka Server 节点都宕掉,服务消费者仍可使用缓存中的信息找到服务提供者 - 续约:微服务会周期性(默认30s)地向 Eureka Server 发送心跳以Renew(续约)信息(类似于heartbeat)
- 续期:Eureka Server 会定期(默认60s)执行一次失效服务检测功能
它会检查超过一定时间(默认90s)没有Renew的微服务,发现则会注销该微服务节点,这个称作Eureka保护机制
三、理解服务的注册与发现Eureka
在这里,我们需要用Spring Cloud Netflix的组件Eureka ,Eureka是一个服务注册和发现模块。图解说明
四、环境要求
1. 开发工具: IDEA2018.2.3
2. SpringBoot版本: 2.0.3.RELEASE
3. SpringCloud版本:Finchley.RELEASE
声明: 本SpringCloud系列专栏教程全部基于SpringBoot2.0.3.RELEASE和SpringCloud Finchley.RELEASE这两个版本进行开发、测试以及写文章,工具使用IDEA,建议使用IDEA2018以上版本即可,后面的文章不再做陈述;
五、SpringBoot与SpringCloud版本对应关系选择
1. 打开SpringCloud官网链接:https://spring.io/projects/spring-cloud#overview
从官网介绍说明可以看出,SpringCloud版本命名是以火车(Train)方式命名,SpringBoot版本则以数字命令,其两者对应关系如下图:
注意: SpringCloudFinchley系列版本对应SpringBoot2.0.x系列版本
对于SpringBoot版本和SpringCloud版本关系不太清楚的可以阅读以下资料了解下,这里我贴出文章的链接:
https://blog.csdn.net/qq_37143673/article/details/99292705
https://www.jianshu.com/p/352511faab90
https://www.cnblogs.com/zhuwenjoyce/p/10261079.html
五、搭建Eureka注册中心,实现服务注册
为了方便解耦,每篇博客对应每个章节的源码,每个章节的项目以SpringCloud+组件名称组合,例如:springcloud-eureka这种形式吗,因此采用Maven子父工程的形式,后续文章也是如何,只在这里做一下说明,后续不再重复。
5.1、创建项目
第一步: 创建父项目springcloud-eureka,创建过程中不需要勾选任何依赖,创建完之后修改package类型为pom
第二步: 在父工程的基础上创建一个Module,也就是新增一个子项目,这里叫做springcloud-eureka-server,作为Eureka注册中心服务
第三步: 删掉父工程pom文件多余的信息后,父工程pom文件信息以及子父工程项目结构如下图
5.2、springcloud-eureka-server项目中pom引入以下依赖
<?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.thinkingcao.api</groupId>
<artifactId>springcloud-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-server</name>
<description>SpringCloud整合Eureka组件搭建微服务注册中心</description>
<!--SpringBoot依赖版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<!--项目编码、jdk版本、SpringCloud版本定义-->
<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.RELEASE</spring-cloud.version>
</properties>
<!--声明管理SpringCloud版本依赖信息-->
<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>
<!--依赖信息-->
<dependencies>
<!--springcloud eureka组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--maven插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.3、配置application.yml
#服务端口号
server:
port: 8000
#定义服务名称(服务注册到eureka名称)
spring:
application:
name: app-thinkingcao-eureka
eureka:
instance:
#Eureka注册中心ip地址
hostname: 127.0.0.1
client:
serviceUrl:
#注册地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#表示是否需要将自己注册给自己的注册中心,因为自己是注册中心,单机版本时不需要,设置为false(集群的时候需要是为true)
register-with-eureka: false
#因为自己是注册中心,不需要去检索服务信息,单机版本时不需要,设置为false(集群的时候需要是为true)
fetch-registry: false
结论:
Eureka Client 在启动时需要指定 Zone,它会优先请求自己 Zone 的 Eureka Server 获取注册列表
同样的,Eureka Server 在启动时也需要指定 Zone,如果没有指定的话,其会默认使用 defaultZone;
关于defaultZone、Zone与serviceUrl三者之间的关系,可以查阅文档了解;
5.4 、启动EurekaServer
启动Eureka注册中心只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类上加即可
package com.thinkingcao.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class AppEurekaServer {
public static void main(String[] args) {
SpringApplication.run(AppEurekaServer.class, args);
}
}
5.5 访问eureka server注册中心界面
打开eureka server 界面,查看注册中心,访问地址 : http://127.0.0.1:8000/ ,因为此时springcloud-eureka-server单纯的只是一个服务注册中心,无任何实例进行服务注册,所以服务注册列表显示的没有任何实例;
当启动Eureka Server时, 因为是单机版,还没有Eureka Client,过一段时间会出现 红色字段:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE
UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND
HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
这说明Eureka进入保护模式,可通过配置去掉,关于保护模式,后面章节会有专题讲到:
##心跳检测与续约时间(测试环境和本地开发环境将值设置小一点,保证服务关闭后,注册中心能够及时踢出)
instance:
#客户端向Eureka注册中心发送心跳的时间间隔,单位为秒(默认为30s),(客户端会按照此规则向Eureka服务端发送心跳检测包)
lease-renewal-interval-in-seconds: 2
#Eureka注册中心在收到客户端最后一次心跳之后等待的时间上限,单位为秒(默认为90s),超过时间则剔除(客户端会按照此规则向Eureka服务端发送心跳检测包)
lease-expiration-duration-in-seconds: 2
六、源码
1. 项目源码: https://github.com/Thinkingcao/SpringCloudLearning/tree/master/springcloud-eureka
七、SpringCloud 系列教程
1.下节任务:以订单服务调用会员服务为例子,学习服务提供和服务消费
2. SpringCloud系列教程(二): Spring Cloud系列教程(二) - 服务提供者和服务消费者Rest+Ribbon(Finchley版本)