Spring Cloud与微服务之注册中心Eureka

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZZY1078689276/article/details/84963159

Eureka

  SpringCloud提供了多种注册中心的支持,如:Eureka、ZooKeeper等。推荐使用Eureka。

Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册于发现。

  Eureka包含两个组件:

  • Eureka Service
  • Eureka Client。

Eureka Service

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

  默认情况下,如果Eureka Server在一定时间内没有接收到某个微服实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身是健康的,此时本不应该注销掉这个微服务。

  Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

  禁用自我保护模式:

enable-self-preservation: false #禁用自我保护模式

  不过一般还是使用吧,所以说上面的代码就不用添加了。

Eureka Client

  是一个Java客户端,用于简化Eureka Server的交互,客户端同时也就别一个内置的,使用轮询(round-robln)负载算法的负载均衡器。

  在应用启动后,将会向Eureka Server发送心跳默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Service将会从服务注册表中把这个服务节点移除(默认90秒)。

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

微服务注册与发现

  微服务注册与发现机制是这样的:

1、服务提供者将服务注册到注册中心。
2、服务消费者通过注册中心查找服务。
3、查找到服务后进行调用(这里就是无需硬编码url的解决方案)
4、服务的消费者与服务中心保持心跳连接,一旦服务提供者的地址发生变更时,注册中心会通知服务消费者。

Eureka注册中心源码

  由于Eureka注册中心支持集群架构,这样可以防止一个Eureka服务挂掉后,整个注册中心不能使用,因为这样可以在生产环境中避免出现单点故障,确保Eureka服务的高可用性。

  所以说这里直接创建两个Eureka注册中来模拟Eureka集群注册中心中相互在对方注册服务的情况。

springcloud-eureka注册中心

springcloud-eureka项目结构

在这里插入图片描述

  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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-eureka</artifactId>
    <packaging>jar</packaging>

    <name>SpringCloud微服务::Eureka服务1</name>
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--导入SpringCloud的依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--导入Eureka服务的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!--安全认证-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
    </build>

</project>

  EurekaServer源码:

package com.lyc;

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

@EnableEurekaServer   //申明这是一个Eureka服务
@SpringBootApplication
public class EurekaServer {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServer.class,args);
    }
}

  application.yml源码:

server:
  port: 6868  #服务端口

spring:
  application:
    name: springcloud-eureka #指定服务名

eureka:
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,本身就是所有无需注册
    fetchRegistry: true #是否从Eureka中获取注册信息
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://root:[email protected]:6869/eureka/

security:
    basic:
        enable: true  #开启基于HTTP basic的认证
    user:  #配置用户的账户信息
      name: root
      password: root123

springcloud-eureka2注册中心

springcloud-eureka2项目结构

在这里插入图片描述

  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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-eureka2</artifactId>

    <name>SpringCloud微服务::Eureka服务2</name>
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--导入SpringCloud的依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--导入Eureka服务的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!--安全认证-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
    </build>

</project>

  EurekaServer2源码:

package com.lyc;

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

@EnableEurekaServer   //申明这是一个Eureka服务
@SpringBootApplication
public class EurekaServer2 {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServer2.class,args);
    }
}

  application.yml源码:

server:
  port: 6869  #服务端口

spring:
  application:
    name: springcloud-eureka2 #指定服务名

eureka:
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,本身就是所有无需注册
    fetchRegistry: true #是否从Eureka中获取注册信息
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://root:[email protected]:6868/eureka/

security:
    basic:
        enable: true  #开启基于HTTP basic的认证
    user:  #配置用户的账户信息
      name: root
      password: root123

项目的运行与分析

  运行启动类EurekaServer与EurekaServer2分别启动两个注册中心。

  在SpringCloud中,其默认的配置文件为.yml格式,在这里,我们的是application.yml,该文件的书写格式与.properties类似,但是是其书写格式的简化版。

  比如说在.properties文件中,如果我们要指定端口号,我们可以这样写:

server.port=6868

  但是在SpringCloud的application.yml我们则简化为:

server:
  port: 6868  #服务端口

  其中key与value之间有一个空格的距离,而根节点的每一个子节点都会往后缩进两个字符,比如说port就在server的基础上缩进了两个字符间距,如果port后面还有子节点,则其子节点继续在port的基础上继续缩进两个字符间距。

  通过上面分析,我们得知springcloud-eureka的端口号就是在application.yml文件中指定的,其端口号为6868,所以说我们可以在浏览器中直接访问该注册中心,注册中心的访问地址为:

http://127.0.0.1:6868/

  其访问的结果如下所示:

在这里插入图片描述

  上面的登录是通过配置文件的下面代码来指定的,其中enable: true用于开启基于HTTP basic的认证,而user则用于配置用户的账户信息。

security:
    basic:
        enable: true  #开启基于HTTP basic的认证
    user:  #配置用户的账户信息
      name: root
      password: root123

  我们直接输入自己自定义的账号与密码后就成功的登录到了注册中心。

在这里插入图片描述

  在上图中如图所示的箭头指出了在当前注册中心中所注册的服务。

  在下面的代码中 registerWithEureka: true指的是将自己的服务注册到Eureka注册中心,而fetchRegistry: true则是指明,我们可以从注册中心中获取所注册的服务项,最后defaultZone则是指明了注册中心的注册地址以及登录的账号与密码。

eureka:
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,本身就是所有无需注册
    fetchRegistry: true #是否从Eureka中获取注册信息
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://root:[email protected]:6869/eureka/

  同理在springcloud-eureka2中,我们也有类似的配置

eureka:
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,本身就是所有无需注册
    fetchRegistry: true #是否从Eureka中获取注册信息
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://root:[email protected]:6868/eureka/

  这里的配置就是将springcloud-eureka2注册中心注册到springcloud-eureka中。

  由于上面的配置,我们的注册中心springcloud-eureka与springcloud-eureka2就实现了彼此间的相互注册,可以共享注册服务信息,这样我们就实现了注册中心的集群配置。

猜你喜欢

转载自blog.csdn.net/ZZY1078689276/article/details/84963159