⒈Eureka是什么?

  Eureka是Netflix的一个子模块,也是核心模块之一,Eureka是一个基于REST的服务,用于定位服务以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务架构来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符就可以访问到服务,而不需要修改服务调用的配置文件,功能类似于Dubbo的注册中心,例如Zookeeper。

  SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册与发现,Eureka采用了C/S设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka Client连接到Eureka Server并维持心跳连接,这样系统的维护人员就可以通过Eureka Server来监控系统中的各个微服务是否正常运行,SpringCloud的一些其他模块(例如Zuul)就可以通过Eureka Server来发现系统中的其他微服务,并执行相关的逻辑。

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

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

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

⒉Eureka三大角色

  ①Eureka Server  -  提供服务注册与发现

  ②Service Provider(服务提供者)  -  将自身服务注册到Eureka Server,从而使服务消费者能够找到。

  ③Service Consumer(服务消费者)  -  从Eureka Server中获取服务列表,从而能够消费服务。

⒊示例

  请访问我的示例文章地址:https://www.cnblogs.com/fanqisoft/p/10357598.html

⒋一些Eureka配置扩展

  ①修改在Eureka管理界面中的主机名称

 eureka:
instance:
instance-id: #设置主机名称

  ②修改在Eureka管理界面中的主机ip是否显示

 eureka:
instance:
prefer-ip-address: true #主机ip是否显示

  ③修改在Eureka管理界面中的主机info详细信息

    ⅰ添加pom依赖  

         <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

    ⅱ父工程pom文件中添加构建的Build信息(可选)

    ⅲ在配置文件中添加info配置信息

⒌Eureka自我保护

  

  ①导致原因:

  某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。

  ②什么是自我保护模式?

  默认情况下,如果Eureka Server在一定时间内没有收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒),但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,那么以上的行为可能就变得非常危险了,因为这个微服务本身其实是健康的,此时不应该注销这个微服务。

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

  在自我保护模式中,Eureka Server会保护服务注册表中的信息,不会注销任何服务实例,当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式,它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。

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

  在SpringCloud中,可以使用eureka.server.enable-self-preservation=false来禁用自我保护模式(不推荐)。

⒍Eureka服务发现

  ①在服务消费者主程序启动类上添加@EnableDiscoveryClient注解

 package cn.coreqi;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate; @SpringBootApplication
//@EnableDiscoveryClient //开启服务发现功能
@EnableDiscoveryClient //开启服务发现功能
public class SpringbootcloudserviceconsumerApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootcloudserviceconsumerApplication.class, args);
} @Bean
@LoadBalanced //使用负载均衡机制
public RestOperations restTemplate(){
return new RestTemplate();
} }

  ②控制器添加相关代码

 package cn.coreqi.controller;

 import cn.coreqi.entities.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestOperations;
import java.util.List; @RestController
public class UserController {
@Autowired
private RestOperations restTemplate; @Autowired
private DiscoveryClient client; @GetMapping("/userno2")
public String discovery(){
List<String> list = client.getServices();
System.out.println("*****" + list);
List<ServiceInstance> serviceList = client.getInstances("USER-PROVIDER");
for (ServiceInstance item : serviceList){
System.out.println(item.getServiceId() + "\t" + item.getHost() + "\t" + item.getPort() + "\t" + item.getUri());
}
return "success";
} @GetMapping("/userno1")
public User getUsersFirst(){
User[] users = restTemplate.getForObject("http://user-provider/users",User[].class);
return users[0];
}
}

⒎Eureka集群配置

    为了更直观的显示集群效果,做了一下域名关系映射。

    

  ①Eureka Server集群搭建

    Ⅰ新建几个Eureka Server项目(略)

    Ⅱ在这几个Eureka Server项目的主程序启动类上添加@EnableEurekaServer注解(以一个为例)

 package cn.coreqi;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication { public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
} } 

    Ⅲ分别修改它们的配置文件(以两个为例)   

 server:
port: 8761
eureka:
instance:
hostname: eureka-server1 #Eureka服务端实例名称
client:
register-with-eureka: false #是否向注册中心注册自己
fetch-registry: false #是否从Eureka上获取服务的注册信息,自己就是注册中心,本身职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka8762.com:8762/eureka/,http://eureka8763.com:8763/eureka/ #设置与Eureka Server交互的地址(查询服务、注册服务等)
 server:
