Eureka 两大组件

Eureka Server:提供服务注册服务

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

Eureka Client:通过服务注册中心访问

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

Eureka Server 搭建

只列出重要部分,详细代码可在 此处 获取 ~

1、在「注册中心服务」导入 Maven 依赖

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

2、编写配置文件

server:
port: 7001
eureka:
instance:
# eureka服务端的实例名称
hostname: localhost
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖此地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3、在主启动类开启 Eureka 服务注册功能

@SpringBootApplication
@EnableEurekaServer //开启服务注册功能
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}

4、打开浏览器输入:http://localhost:7001/,成功进入 Eureka 服务面板即基本配置已完成

Eureka Client 注册

1、在「服务提供者」添加客户端的 Maven 依赖

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

2、添加配置

eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka # 注册中心的地址

3、在主启动类开启 Eureka 服务端

@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class);
}
}

4、进入注册面板即可发现服务已注册进来

5、再按照上面的方式,将「服务消费者」注册进来,自此为止,我们搭建了一个简单的单机版 Eureka 环境。

单机版 Eureka 的问题

微服务 RPC 远程服务调用最核心的是什么?

高可用 !试想,如果你的注册中心只有一个,它出故障会导致整个微服务环境不可用,所以我们可以通过搭建 Eureka 注册中心集群,实现负载均衡 + 故障容错。

Eureka 集群原理说明:

搭建 Eureka 集群

1、为了模拟集群,我们需要修改 host 文件

# SpringCloud Eureka 集群配置
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

2、新建一个项目当作 Eureka 服务注册中心,配置文件如下

server:
port: 7002 eureka:
instance:
# eureka服务端的实例名称
hostname: eureka7002.com
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖此地址
service-url:
defaultZone: http://eureka7001.com:7001/eureka/

3、并修改上一个项目的配置,完成两个注册中心之间的相互注册

server:
port: 7001 eureka:
instance:
# eureka服务端的实例名称
hostname: eureka7001.com
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖此地址
service-url:
defaultZone: http://eureka7002.com:7002/eureka/

4、访问:http://eureka7001.com:7001/http://eureka7002.com:7002/

5、由于现在有了俩个注册中心,我们需要将之前的defaultZone换为如下配置,重新启动后可看见两个注册中心中都有了其他服务

defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

6、再新建一个服务提供者,可以直接拷贝前面的代码,启动服务、刷新注册中心,现在就有了两个服务提供者

7、此时使用服务消费者不断调用提供者,是以 轮询 的负载均衡方式调用

8、可以通过如下配置「服务名称」和「访问信息提示IP地址」

eureka:
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示ip地址

前提是你引入了 actuator

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

服务发现 Discovery

1、注入 DiscoveryClient

@Autowired
private DiscoveryClient discoveryClient;

2、获取服务信息

@GetMapping("/payment/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("service:" + service);
} List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info("serviceId:" + instance.getServiceId() + "\t" + "Host:" + instance.getHost() + "\t" + "port:" + instance.getPort() + "\t" + "uri:" + instance.getUri());
} return this.discoveryClient;
}

3、在主启动类上添加@EnableDiscoveryClient,开启服务发现

Eureka 自我保护

在 Eureka 注册中心的页面会看到这样的提示,说明 Eureka 进入了保护模式

保护模式主要用于一组客户端和 Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server 将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

简单来说就是:某时刻某个微服务不可用了,Eureka 不会立即清理,依然会对该微服务的信息进行保存;属于 CAP 理论中的 AP 分支

为什么会产生Eureka自我保护机制?

为了防止 EurekaClient 可以正常运行,但是与 EurekaServer 网络不通情况下,EurekaServer 不会立刻 将EurekaClient 服务剔除

什么是自我保护模式?

默认情况下,如果 EurekaServer 在一定时间内没有接收到某个微服务实例的心跳,EurekaServer 将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、 拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了 —— 因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过「自我保护模式」来解决这个问题 —— 当 EurekaServer 节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。

在自我保护模式中,EurekaServer 会保护服务注册表中的信息,不再注销任何服务实例。

它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着I

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

如何禁用自我保护模式

在注册中心服务配置中加入以下内容

eureka:
server:
# 关闭自我保护机制,保证不可用服务及时被剔除
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000

刷新注册中心页面可以看到,提示内容已经变了,自我保护模式已关闭

在其它服务配置中加入以下内容

eureka:
instance:
# Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
lease-expiration-duration-in-seconds: 2

