zoukankan      html  css  js  c++  java
  • SpringCloud学习总结(五)——服务注册中心Eureka高级

    案例准备

    用例spring_cloud_eureka 项目地址:传送门

     

    一、Eureka Server 高可用集群

    在上一个章节,实现了单节点的Eureka Server的服务注册与服务发现功能。Eureka Client会定时连接Eureka Server,获取注册表中的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。但如果EurekaServer宕机时,某些微服务也出现了不可用的情况,Eureka Server中的缓存若不被刷新,就可能会影响到微服务的调用,甚至影响到整个应用系统的高可用。因此,在生成环境中,通常会部署一个高可用的Eureka Server集群。

    Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server的默认行为。

     

     

    1、准备2个EurekaServer,需要相互注册

    1号EurekaServer:9000

    2号EurekaServer:8000

    1.1 EurekaServer项目的yml配置

     

    #-----集群部署-------
    #模拟两个EurekaServer
    #端口9000 , 8000
    #两个server需要相互注册
    spring:
      application:
        name: eureka-server
    ---
    #执行eureka1 server9000 的配置信息
    spring:
      profiles: eureka1
    server:
      port: 9000 #端口
    #配置eureka server
    eureka:
      client:
        #register-with-eureka: false #是否将自己注册到注册中心 默认true
        #fetch-registry: false #是否从eureka中获取注册信息 默认true
        service-url: #配置暴露给Eureka Client的请求地址
          defaultZone: http://127.0.0.1:8000/eureka/
    ---
    #执行eureka2 server8000 的配置信息
    spring:
      profiles: eureka2
    server:
      port: 8000 #端口
    #配置eureka server
    eureka:
      client:
        #register-with-eureka: false #是否将自己注册到注册中心 默认true
        #fetch-registry: false #是否从eureka中获取注册信息 默认true
        service-url: #配置暴露给Eureka Client的请求地址
          defaultZone: http://127.0.0.1:9000/eureka/

    在配置文件中通过连字符(---)将文件分为三个部分,第一部分为应用名称,第二部分和第三部分是根据不同的profiles选项动态添加,可以在IDEA启动时进行激活配置

     

    1.2 用IDEA模拟两个Eureka服务运行,添加eureka1、eureka2两个启动配置如下:

    启动集群:

     

    EurekaServer:9000

    EurekaServer:8000

    注意:

    此时订单、商品服务只配置了EurekaServer:9090的服务信息,但是在EurekaServer:8000中也能看到这两个服务。说明说两个EurekaServer服务集群部署后,注册信息是相互同步的。

     

    2、服务注册到Eureka Server集群

    订单与商品的yml配置,defaultZone添加EurekaServer:8000配置

    #配置Eureka
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ #多个eurekaserver之间用,隔开
      instance:
        prefer-ip-address: true #使用ip地址注册

    二、常见问题

    1、监控页面显示ip

    在Eureka Server的管控台中,显示的服务实例名称默认情况下是微服务定义的名称和端口。为了更好的对所有服务进行定位,微服务注册到Eureka Server的时候可以手动配置示例ID。以spring.cloud.client.ip-address显示服务IP,配置方式如下

    #配置Eureka
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ #多个eurekaserver之间用,隔开
      instance:
        prefer-ip-address: true #使用ip地址注册
        instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心中注册服务id

     

    2、服务节点剔除问题

    默认情况下,由于Eureka Server剔除失效服务间隔时间为90s且存在自我保护的机制。所以不能有效而迅速的剔除失效节点,这对开发或测试会造成困扰。解决方案如下:

    Eureka Client

    配置开启健康检查,并设置续约时间

    #配置Eureka
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ #多个eurekaserver之间用,隔开
      instance:
        prefer-ip-address: true #使用ip地址注册
        instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心中注册服务id
        lease-renewal-interval-in-seconds: 5 #向注册中心发送心跳的续约间隔时间5s
        lease-expiration-duration-in-seconds: 10 #eureka client发送心跳给server端后,续约到期时间(默认90秒)

    3、关闭自我保护

    微服务第一次注册成功之后,每30秒会发送一次心跳将服务的实例信息注册到注册中心。通知 EurekaServer 该实例仍然存在。如果超过90秒没有发送更新,则服务器将从注册信息中将此服务移除。

    Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。

    保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。 一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务);当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

    验证完自我保护机制开启后,并不会马上呈现到web上,而是默认需等待 5 分钟(可以通过eureka.server.wait-time-in-ms-when-sync-empty 配置),即 5 分钟后你会看到下面的提示信息:

     

    Eureka Server: 配置关闭自我保护,设置剔除无效节点的时间间隔

    #配置eureka server
    eureka:
      instance:
        hostname: localhost
      client:
        register-with-eureka: false #是否将自己注册到注册中心
        fetch-registry: false #是否从eureka中获取注册信息
        service-url: #配置暴露给Eureka Client的请求地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      server:
        enable-self-preservation: false #关闭自我保护
        eviction-interval-timer-in-ms: 4000 #剔除时间间隔,单位:毫秒

     

    三、Eureka源码解析

    //TODO 待补充


    感谢itheima提供的材料

  • 相关阅读:
    【LeetCode】1404. 将二进制表示减到 1 的步骤数
    【剑指Offer】面试题12. 矩阵中的路径(DFS)
    【LeetCode】994. 腐烂的橘子(BFS)
    【LeetCode】365. 水壶问题(BFS/裴蜀定理)
    【LeetCode】169. 多数元素(摩尔投票法)
    ASP.NET页面间传值
    SQL——基础概念
    SQL——登陆触发器实现限制IP
    SQL Server之null
    SQL Server服务器连接配置
  • 原文地址:https://www.cnblogs.com/TvvT-kevin/p/12513057.html
Copyright © 2011-2022 走看看