Spring Cloud系列教程(一):服务的注册与发现Eureka(Finchley版本)

一、前言

众所周知,SpringCloud是一系列框架的有序集合,在基于SpringBoot基础设施框架之上,巧妙的统一了一套完整的微服务解决方案全家桶,其组建如服务发现注册eureka配置中心Config消息总线Bus负载均衡Ribbon断路器Hystrix服务网关Zuul、、数据监控Actuator等一系列组件,那么Eureka组件就是其中的一个。EurekaNetflix公司开源的一个RESTful服务框架组件,主要用于服务的注册发现等服务治理,被SpringCloud所整合,形成一个巨大的SpringCloud微服务生态圈。

二、什么是Eureka

1. Eureka介绍

EurekaSpringCloud微服务解决方案框架中的一个组件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版本)

 

SpringCloud教程汇总: Spring Cloud系列教程(汇总篇):专栏汇总篇(持续更新中)

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章