文档章节

服务注册与发现之Eureka

代码搬运工---
 代码搬运工---
发布于 2017/04/07 13:38
字数 1368
阅读 489
收藏 3
点赞 0
评论 0

服务注册发现-Eureka

    

•基于 REST 的服务,它主要是用于定位服务,以实现 AWS 云端的负载均衡和中间层服务器的故障转移。如果你希望实现一个 AP( Availability and Partition ) 系统, Eureka 是一个很好的选择,并在 Netflix 得到了实战的检验。在出现网络分区时, Eureka 选择可用性,而不是一致性

•默认情况下每个Eureka服务端也是一个Eureka客户端并且通过请求服务的URL去定位一个节点。如果你不提供的话,服务虽然还会运行和工作,但是它不会向你打印一堆关于没有注册的节点日志。

•当一个客户端注册到Eureka,它提供关于自己的元数据(诸如主机和端口,健康指标URL,首页等)之后每 30 秒钟发送心跳以更新自身状态。如果该客户端没能发送心跳更新,它将在 90 秒之后被其注册的 Eureka 服务器剔除。来自任意 zone 的 Application Client 可以查看这些注册信息(每隔 30 秒查看一次)并依此定位自己的依赖应用实例,进而进行远程调用。

Eureka Server 配置

POM

Application

@SpringBootApplication
@EnableEurekaServer
public class RegistryApplication extends SpringBootServletInitializer {

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

}

这段很简单启动EurekaServer,就不废话
bootstrap.properties

#系统
spring.application.name=registry
server.port=7070
server.context-path=/
server.uri-encoding=utf-8
management.context-path=/management
info.app.name=${spring.application.name}
info.app.profiles=${spring.profiles.active}
info.app.version=@project.version@
#仅供本地访问
management.address=127.0.0.1
spring.profiles.active=@env@

 

application.properties

#eureka 服务端
#本机是否注册服务
eureka.client.registerWithEureka=false
#启动时是否检测注册客户端
eureka.client.fetchRegistry=false
#启用Ip注册
eureka.instance.perferIpAddress=true
#剔除无效实例频率默认60S
eureka.server.evictionIntervalTimerInMs=10000
#注册服务地址
eureka.client.serviceUrl.defaultZone=http://localhost:7070/eureka/
eureka.instance.metadataMap.management.context-path=${management.context-path}

 

Eureka Client  

@EnableEurekaClient启动客户端

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
eureka.client.serviceUrl.defaultZone=http://localhost:7070/eureka/
#启用Ip注册
eureka.instance.preferIpAddress=true
#续约心跳时间 默认三十秒
eureka.instance.leaseRenewalIntervalInSeconds=10
#续约时效时间
eureka.instance.leaseExpirationDurationInSeconds=90
#状态页面
eureka.instance.statusPageUrlPath=${management.context-path}/info
#健康检查页面
eureka.instance.healthCheckUrlPath=${management.context-path}/health
#turbine配置
eureka.instance.metadataMap.cluster=MAIN
eureka.instance.metadataMap.management.context-path=${management.context-path}

默认使用hostname注册

可根据eureka.instance.preferIpAddress=true更改为IP

未设置ipaddr或hostname,默认会从hostInfo获取ipAddr 或 hostname

instanceId 默认值为hostname/ipAddr-application.name-port 可自定义修改

instanceId ,hostname,ipaddr 不建议设置,可采用默认