正常启动服务后,服务出现在注册中心列表,当我们关闭服务再查看列表,可以看到服务在 2s 内直接被剔除了

Eureka2.0 停更声明

这是 Eureka 官方的声明

虽然它停止更新了,现在有了更好的替代品,但其思想是相通的,停更不停用,依然值得我们学习。

SpringCloud-服务注册中心「Eureka」的介绍与使用的更多相关文章

  1. SpringCloud服务注册中心

    SpringCloud服务注册中心 Spring Cloud 是一系列框架的有序集合,如服务注册发现.配置中心.消息总线.负载均衡.断路器等,都可以用 Spring Boot 的开发风格做到一键启动和 ...

  2. Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼

    Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...

  3. springboot+cloud 学习(一)高可用服务注册中心(Eureka)

    先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...

  4. 服务注册中心:Eureka

    第一章 注册中心介绍 1.1.什么是注册中心 注册中心可以说是微服务架构中的"通讯录",它记录了服务和服务地址的映射关系.在分布式系统中,服务会注册到这里,当服务需要调用其它服务时 ...

  5. 服务注册中心之Eureka使用

    一.Eureka基础 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCl ...

  6. Spring Cloud-服务的注册与发现之服务注册中心(Eureka Server)

    Spring cloud是为了什么产生的? 根据官网的这个介绍来看,我们可以知道,Spring cloud是为开发者提供的一个工具,而使用这个工具的产生就是为了帮助开发者快速的开发一套比较通用的分布式 ...

  7. 作为服务注册中心,Eureka比Zookeeper好在哪里

    CAP是Consistency.Availablity和Partition Tolerance的缩写.一般的分布式系统最多满足其中两条.而Partition Tolerance是分布式系统的关键,因此 ...

  8. springcloud~服务注册与发现Eureka的使用

    服务注册与发现是微服务里的概念,也是一个基本的组件,负责服务组件的认证,即实现『你是谁』的功能,在服务注册与发现里,存在两种模式,即服务端发现和客户端发现,咱们今天说的eureka属于客户端发现! 下 ...

  9. 服务注册中心,Eureka比Zookeeper好在哪里?

    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性).和P(分区容错性).由于分区容错性P在分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡. 因此: Zookeep ...

随机推荐

  1. 题解 P4325 【[COCI2006-2007#1] Modulo】

    第\(1\)种方法 也是最暴力的一种 我们熟知,\(c++\)中的\(set\)可以既去重,有排序,这题,我们可以用set来搞,虽然我们不需要排序的功能,但毕竟方便,一共是\(10\)个数,所以暴力一 ...

  2. 收藏 | 15 个你非了解不可的 Linux 特殊字符,妈妈再也不用担心我看不懂这些符号了!

    不知道大家接触 Linux 系统有多久了,可曾了解过 Linux 中有哪些特殊的字符呢?其实啊,那些特殊字符都大有用处呢,今天的文章就给大家简单地科普一下 Linux 中你需要了解的 15 个特殊字符 ...

  3. Java 泛型数组问题

    Java中不支持泛型数组, 以下代码会编译报错:generic array creation ArrayList<Integer>[] listArr = new ArrayList< ...

  4. Springcloud zuul 实现API 网关

    1,https://github.com/Netflix/zuul zuul 网关文档 2,什么是网关 网关就是客户端进行访问的时候,先经过网关服务器,再由网关服务器进行转发到真实的服务器.类似于Ng ...

  5. NSObject常用方法

    类 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } // 初始化加载 + (void)load; / ...

  6. iOS Hook

    HOOK 译为"钩子"或挂钩.在 iOS 逆向中指改变程序运行流程的一种技术. iOS 中 hook 技术的几种方式 Method Swizzle 利用 OC 的 Runtime ...

  7. Spring中应用的那些设计模式

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,我们就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念 ...

  8. 树莓派 zeroWH 使用笔记

    更新raspbian    apt-get update    apt-get upgrade 删除python2    sudo rm /usr/bin/python安装python3    sud ...

  9. [codevs2370]小机房的树<LCA>

    题目链接:http://codevs.cn/problem/2370/ 这题我还是做了比较久了,因为有人告诉我这是用tarjan离线做 好吧算我是蒟蒻,真心不懂tarjan怎么做,最后还是用倍增做的 ...

  10. [vijos1782]借教室<线段树>

      题目链接:https://vijos.org/p/1782 题意:一个区间1,n.m次操作,每次操作让l,r区间值减去d,当有任何一个值小于0就输出当前是第几个操作 这道题其实是没有什么难度的,是 ...