小言_互联网的博客

Spring Cloud Eureka 快速开始

345人阅读  评论(0)

一、Eureka简介

SPRING-CLOUD注册中心:EUREKA
参考URL: https://zhuanlan.zhihu.com/p/36492112

SpringCloud是基于springBoot的一整套实现微服务的框架.Eureka为springCloud架构中首选推荐的服务治理组件。

Eureka,古希腊词语,英文读音[juə’ri:kə],意思是“我找到了!我发现了!”。

Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息为消费者提供服务发现功能。不过,此时不再接受服务注册,因为Eureka Server已经全部挂掉了。这就是AP原则的体现。

Eureka在CAP理论中属于AP,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。

1. 注册中心的好处

  1. 实现客户端和服务端IP地址的解耦,避免对服务提供者IP硬编码。
  2. 实现服务端的动态扩容
  3. 多模块部署下,可监控各个服务运行状况

二、Eureka基本架构

  1. Register Service:服务注册中心,他是一个Eureka Service,提供服务注册和发现功能
  2. Provider Service:服务提供者,他是一个Eureka Client,提供服务
  3. Consumer Service:服务消费者,他是一个Eureka Client,消费服务

其实2、3 是一样的,都是Eureka Client,注册自己到Eureka Server。

三、原理

spring-cloud-eureka是spring-cloud-nettfix微服务套件中的一部分, 它基于nettfix-eureka做了二次封装,主要负责微服务架构中的服务治理功能。

服务治理一般都会有两个功能:服务注册、服务发现。通常会有一个注册中心,每个服务单元向注册中心登记自己信息,比如提供的服务,ip, 端口以及一些附加信息等。注册中心会将新的服务实例发送给其它依赖此服务的实例。

原理解析
eureka提供的EndPoint

  1. 注册服务 :POST /eureka/apps/appId
    服务启动时,向注册中心发起注册请求。申请向注册中心注册,最终由注册中心维护一个服务注册表

  2. 删除服务 :DELETE /eureka/apps/appId/instanceId

  3. 更新服务 :PUT /eureka/apps/appId/instanceId

  4. 服务发现 :GET /eureka/apps/appId
    消费者根据服务名称,向注册中心查找对应的IP:PORT列表
    ………

客户端和注册中心所有的交互都是根据endpoint来的。

Eureka的缓存

  1. 客户端拉去服务列表时,注册中心会从缓存中拿,并不是每次都去服务注册表中获取。默认30秒

  2. 客户端会缓存服务列表。默认30秒

  3. 负载均衡器Ribbon会缓存服务列表

四、搭建 eureka-server

参考URL: https://blog.csdn.net/sinat_38843093/article/details/80222277
Spring Cloud 基于Spring Boot 2.x的服务注册与发现(Eureka)
参考URL: https://blog.csdn.net/yy1098029419/article/details/80405345

  1. maven引入
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
  1. 配置application.yml
server:
  port: 8081
  context-path: /eureka-server
#  eureka server 启动时会创建一个定时任务,每隔一段时间(默认60s)将当前清单中超时(默认90s)没有续约的服务剔除出去
#  自我保护 :
#  在信息面板中可能会出现这样的红色警告 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的自我保护机制,服务注册到eureka server后会维护一个心跳连接.eureka server在运行期间,会统计心跳失败的比例在15分钟内是否低于85%.
#  如果低于,会将当前的实例注册信息保护起来,让这些实例不会过期.可以配置 eureka.server.enable-self-preservation=false 来关闭保护机制
#  关闭保护机制,信息面板中会显示 THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
eureka:
  server:
    enable-self-preservation: false
  instance:
#   hostname不配置的话,会根据操作系统的主机名来获取
    hostname: localhost
#    注册服务之后,服务提供者会维护一个心跳用来持续告诉eureka server服务正常,以防止eureka server的剔除任务将该服务实例从服务列表中排除出去,该操作称为服务续约
#    lease-renewal-interval-in-seconds: 30     定义服务续约任务的调用间隔时间(默认30s,官方不推荐修改)
#    lease-expiration-duration-in-seconds: 90  定义服务失效的时间(默认90s,官方不推荐修改)
  client:
#  在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为
#  配置register-with-eureka: false 和 fetch-registry: false 来表明自己是一个eureka server
    register-with-eureka: false
    fetch-registry: false