port: 8762
eureka:
instance:
hostname: eureka-server2 #Eureka服务端实例名称
client:
register-with-eureka: false #是否向注册中心注册自己
fetch-registry: false #是否从Eureka上获取服务的注册信息,自己就是注册中心,本身职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka8761.com:8761/eureka/,http://eureka8763.com:8763/eureka/ #设置与Eureka Server交互的地址(查询服务、注册服务等)

    总结一下不同:

      1.端口不同

      2.eureka.instance.hostname  不可重名

      3.eureka.client.service-url.defaultZone  手牵手模式,把除自己以外的集群内的其它Eureka Server全部配置进来

  ②Eureka Client连接Eureka Server集群

    Ⅰ新建一个Eureka Client项目用作服务提供者(必须引入Web模块,否则注册服务后项目会自动停止)

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

    Ⅱ在主程序启动类上添加@EnableEurekaClient注解

 package cn.coreqi;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication
@EnableEurekaClient
public class ServiceProviderApplication { public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
} }

    Ⅲ修改配置文件

 server:
port: 8001
spring:
application:
name: user-provider
eureka:
instance:
prefer-ip-address: true #注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://eureka8761.com:8761/eureka/,http://eureka8762.com:8762/eureka/,http://eureka8763.com:8763/eureka/

      总结一下:

        1.eureka.client.service-url.defaultZone:将集群内所有的Eureka Server全部配置进来

⒏数据的有关扩展

  传统的关系型数据库(SqlServer、MySQL、Oracle)  =》  ACID

  非关系型数据库(Redis、MongDB)  =》  CAP

  ACID:

    A(Atomicity)原子性:事务中的所有操作要么都成功执行,要么什么都不做。

    C(Consistency)一致性:数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

    I(Isolation)独立性:并发的事务之间不会相互影响。

    D(Durability)持久性:一旦事务提交,它所做的修改将会永久的保存在数据库上,即使宕机也不会丢失。

  CAP:

    C(Consistency)强一致性

    A(Availability)可用性

    P(Partition tolevance)分区容错性

  CAP的3进2原则:即任何一个分布式系统不可能同时满足CAP,只能3选2。

  CA:单点集群,满足一致性、可用性的系统,通常在可扩展性上不太强大。

  CP:满足一致性、分区容忍性的系统,通常性能不是特别高。

  AP:满足可用性、分区容忍性的系统,通常可能对一致性要求低一些。

  因为当前的网络硬件肯定会出现延迟丢包等问题,因此,分布式系统中,分区容忍性(P)是我们必须要实现的,所以我们只能在一致性(CP)和可用性(AP)之间权衡。

  天猫双11保证的是AP原则。

Zookeeper保证CP

  当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接Down掉不可用,也就是说,服务注册功能对可用性的要求要高于一致性,但是Zookeeper会出现这样一种情况,当主节点(master)因为网络故障与其它节点失去联系时,剩余节点将会重新进行主节点的选举,选举的时间太长,一般在30s~120s之间,且选举的过程中整个Zookeeper集群都是不可用的,这就导致了在选举期间Zookeeper的注册服务是瘫痪的。

  在云部署的环境下,因网络问题使得Zookeeper集群失去主节点(master)是较大概率会发生的事情,虽然服务能够最终恢复,但是漫长的选举时间导致注册服务长时间不可用是不能容忍的。

Eureka保证AP

  Eureka在设计时就优先保证了可用性,Eureka各个节点都是平等的,无论多少个节点挂掉都不会影响正常工作的节点,剩余的节点依然可以提供服务注册和查询,而Eureka Client在向某个Eureka Server注册时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka Server还在,就能保证注册服务可用(可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心之间出现了网路故障,此时会出现以下几种情况:

    1.Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。

    2.Eureka仍然能够接收新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)。

    3.当网络稳定时,当前实例新的注册信息会被同步到其它节点中。

  因此,Eureka可以很大的应对因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个注册服务瘫痪。

 

