Eurake原理简介,及集群环境搭建

什么是Eurake

      简单来说就是一个服务注册与发现的中间组件,解决的问题很明显,通过用实例名称来替换IP,防止服务所在节点的IP变化之后,其它服务无法调用的问题。

      在Eureka的基本架构中主要有以下三种角色

  • Register Service :服务注册中心,它是一个Eureka Server ,提供服务注册和发现的功能。
  • Provider Service :服务提供者,它是一个Eureka Client ,提供服务,同时它也可以是一个服务消费者
  • Consumer Service :服务消费者,它是一个Eureka Cient ,消费服务,同时它也可以是一个服务提供者。

      使用Eurake后,服务间的调用方式发生了一些细微的变化,服务在启动时会向Eureka Server注册自我信息(主要是服务名、IP),当想访问其它服务时,需要先通过服务名从Eurake Server获取对应服务的IP,然后通过IP重新请求。

Eureka相关特性说明

  1. 集群:作为服务注册中心,Eureka Server通常以集群模式部署,集群之间相互注册,以异步的方式互相复制各自的状态,所以也就存在某时间点,节点间数据临时不一致的情况。
  2. 客户端缓存:为了避免每次请求都出现两次网络I/O,Eureka Client客户端通常会缓存一份Eurake Server上的服务列表。Client端在注册自身信息的同时,会启动一个定时任务,该任务每隔30秒从Eureka Server上拉取一次服务列表,更新本地缓存。此外为了保证IP变化能被及时发现,Eureka Client会与Eurake Server保持一定的心跳频率,上报自己最新的信息。
  3. 服务剔除:默认情况下,Eureka Client每隔30秒会向Eureka Server发起一次心跳。如果Eureka Client连续90秒没有向Eureka Server发送心跳,Eureka Server会认为该服务不可用,从而将该服务实例从服务注册列表删除。
  4. 自我保护机制:如果Eureka Server发现某个服务的连接时断时续,它会认为这可能是网络波动,而因为网络的原因剔除了服务是不合适的。为了应对这种情况,Eureka提供了自我保护机制,如果在短时间内丢失太多的节点,节点会进入自我保护模式。进入保护模式Server保护注册表中的信息,不会去删除服务。网络恢复之后会退出保护模式。使用eureka.server.enable-self-preservation= false 可以禁止自我保护模式。

基于Spring Cloud搭建Eureka集群
        集群原理说明:Eureka Server在启动时默认会注册自己成为一个服务,所以Eureka Server也是一个客户端。所以通过配置多个Eureka Server,让他们之间相互注册,就形成了一个集群。当服务提供者向其中一个Eureka注册服务时,这个服务就会被共享到其他Eureka上,这样所有的Eureka都会有相同的服务。
        Step01:由于每一个server即是服务端也是客户端,所以需要同时添加client和server依赖

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

       Step02:先看一下单节点下的配置。

spring:
  application:
    name: peer1
  
server:
  port: 7001
  
eureka:
  #仪表盘相关配置
  environment: local-test
  datacenter: local-cloud
  dashboard:
    path: /dashboard     #仪表盘访问地址
    enabled: true        #默认为true,启用仪表盘
    
  #instance相关配置  
  instance:
      perfer-ip-address: true
      instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
      
  #client相关配置    
  client:                   
    serviceUrl:
      defaultZone: http://localhost:7001/eureka/   # 注册链接
    register-with-eureka: false #是否向Eureka Server注册当前服务,默认为true会注册自己。
    fetch-registry: false       #是否检查其它Eureka Server节点    
    initial-instance-info-replication-interval-seconds: 40  #最初复制实例信息到eureka服务器延迟的时间,默认为40秒
    instance-info-replication-interval-seconds: 30      #复制实例信息到eureka服务器的间隔时间,默认为30秒
    registry-fetch-interval-seconds: 30                 #从eureka服务器获取注册信息的间隔时间,默认为30秒

    集群情况下,只需要修改上面配置的以下地方:

  • 将defaultZone地址指向其它Eureka Server注册中心
  • 将register-with-eureka设置为true(默认就是true,所以可以去掉)
  • 将fetch-registry设置为true  (同上)
  • 如果是单机伪集群模式,需要修改端口号
client:                   
    serviceUrl:
      defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/   # 注册链接 

  类似如下:

  Step03:在启动类上添加@EnableEurekaServer注解,依次启动所有节点。结果如下


Eureka Server的5种事件监听    

  • EurekaInstanceCanceledEvent:服务下线事件
  • EurekaInstanceRegisteredEvent:服务注册事件
  • EurekaInstanceRenewedEvent:服务续约事件
  • EurekaRegistryAvaiableEvent: 注册中心启动事件,该事件会在Eureka Server启动完以后马上发布。
  • EurekaServerStartedEventEureka:服务端启动事件,该事件会在Eureka Server启动完以后马上发布。

  一个简单的监听如下:

@Component
public class EurekaEventListener {

	private final static Logger logger = LoggerFactory.getLogger(EurekaEventListener.class);

    @EventListener
    public void listen(EurekaInstanceCanceledEvent event) {
        logger.warn("---服务{}下线", event.getAppName());
        //...
    }

    @EventListener
    public void listen(EurekaInstanceRegisteredEvent event) {
        InstanceInfo instanceInfo = event.getInstanceInfo();
        logger.info("----服务{}注册", instanceInfo.getAppName() + instanceInfo.getHostName() +"  "+ instanceInfo.getIPAddr() +"  "+ instanceInfo.getPort());
    }

    @EventListener
    public void listen(EurekaInstanceRenewedEvent event) {
        logger.info("---服务{}续约", event.getServerId() +"  "+ event.getAppName());
    }

    @EventListener
    public void listen(EurekaRegistryAvailableEvent event) {
        logger.info("----注册中心启动,{}", System.currentTimeMillis());
    }

    @EventListener
    public void listen(EurekaServerStartedEvent event) {
        logger.info("----注册中心服务端启动,{}", System.currentTimeMillis());
    }
}

   结果如下

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值