SpringCloud之Eureka注册中心原理及其搭建

前言

Spring Cloud是一系列框架的有序集合。Spring Cloud关注全局的服务治理框架,它利用Spring Boot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册,配置中心,消息总线,负载均衡,熔断器,数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟,经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单,易部署和易维护的分布式系统开发工具包。

我们都知道,Eureka是属于Spring Cloud众多框架之一,那Spring Cloud中除了Eureka还有哪些主要框架呢?

  • 服务发现——Netflix Eureka
  • 服务调用——Netflix Feign
  • 熔断器——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config
  • 消息总线——Spring Cloud Bus

Eureka简介

Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server 和Eureka Client。

(1) Eureka Server
Eureka Server 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

(2) Eureka Client
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也是一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向Eureka Server 发送心跳,默认周期为30秒,如果Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server之间通过复制的方式完成数据同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。也就是说,Eureka通过心跳检查,客户端缓存等机制,确保了系统的高可用性,灵活性和扩展性。

软件环境

  • Windows 10
  • JDK1.8
  • IDEA 2019.3
  • Spring Boot 2.0.1.RELEASE
  • Spring Cloud Finchley.SR2

Eureka服务端开发

1、新建一个project叫tensquare_parent52,在project中创建一个maven模块名字叫 tensquare_eureka
2、引入依赖,父工程 tensquare_parent52 的 pom.xml 中定义SpringCloud版本(spring-cloud-dependencies版本为Finchley.SR2)

<?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.tensquare</groupId>
    <artifactId>tensquare_parent52</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>tensquare_base</module>
        <module>tensquare_qa</module>
        <module>tensquare_eureka</module>
    </modules>
    <packaging>pom</packaging>

    <name>tensquare_parent</name>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.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>
    </properties>

<!--    spring cloud eureka -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <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>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>
    </dependencies>
</project>

tensquare_eureka模块中的pom.xml引入 eureka-server的依赖

   <?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>tensquare_parent52</artifactId>
        <groupId>com.tensquare</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tensquare</groupId>
    <artifactId>tensquare_eureka</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

3、添加application.yml文件

server:
  port: 6868
eureka:
  client:
    register-with-eureka: false  #不需要把当前服务注册到eureka上,所以配置为false
    fetch-registry: false # 是否从Eureka中获取注册信息
    service-url:
      defaultZone: http://127.0.0.1:${server.port}/eureka/

4、tensquare_eureka 模块的启动类添加注解

 @EnableEurekaServer

在这里插入图片描述

5、启动运行 tensquare_eureka 模块,然后在浏览器地址输入 http://localhost:6868/
,运行结果如下:

在这里插入图片描述

服务注册

在project中再新建两个maven模块,叫做test1和test2。现在将test1和test2这两个模块都注册到Eureka中,这样这两个模块(或叫微服务)之间就可以互相调用了。
1、将微服务模块添加依赖

      <dependency>
		  <groupId>org.springframework.cloud</groupId>
		  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	  </dependency>

2、修改每个微服务模块的application.yml文件,添加注册eureka服务的配置

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka/  # 注册地址
  instance:
    prefer-ip-address: true # 模块之间可以跨域访问

3、修改每个微服务的启动类,添加注解

@EnableEurekaClient

4、启动测试:将每个微服务模块启动起来,会发现eureka的注册列表中可以看到这些微服务了。

保护模式

如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式:
在这里插入图片描述
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳 定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的 数据(也就是不会注销任何微服务)。

小结

其实Eureka的使用主要就是三个步骤:
1、添加依赖
2、在配置文件中添加eureka相关配置
3、启动类添加注解

发布了198 篇原创文章 · 获赞 245 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Sophia_0331/article/details/105752433