SpringCloud Netflix Eureka(服务注册/发现)的更多相关文章

  1. Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****

    http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...

  2. 微服务学习笔记二:Eureka服务注册发现

    Eureka服务注册发现 服务发现:云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移. 1. Service Discovery: Eureka S ...

  3. SpringCloud:Eureka服务注册与发现

    1.Eureka简介 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper). Eureka 采用了 C-S 的设计架构.Eu ...

  4. 三(1)、springcloud之Eureka服务注册与发现

    1.认识Eureka ​ Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务架 ...

  5. SpringCloud(3)---Eureka服务注册与发现

    Eureka服务注册与发现 一.Eureka概述 1.Eureka特点 (1) Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. (2) Eureka 主管服务 ...

  6. SpringCloud系列——Eureka 服务注册与发现

    前言 Eureka是一种基于REST(具像状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移.本文记录一个简单的服务注册与发现实例. GitHub地址:https:/ ...

  7. java框架之SpringCloud(3)-Eureka服务注册与发现

    在上一章节完成了一个简单的微服务案例,下面就通过在这个案例的基础上集成 Eureka 来学习 Eureka. 介绍 概述 Eureka 是 Netflix 的一个子模块,也是核心模块之一.Eureka ...

  8. SpringCloud之Eureka 服务注册和服务发现基础篇2

    上篇文章讲解了SpringCloud组件和概念介绍,接下来讲解一下SpringCloud组件相关组件使用.原理和每个组件的作用的,它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix ...

  9. SpringCloud之Eureka服务注册与发现(一)

    一 Eureka的基本架构 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper). Eureka 采用了 C-S 的设计架构 ...

  10. 【分布式】SpringCloud(3)--Eureka服务注册与发现

    1.Eureka概述 1.1.什么是Eureka Eureka是Netflix的一个子模块.基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. 只需要使用服务的标识符,就可以访问到 ...

随机推荐

  1. C# string.format用法详解

    String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. Str ...

  2. Zabbix Server 自带模板监控更加灵活MySQL数据库

    Zabbix Server 自带模板监控更加灵活MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.zabbix-agent端配置 1>.修改zabbix的 ...

  3. java socket / No buffer space available

    s https://www.cnblogs.com/yiwangzhibujian/p/7107785.html Socket用在哪呢,主要用在进程间,网络间通信. https://www.cnblo ...

  4. Windows/Linux用户态监控进程启动事件方法

    catalogue . windows wmi监控进程启动 . linux netlink监控进程启动 1. windows wmi监控进程启动 from threading import Threa ...

  5. Presto JVM.config

    Presto 如果启动时候 指定 CMS,那么 launcher run 会提示 G1 回收算法是 推荐的垃圾回收算法,针对 Presto 大内存 回收,G1 暂时 应该是最稳妥的选择,调整之后大约如 ...

  6. Matlab2017A破解版安装详细图文教程(附破解补丁) 64位

    摘录网址:http://www.jb51.net/softjc/543170.html MATLAB2017a安装教程: 1.下载并解压本站提供的MATLAB2017a破解版安装包,载入右键解压或者使 ...

  7. 06-查询操作(DQL)-单表查询

    一. 综述   查询操作主要从两个方面来说:单表查询和多表查询. 单表查询包括:简单查询.过滤查询.结果排序.分页查询.聚集函数. 二 . 案例设计   1. 设计产品表(product).包括:主键 ...

  8. Elasticsearch入门实践

    官网:https://www.elastic.co/ 下载:https://www.elastic.co/downloads/elasticsearch 文档:https://www.elastic. ...

  9. 我的长大app开发教程第三弹:实现四个子页面绑定RadioButton

    在开始之前先上一张图 在上一节中我们实现了底部Button,这一弹我们要实现点击四个按钮分别切换到不同页面,我们可以把页面分为两部分,顶部栏和中间内容部分,我们可以通过线性布局包裹两部分内容,顶部栏又 ...

  10. Mac OS X 启用超级用户 sudo -s 获得系统权限 Mac终端命令

    为了防止误操作破坏系统,用户状态下时没有权限操作系统重要文件, 所以先要取得root权限:“sudo -s” 详见:https://www.jianshu.com/p/138b98e662ed