leaseRenewalIntervalInSeconds 默认是30秒,也就是每30秒会向Eureka Server发起Renew(续约)操作

 基本流程

        客户端

                在com.netflix.discovery.DiscoveryClient启动的时候,将本地配置信息注册到注册中心,初始化定时任务,定时调用renew,定时刷新本地缓存(注册中心其他服务信息默认三十秒)

  服务端 

            Eviction(失效服务剔除)用来定期(默认为每60秒)在Eureka Server检测失效的服务,检测标准就是超过一定时间没有Renew的服务。
    默认失效时间为90秒,也就是如果有服务超过90秒没有向Eureka Server发起Renew请求的话,就会被当做失效服务剔除掉。

   服务端有自我保护机制,会在心跳总量无法维持到某一个阈值时触发,触发的结果就是evict过期instance的任务不再驱逐任何实例。这个阈值的单位是分钟,计算方式是当前所有保存的instance,按照每分钟应该提交2次心跳(30秒心跳),再乘以可以配置的最低能容纳的半分比;   
    自我保护机制的目的是为了所在服务发生严重的网络分区时,依旧能够提供可用性,但为什么要根据心跳作为依据?通过上面的分析我们知道eureka server集群本身是基于http的,无法维持一个持久的状态,在整个系统的网络通信中,在client到server, peer到peer之间,心跳信息应该远大于其他信息的传输量。那虽然peer之间并不根据彼此的心跳(自身也是client)做什么逻辑判断,但其下的client的心跳复制数据本身也足够作为判断分区的依据了。而在一个稳定理想的集群中,心跳的信息绝大多数应该是其他peer复制过来的,如果达到一定阈值,更多的可能性不是server和client发生分区,而是peer和peer之间发生分区,但本身client并没有真的down掉。所以才有这种自我保护的触发机制—— 更高的概率是client可用,该机制通过配置可以关闭 eureka.server.enableSelfPreservation=false

