• Eureka服务注册与发现


    一、基础知识

    1、服务治理

    ​ 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。SpringCloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。

    2、服务注册与发现

    ​ Eureka 采用了 CS 的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server 并维持心跳连接。这样系统的维护人员就可以通过 Erueka Server 来监控系统中各个微服务是否正常运行。

    ​ 在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息(如服务地址、通讯地址等)以别名方式注册到注册中心上。另一方(消费者、服务提供者)以该别名的方式去注册中心上获取到实际的服务通讯地址,然后在实现本地RPC调用。RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息)。Eureka 系统架构如下:

    执行说明:

    ​ 1)、先启动 Eureka 注册中心;

    ​ 2)、启动服务提供者 ;

    ​ 3)、服务提供者启动后把自己的信息(如服务地址)以别名方式注入 Eureka;

    ​ 4)、消费者服务在需要调用接口时使用服务别名去注册中心获取实际的RPC调用地址;

    ​ 5)、消费者获得调用地址后,底层实际是使用的 HttpClient 技术实现远程调用;

    ​ 6)、消费者获得服务地址后会缓存在本地 jvm 内存中,默认每间隔30秒更新一次服务调用地址。

    3、组件:Eureka Server 和 Eureka Client

    • Eureka Server 提供服务注册服务

      各个微服务结点通过配置启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面找那个直观看到。

    • Eureka Client 通过注册中心进行访问

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

    二、单机版服务搭建

    1、Eureka Server 搭建

    • 创建一个maven项目在pom中添加一下内容

      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
      
    • 创建 application.yml 文件

      server:
        port: 7001
      
      eureka:
        instance:
          hostname: localhost  #eureka服务端实例名称
        client:
          #false表示不向注册中心注册自己
          register-with-eureka: false
          #false表示自己端就是注册中心,自己职责是维护服务实例,不需要去检索服务
          fetch-registry: false
          service-url:
            #设置与eureka server 交互的地址查询服务和注册服务都需要依赖这个地址
            defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      
      
    • 在主启动类上加注解 @EnableEurekaServer 开启服务

    • 启动项目,在浏览器看到如下界面边配置成功

    2、Eureka Client 配置

    • 修改客户端的pom文件,引入依赖

      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
      
    • 在application.yml中添加配置

      eureka:
        client:
          #是否从Eureka server 抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
          fetch-registry: true
          #表示是否将自己注册进入Eureka server ,默认为true
          register-with-eureka: true
          service-url:
            defaultZone: http://localhost:7001/eureka
      
    • 在主启动类加注解 @EnableEurekaClient

    • 启动客户端,便可以看到 Eureka 注册有客户端,如下图

    三、高可用集群搭建

    1、集群概念

    ​ 单机版的 Eureka 只有一个服务,如果这个服务挂掉了那整个系统就挂了。Eureka 集群就是使用多个 Eureka Server服务之间相互注册,以实现高可用的目的。

    2、Eureka Server 搭建步骤

    • 建立多个 Eureka Server服务模块(这里建立两个);

    • 在pom中分别引入依赖

      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
      
    • 配置第一个 Eureka 服务(eureka7001.com:7001)的 application.xml

      server:
        port: 7001
      
      eureka:
        instance:
          hostname: eureka7001.com  #eureka服务端实例名称
        client:
          #false表示不向注册中心注册自己
          register-with-eureka: false
          #false表示自己端就是注册中心,自己职责是维护服务实例,不需要去检索服务
          fetch-registry: false
          service-url:
            #设置与eureka server 交互的地址查询服务和注册服务都需要依赖这个地址
            #单机版地址设置自己,集群设置为其他 eureka server
            defaultZone: http://eureka7002.com:7002/eureka/
      
    • 配置第二个 Eureka 服务(eureka7002.com:7002)的 application.xml

      server:
        port: 7002
      
      eureka:
        instance:
          hostname: eureka7002.com  #eureka服务端实例名称
        client:
          #false表示不向注册中心注册自己
          register-with-eureka: false
          #false表示自己端就是注册中心,自己职责是维护服务实例,不需要去检索服务
          fetch-registry: false
          service-url:
            #设置与eureka server 交互的地址查询服务和注册服务都需要依赖这个地址
            #单机版地址设置自己,集群设置为其他 eureka server
            defaultZone: http://eureka7001.com:7001/eureka/
      
    • 启动服务,成功结果如下图显示

    3、将服务提供者与消费者注册

    ​ 在 application.xml 中加入 Eureka 的配置,多个地址使用逗号隔开,如下:

    eureka:
      client:
        #是否从Eureka server 抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        #表示是否将自己注册进入Eureka server ,默认为true
        register-with-eureka: true
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
    

    4、服务提供者集群处理

    ​ 将多个服务提供者注册到 Eureka Server 中,,因为一个别名下可能对应着多个服务的地址。如下图:

    所以在消费者端配置请求的地址为服务注册的别名如public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";,然后在配置类中添加注解 @LoadBalanced 开启负载均衡功能(默认使用轮询)。

    四、其他配置完善

    1、配置服务名称,不显示主机名称以及ip地址提示

    在 application.xml 文件中添加以下配置信息:

    instance:
        #配置服务名称,不显示主机名称
        instance-id: payment8002
        #ip地址提示
        prefer-ip-address: true
    

    显示效果如下:

    五、Eureka 自我保护模式

    1、首页出现如下图所示文字,Eureka便进入到了自我保护模式:

    ​ 保护模式主要用于一组客户端和 Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式 ,Eureka Server 将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务,即某时刻某一个微服务不可用了,Eureka 不会立刻清理,依旧会对该微服务的信息进行保存。

    2、原因

    ​ 为了保证 Eureka Client 与 Eureka Server 网络不通的情况下, Eureka Server 不会立刻将 Eureka Client 服务剔除。

    3、描述

    ​ 默认情况下,如果 Eureka Server 在一定时间内没有接收到某个微服务实例的心跳, Eureka Server 将会注销该实例(默认时间为90秒)。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,以上行为可能变得非常危险——因为微服务本身是健康的,此时不应该注销这个微服务。Eureka 通过"自我保护模式"来解决这个问题——当 Eureka Server 节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。

    4、禁止自我保护

    ​ 在 Eureka Server 的 application.xml 加上配置

    server:
        #关闭自我保护模式,保证不可用服务可以被及时剔除
        enable-self-preservation: false
    

    案例代码地址:https://github.com/xhanglog/springcloud-learning

  • 相关阅读:
    java struts2入门学习实例--用户注册
    java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器
    struts2基本配置详解2
    struts2基本配置详解
    使用maven+eclipse搭建最简单的struts2的HelloWorld
    2013年总结
    linux shell 脚本攻略学习20--awk命令入门详解
    linux shell 脚本攻略学习19--sed命令详解
    linux shell 脚本攻略学习18--grep命令详解
    linux shell 脚本攻略学习17--正则表达式入门
  • 原文地址:https://www.cnblogs.com/Mhang/p/12535619.html
Copyright © 2020-2023  润新知