Eureka服务注册与发现

Eureka基础知识

服务治理

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

服务注册与发现?

Eureka采用了CS的设计架构,

Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前服务器的信息 比如 服务器通讯地址等以别名方式注册到注册中心上,获取到实际的服务器通讯地址,然后再实现本地RPC调用。

RPC远程调用框架核心设计思想;在于注册中心,因为使用每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC框架中都会有一个注册中心(存放服务地址相关信息(接口地址))

在这里插入图片描述

Eureka的两个组件?

Eureka ServerEureka Client

Eureka Server:

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

Eureka Client:

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

启动类中
Eureka Server使用 @EnableEurekaServer注解
Eureka Client使用 @EnableEurekaClient注解

单机版Eureka实操

将cloud-eureka-server7001作为Eureka Server(服务注册中心)

在这里插入图片描述

引入Eureka Server的pom依赖

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

启动类添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {

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

application.yml

server:
  port: 7001


eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      #defaultZone: http://eureka7002.com:7002/eureka/
      #单机就是7001自己
      defaultZone: http://eureka7001.com:7001/eureka/

配置服务注册与发现的相关属性?

  1. register-with-eureka表示是否将自己注册到Eureka Server,默认为true。由于当前这个应用就是Eureka Server,故而设为false。
  2. fetch-registry表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。
  3. service-url.defaultZone设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔单机就是自己的地址,集群指向其它eureka
  4. 若在本地配置了host(127.0.0.1 discovery)则地址为http://discovery:8761/eureka

访问

http://localhost:7001/

在这里插入图片描述

将cloud-provoder-payment8001注册进Eureka Server成为服务提供者provoder

引入Eureka Client的pom依赖

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

启动类添加@EnableEurekaClient注解

@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {

    public static void main(String[] args){

        SpringApplication.run(PaymentMain8001.class, args);
    }
}

application.yml中注册、配置Eureka Server地址

eureka:
  client:
    register-with-eureka: true  #向注册中心注册自己。
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka      #注册中心地址

启动后,发现成功注册
在这里插入图片描述

将cloud-consumer-order80注册进Eureka Server成为服务消费者consumer

步骤同上,consumer和provider都是属于Eureka Client

引入Eureka Client的pom依赖

启动类添加@EnableEurekaClient注解

application.yml中注册、配置Eureka Server地址

启动,访问
在这里插入图片描述

集群版Eureka实操

为什么要用Eureka集群?

为了实现微服务RPC远程服务调用的核心高可用

Eureka集群原理?

在这里插入图片描述
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错

集群注册Eureka的原则?

相互注册 相互守望
在这里插入图片描述

将cloud-eureka-server7001和 cloud-eureka-server7002作为Eureka Server(服务注册中心)

只需要变更application.yml,其他和单机版相同

cloud-eureka-server7001的application.yml

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      defaultZone: http://eureka7002.com:7002/eureka/
 

cloud-eureka-server7002的application.yml

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      defaultZone: http://eureka7001.com:7001/eureka/

启动后
在这里插入图片描述

在这里插入图片描述
配置了
在这里插入图片描述

http://eureka7002.com:7002/
在这里插入图片描述

将8001和80注册到Eureka

8001和80的application.yml

eureka:
  client:
    register-with-eureka: true  #向注册中心注册自己。
    fetchRegistry: true
    service-url:
      # defaultZone: http://localhost:7001/eureka      #注册中心地址  单机版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版

启动后
在这里插入图片描述
在这里插入图片描述

actuator微服务信息完善

服务名称修改和可看到ip

之前是这样的
在这里插入图片描述

修改application.yml

instance:
    instance-id: payment8001   #服务名
    prefer-ip-address: true     #显示ip

完整

eureka:
  client:
    register-with-eureka: true  #向注册中心注册自己。
    fetchRegistry: true
    service-url:
      # defaultZone: http://localhost:7001/eureka       #注册中心地址  单机版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
  instance:
   instance-id: payment8001   #服务名
   prefer-ip-address: true    #显示ip

修改后
在这里插入图片描述
在这里插入图片描述

服务发现Discovery

对于注册进Eureka的服务可以通过服务发现来获取该服务的信息

Eureka的自我保护机制?

eureka虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉。
默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒)。但是,短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,此时eureka不会删除实例,但是会出现红色警告

EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE。

Eureka自我保护机制的目的是避免网络连接故障。因为微服务只有在启动的时候才会发起注册请求,后面只会发送心跳和服务列表请求,这样的话在发生网络故障时,微服务和注册中心之间无法正常通信,此时eureka如果把微服务误删了,即使网络恢复了,该微服务也不会重新注册到eureka server了。在自我保护模式下eureka会保护注册表中的信息,不在注销任何微服务,当网络故障恢复后,eureka会自动退出保护模式。自我保护模式可以让集群更加健壮。

开发测试阶段,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例。所以,在开发测试阶段一般把自我保护模式关闭。生产环境需要把自我保护机制打开,否则网络一旦出现网络连接故障,就无法恢复。

eureka server自我保护机制的开启与关闭?

enable-self-preservation 是否开启保护模式 测试时,需要关闭,线上打开

eureka:
  server:
   #是否开启保护模式 测试时,需要关闭,线上打开
    enable-self-preservation: false
    #续期时间,即eureka server扫描失效服务的间隔时间默认60000毫秒,即60秒
    eviction-interval-timer-in-ms: 5000

eureka client设置心跳时间和删除实例时间?

lease-renewal-interval-in-seconds
表示客户端向服务器发送心跳的频率,缺省为30s

lease-expiration-duration-in-seconds
表示服务器在收到最后一次心跳之后等待的持续时间,然后才能从其注册表中删除实例。缺省为90s

lease [liːs] n. (房屋、设备或土地的)租约,租契;

expiration [ekspəˈreɪʃn] n. 期满; 截止; 告终;

eureka:
  instance:
    lease-renewal-interval-in-seconds: 5      # 心跳时间,即服务续约间隔时间(缺省为30s)
    lease-expiration-duration-in-seconds: 10  # 发呆时间,即服务续约到期时间(缺省为90s)
  client:
    healthcheck:
      enabled: true                           # 开启健康检查(依赖spring-boot-starter-actuator)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值