public void evict(long additionalLeaseMs) {
        logger.debug("Running the evict task");

        if (!isLeaseExpirationEnabled()) {
            logger.debug("DS: lease expiration is currently disabled.");
            return;
        }

        // We collect first all expired items, to evict them in random order. For large eviction sets,
        // if we do not that, we might wipe out whole apps before self preservation kicks in. By randomizing it,
        // the impact should be evenly distributed across all applications.
        List<Lease<InstanceInfo>> expiredLeases = new ArrayList<>();
        for (Entry<String, Map<String, Lease<InstanceInfo>>> groupEntry : registry.entrySet()) {
            Map<String, Lease<InstanceInfo>> leaseMap = groupEntry.getValue();
            if (leaseMap != null) {
                for (Entry<String, Lease<InstanceInfo>> leaseEntry : leaseMap.entrySet()) {
                    Lease<InstanceInfo> lease = leaseEntry.getValue();
                    if (lease.isExpired(additionalLeaseMs) && lease.getHolder() != null) {
                        expiredLeases.add(lease);
                    }
                }
            }
        }
--- 此处判断是否开启 isSelfPreservationModeEnable()
 @Override
    public boolean isLeaseExpirationEnabled() {
        if (!isSelfPreservationModeEnabled()) {
            // The self preservation mode is disabled, hence allowing the instances to expire.
            return true;
        }
        return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;
    }

 

服务集群数据同步

PeerEurekaNodes 类中可以发现有个定时任务具体做什么updatePeerEurekaNodes(...) 更新 peer Eureka Nodes

try {
            updatePeerEurekaNodes(resolvePeerUrls());
            Runnable peersUpdateTask = new Runnable() {
                @Override
                public void run() {
                    try {
                        updatePeerEurekaNodes(resolvePeerUrls());
                    } catch (Throwable e) {
                        logger.error("Cannot update the replica Nodes", e);
                    }

                }
            };
            taskExecutor.scheduleWithFixedDelay(
                    peersUpdateTask,
                    serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
                    serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
                    TimeUnit.MILLISECONDS
            );
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }

源码github https://github.com/zhaoqilong3031/SpringCloud/tree/master/spring-cloud-zuul

© 著作权归作者所有

共有 人打赏支持
代码搬运工---
粉丝 8
博文 7
码字总数 7389
作品 0
杭州
程序员
Spring Cloud(服务发现Eureka)

服务发现 服务发现机制是为了解决硬网络编码问题,服务消费者使用这种机制获取服务提供者网络信息,当微服务网络地址发生变更(例如IP或端口),会重新注册到服务发现组件,而服务消费者就无...

林塬 ⋅ 2017/12/16 ⋅ 0

SpringCloud-Eureka服务注册与发现组件

Eureka和Zookeeper很类似,它是SpringCloud框架中的服务注册及发现组件。所有的微服务在使用过程中会向Eureka进行注册,而后客户端利用Eureka获取服务的信息(即服务的发现)。虽然SpringClo...

Coding小聪 ⋅ 05/25 ⋅ 0

深入理解Eureka之源码解析

转载请标明出处: http://blog.csdn.net/forezp/article/details/73017664 本文出自方志朋的博客 Eureka的一些概念 Register:服务注册 当Eureka客户端向Eureka Server注册时,它提供自身的元...

forezp ⋅ 2017/06/11 ⋅ 0

[微服务系列] 2. 服务治理--Eureka

一、服务治理 所谓服务治理就是用来实现各个微服务实例的自动化注册于发现。当多个微服务互相调用时,就需要维护一个静态的配置文件,来说明各自所承担的服务内容、地址、端口等信息,其他服...

Xiangdong_She ⋅ 2017/11/10 ⋅ 0

史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心

转载请标明出处: http://blog.csdn.net/forezp/article/details/70183572 本文出自方志朋的博客 文章 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka) 介绍了服务注册...

forezp ⋅ 2017/04/15 ⋅ 0

史上最简单的 SpringCloud 教程 (一)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环...

xiaogong1688 ⋅ 2017/09/15 ⋅ 0

SpringCloud微服务实战(三)-服务注册与发现

注册中心Eureka Server 使用 就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka Server,让你可以嵌入到应用中直接使用 直接运行成功如下...

紫霞等了至尊宝五百年 ⋅ 06/10 ⋅ 0

002,eureka简介和 eureka Service

1,eureka 是Netflix开发的服务发现框架,本身是一个 基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到 负载均衡 和 中间层服务故障转移的目的。spring cloud将其 集成在 子项...

岸芷汀兰 ⋅ 2016/12/25 ⋅ 0

Spring Cloud 接入 EDAS 之服务发现篇

目前 EDAS 已经完全支持 Spring Cloud 应用的部署了,您可以直接将 Spring Cloud 应用部署到 EDAS 中。 同时,为了更好地将阿里中间件的功能以云服务的方式提供给大家,我们也对 Spring Clo...

flystar32 ⋅ 2017/11/17 ⋅ 0

SpringCloud(二):注册中心Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。 背景介绍 服务中心 服务中心...

MyMineBug ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 11分钟前 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 14分钟前 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 15分钟前 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 17分钟前 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 25分钟前 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 53分钟前 ⋅ 0

彻底删除Microsoft Office的方法

参照此链接彻底删除Office https://support.office.com/zh-cn/article/%e4%bb%8e-pc-%e5%8d%b8%e8%bd%bd-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=zh-CN&rs=zh-CN&ad=CN......

Kampfer ⋅ 今天 ⋅ 0

大盘与个股之间关系

大盘走多:积极出手 顺势加码 大盘走空: 少量出手 退场观望 大盘做头:逆势减码 少量操作 大盘做底 : 小量建仓 小量试单

guozenhua ⋅ 今天 ⋅ 0

Day16 LVM(逻辑卷管理)与磁盘故障小案例

lvm详解 简述 LVM的产生是因为传统的分区一旦分区好后就无法在线扩充空间,也存在一些工具能实现在线扩充空间但是还是会面临数据损坏的风险;传统的分区当分区空间不足时,一般的解决办法是再...

杉下 ⋅ 今天 ⋅ 0

rsync实现多台linux服务器的文件同步

一、首先安装rsync,怎样安装都行,rpm,yum,还是你用源码安装都可以。因为我用的是阿里云的ESC,yum install rsync就ok了。 二、配置rsync服务 1.先建立个同步数据的帐号 123 groupadd r...

在下头真的很硬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部