#  为了性能考虑,eureka server 会维护一份只读的服务清单返回给客户端,同时该缓存清单会每隔30s更新一次(可通过registry-fetch-interval-seconds进行修改)
#    registry-fetch-interval-seconds: 30
  1. 启动类加上 @EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

使用actuator监控,需要关闭权限验证,否则访问某些端点会报401
management.security.enabled=false

五、eureka-client 客户端

  1. maven引入
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
  1. 配置application.yml
server:
  port: 8082
  context-path: /eureka-client
eureka:
  client:
    service-url:
#     配置服务注册中心集群时,此处可以配置多个地址(通过逗号隔开)
      defaultZone: http://localhost:8081/eureka-server/eureka/
# spring.application.name,这个很重要,在以后的服务与服务之间相互调用一般都是根据这个name
spring:
  application:
    name: eureka-client
  1. 在启动类加上 @EnableEurekaClient 注解

六、eureka Server Self Preservation Mode(自我保护模式)

【推荐-作者写的比较全面】Eureka Server之注册实例自我保护机制
链接:https://www.jianshu.com/p/9cf099dd9d55
Eureka 自我保护模式、健康检查机制、Eureka 元数据
参考URL: https://blog.csdn.net/wangmx1993328/article/details/88565342

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

如果 Eureka Server 在 15 分钟内有超过 85% 的 Eureka Client 都没有正常的发送心跳过来(单机模式时尤为明显),那么 Eureka Server 就认为注册中心与客户端出现了网络故障,Eureka Server 自动进入自我保护机制。

这也就是为什么平时使用一个 Eureka Server 与一个 Eureka Client 时,即使手动关闭了 Eureka Client,但是 Eureka Server 主页中“Instances currently registered with Eureka”下面 status 栏仍然显示为 UP。

总结:当注册中心,某一时段内收不到大部分服务的心跳。会默认自身出了问题,并不会将这些服务踢出注册表

  1. 自我保护机制意义
    自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定

自我保护的原则是:宁可放过,不可杀错!自我保护模式是一种针对网络异常波动的安全保护措施,能使 Eureka 集群更加的健壮、稳定的运行。

七、Eureka高可用集群

SpringCloud实践(三) 高可用的Eureka注册中心
参考URL: https://blog.csdn.net/csolo/article/details/80540359?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

1. Eureka的高可用性

  1. 注册中心支持集群,某一节点宕机,其他节点继续对外服务。
  2. 自我保护策略,

2. 注册中心宕机,服务间能否正常通信?

可以,消费端会缓存服务端的IP:PORT,注册中心宕机,只是不能更新已经缓存的IP集合。所以还是可以通信的。但此时如果客户端宕机,客户端感知不到。由此也可以看出,注册中心只是服务注册和发现的作用,并不会干预服务间的调用。

3. Eureka Server到底要部署几台机器?

Eureka Server设计(转载 石杉的架构笔记)
参考URL: https://www.cnblogs.com/daiwei1981/p/10040272.html

推荐阅读原作者链接,作者分析了Eureka 原理。一句话概括:维护注册表、拉取注册表、更新心跳时间,全部发生在内存里!这是Eureka Server非常核心的一个点。

作者假设你一共部署了2000个服务实例。

每个服务实例内部都有一个Eureka Client组件,它会每隔30秒请求一次Eureka Server,拉取变化的注册表。

此外,每个服务实例上的Eureka Client都会每隔30秒发送一次心跳请求给Eureka Server。

那么大家算算,Eureka Server作为一个微服务注册中心,每秒钟要被请求多少次?一天要被请求多少次?

按标准的算法,每个服务实例每分钟请求2次拉取注册表,每分钟请求2次发送心跳

这样一个服务实例每分钟会请求4次,2000个服务实例每分钟请求8000次

换算到每秒,则是8000 / 60 = 133次左右,我们就大概估算为Eureka Server每秒会被请求150次

那一天的话,就是8000 * 60 * 24 = 1152万,也就是每天千万级访问量。

总结:根据作者描述,2000个服务实例,每天才是千万级访问量。Eureka 可以承受每天千万级的访问量。

个人总结: 感觉生产环境一般使用2台Eureka 做高可用即可。

八、参考

Eureka性能测试
参考URL: http://springcloud.cn/view/31


转载:https://blog.csdn.net/inthat/article/details/105237763
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场